http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/b086e005/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/exception/AddressNotFoundException.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/exception/AddressNotFoundException.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/exception/AddressNotFoundException.java new file mode 100644 index 0000000..9935192 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/exception/AddressNotFoundException.java @@ -0,0 +1,34 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.address.exception; + +import org.apache.fineract.infrastructure.core.exception.AbstractPlatformResourceNotFoundException; + +public class AddressNotFoundException extends AbstractPlatformResourceNotFoundException { + + public AddressNotFoundException(final long clientId) { + super("error.msg.address.client.Identifier.not.found", + "Client with client ID `" + clientId + "` is not mapped with any address", clientId); + } + + public AddressNotFoundException(final long clientId, final long addressTypeId) { + super("error.msg.address.client.addresstype.not.found", + "Client with client ID`" + clientId + "` does not have address" + " type with id", addressTypeId); + } +}
http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/b086e005/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/serialization/AddressCommandFromApiJsonDeserializer.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/serialization/AddressCommandFromApiJsonDeserializer.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/serialization/AddressCommandFromApiJsonDeserializer.java new file mode 100644 index 0000000..dd054e1 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/serialization/AddressCommandFromApiJsonDeserializer.java @@ -0,0 +1,272 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.address.serialization; + +import java.lang.reflect.Type; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.commons.lang.StringUtils; +import org.apache.fineract.infrastructure.core.data.ApiParameterError; +import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder; +import org.apache.fineract.infrastructure.core.exception.InvalidJsonException; +import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException; +import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper; +import org.apache.fineract.portfolio.address.data.FieldConfigurationData; +import org.apache.fineract.portfolio.address.service.FieldConfigurationReadPlatformService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.google.gson.JsonElement; +import com.google.gson.reflect.TypeToken; + +@Component +public class AddressCommandFromApiJsonDeserializer { + private final FromJsonHelper fromApiJsonHelper; + private final FieldConfigurationReadPlatformService readservice; + + @Autowired + public AddressCommandFromApiJsonDeserializer(final FromJsonHelper fromApiJsonHelper, + final FieldConfigurationReadPlatformService readservice) { + this.fromApiJsonHelper = fromApiJsonHelper; + this.readservice = readservice; + } + + public void validateForUpdate(final String json) { + validate(json, false); + } + + public void validateForCreate(final String json, final boolean fromNewClient) { + validate(json, fromNewClient); + } + + public void validate(final String json, final boolean fromNewClient) { + if (StringUtils.isBlank(json)) { + throw new InvalidJsonException(); + } + + final Type typeOfMap = new TypeToken<Map<String, Object>>() { + }.getType(); + + final List<ApiParameterError> dataValidationErrors = new ArrayList<>(); + final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors) + .resource("Address"); + + final JsonElement element = this.fromApiJsonHelper.parse(json); + Set<String> supportedParameters = new HashSet<>(); + + final List<FieldConfigurationData> configurationData = new ArrayList<>( + this.readservice.retrieveFieldConfigurationList("ADDRESS")); + final List<String> enabledFieldList = new ArrayList<>(); + + final Map<String, Boolean> madatoryFieldsMap = new HashMap<String, Boolean>(); + final Map<String, Boolean> enabledFieldsMap = new HashMap<String, Boolean>(); + final Map<String, String> regexFieldsMap = new HashMap<String, String>(); + + // validate the json fields from the configuration data fields + + for (final FieldConfigurationData data : configurationData) { + madatoryFieldsMap.put(data.getField(), data.isIs_mandatory()); + enabledFieldsMap.put(data.getField(), data.isIs_enabled()); + regexFieldsMap.put(data.getField(), data.getValidation_regex()); + if (data.isIs_enabled()) { + enabledFieldList.add(data.getField()); + } + } + if (fromNewClient) { + + enabledFieldList.add("addressTypeId"); + enabledFieldList.add("locale"); + enabledFieldList.add("dateFormat"); + supportedParameters = new HashSet<>(enabledFieldList); + // enabledFieldList.add("address"); + + madatoryFieldsMap.put("addressTypeId", true); + + } + if (!fromNewClient) { + enabledFieldList.add("locale"); + enabledFieldList.add("dateFormat"); + enabledFieldList.add("addressId"); + madatoryFieldsMap.put("addressId", true); + supportedParameters = new HashSet<>(enabledFieldList); + } + // final Set<String> supportedParameters = new + // HashSet<>(enabledFieldList); + this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, supportedParameters); + + final String street = this.fromApiJsonHelper.extractStringNamed("street", element); + + if (enabledFieldsMap.get("street")) { + if (madatoryFieldsMap.get("street") && fromNewClient) { + + baseDataValidator.reset().parameter("street").value(street).notBlank(); + + } + if (!regexFieldsMap.get("street").isEmpty()) { + baseDataValidator.reset().parameter("street").value(street) + .matchesRegularExpression(regexFieldsMap.get("street")); + } + + } + final String addressLine1 = this.fromApiJsonHelper.extractStringNamed("addressLine1", element); + if (enabledFieldsMap.get("addressLine1")) { + if (madatoryFieldsMap.get("addressLine1") && fromNewClient) { + baseDataValidator.reset().parameter("addressLine1").value(addressLine1).notBlank(); + } + if (!regexFieldsMap.get("addressLine1").isEmpty()) { + baseDataValidator.reset().parameter("addressLine1").value(addressLine1) + .matchesRegularExpression(regexFieldsMap.get("addressLine1")); + } + + } + final String addressLine2 = this.fromApiJsonHelper.extractStringNamed("addressLine2", element); + if (enabledFieldsMap.get("addressLine2")) { + if (madatoryFieldsMap.get("addressLine2") && fromNewClient) { + baseDataValidator.reset().parameter("addressLine2").value(addressLine2).notBlank(); + } + if (!regexFieldsMap.get("addressLine2").isEmpty()) { + baseDataValidator.reset().parameter("addressLine2").value(addressLine2) + .matchesRegularExpression(regexFieldsMap.get("addressLine2")); + } + } + final String addressLine3 = this.fromApiJsonHelper.extractStringNamed("addressLine3", element); + if (enabledFieldsMap.get("addressLine3")) { + if (madatoryFieldsMap.get("addressLine3") && fromNewClient) { + baseDataValidator.reset().parameter("addressLine3").value(addressLine3).notBlank(); + } + if (!regexFieldsMap.get("addressLine3").isEmpty()) { + baseDataValidator.reset().parameter("addressLine3").value(addressLine3) + .matchesRegularExpression(regexFieldsMap.get("addressLine3")); + } + } + final String townVillage = this.fromApiJsonHelper.extractStringNamed("townVillage", element); + if (enabledFieldsMap.get("townVillage")) { + if (madatoryFieldsMap.get("townVillage") && fromNewClient) { + baseDataValidator.reset().parameter("townVillage").value(townVillage).notBlank(); + } + if (!regexFieldsMap.get("townVillage").isEmpty()) { + baseDataValidator.reset().parameter("townVillage").value(townVillage) + .matchesRegularExpression(regexFieldsMap.get("townVillage")); + } + } + final String city = this.fromApiJsonHelper.extractStringNamed("city", element); + + if (enabledFieldsMap.get("city")) { + if (madatoryFieldsMap.get("city") && fromNewClient) { + baseDataValidator.reset().parameter("city").value(city).notBlank(); + } + if (!regexFieldsMap.get("city").isEmpty()) { + baseDataValidator.reset().parameter("city").value(city) + .matchesRegularExpression(regexFieldsMap.get("city")); + } + } + final String countyDistrict = this.fromApiJsonHelper.extractStringNamed("countyDistrict", element); + if (enabledFieldsMap.get("countyDistrict")) { + if (madatoryFieldsMap.get("countyDistrict") && fromNewClient) { + baseDataValidator.reset().parameter("countyDistrict").value(countyDistrict).notBlank(); + } + if (!regexFieldsMap.get("countyDistrict").isEmpty()) { + baseDataValidator.reset().parameter("countyDistrict").value(countyDistrict) + .matchesRegularExpression(regexFieldsMap.get("countyDistrict")); + } + } + + if (this.fromApiJsonHelper.extractLongNamed("stateProvinceId", element) != null) { + + final long stateProvinceId = this.fromApiJsonHelper.extractLongNamed("stateProvinceId", element); + if (enabledFieldsMap.get("stateProvinceId")) { + if (madatoryFieldsMap.get("stateProvinceId") && fromNewClient) { + baseDataValidator.reset().parameter("stateProvinceId").value(stateProvinceId).notBlank(); + } + if (!regexFieldsMap.get("stateProvinceId").isEmpty()) { + baseDataValidator.reset().parameter("stateProvinceId").value(stateProvinceId) + .matchesRegularExpression(regexFieldsMap.get("stateProvinceId")); + } + } + } + + if (this.fromApiJsonHelper.extractLongNamed("countryId", element) != null) { + final long countryId = this.fromApiJsonHelper.extractLongNamed("countryId", element); + if (enabledFieldsMap.get("countryId")) { + if (madatoryFieldsMap.get("countryId") && fromNewClient) { + baseDataValidator.reset().parameter("countryId").value(countryId).notBlank(); + } + if (!regexFieldsMap.get("countryId").isEmpty()) { + baseDataValidator.reset().parameter("countryId").value(countryId) + .matchesRegularExpression(regexFieldsMap.get("countryId")); + } + } + } + + final String postalCode = this.fromApiJsonHelper.extractStringNamed("postalCode", element); + if (enabledFieldsMap.get("postalCode")) { + if (madatoryFieldsMap.get("postalCode") && fromNewClient) { + baseDataValidator.reset().parameter("postalCode").value(postalCode).notBlank(); + } + if (!regexFieldsMap.get("postalCode").isEmpty()) { + baseDataValidator.reset().parameter("postalCode").value(postalCode) + .matchesRegularExpression(regexFieldsMap.get("postalCode")); + } + } + + if (this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("latitude", element) != null) { + final BigDecimal latitude = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("latitude", element); + if (enabledFieldsMap.get("latitude")) { + if (madatoryFieldsMap.get("latitude") && fromNewClient) { + baseDataValidator.reset().parameter("latitude").value(latitude).notBlank(); + } + if (!regexFieldsMap.get("latitude").isEmpty()) { + baseDataValidator.reset().parameter("latitude").value(latitude) + .matchesRegularExpression(regexFieldsMap.get("latitude")); + } + } + } + + if (this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("longitude", element) != null) { + final BigDecimal longitude = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed("longitude", element); + if (enabledFieldsMap.get("longitude")) { + if (madatoryFieldsMap.get("longitude") && fromNewClient) { + baseDataValidator.reset().parameter("longitude").value(longitude).notBlank(); + } + if (!regexFieldsMap.get("longitude").isEmpty()) { + baseDataValidator.reset().parameter("longitude").value(longitude) + .matchesRegularExpression(regexFieldsMap.get("longitude")); + } + } + } + + throwExceptionIfValidationWarningsExist(dataValidationErrors); + + } + + private void throwExceptionIfValidationWarningsExist(final List<ApiParameterError> dataValidationErrors) { + if (!dataValidationErrors.isEmpty()) { + throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", + "Validation errors exist.", dataValidationErrors); + } + } + +} http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/b086e005/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressReadPlatformService.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressReadPlatformService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressReadPlatformService.java new file mode 100644 index 0000000..0a45e7a --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressReadPlatformService.java @@ -0,0 +1,37 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.address.service; + +import java.util.Collection; + +import org.apache.fineract.portfolio.address.data.AddressData; + +public interface AddressReadPlatformService { + public Collection<AddressData> retrieveAddressFields(long clientid); + + public Collection<AddressData> retrieveAllClientAddress(long clientid); + + public Collection<AddressData> retrieveAddressbyType(long clientid, long typeid); + + Collection<AddressData> retrieveAddressbyTypeAndStatus(long clientid, long typeid, String status); + + Collection<AddressData> retrieveAddressbyStatus(long clientid, String status); + + AddressData retrieveTemplate(); +} http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/b086e005/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressReadPlatformServiceImpl.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressReadPlatformServiceImpl.java new file mode 100644 index 0000000..dc88318 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressReadPlatformServiceImpl.java @@ -0,0 +1,246 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.address.service; + +import java.math.BigDecimal; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +import org.apache.fineract.infrastructure.codes.data.CodeValueData; +import org.apache.fineract.infrastructure.codes.service.CodeValueReadPlatformService; +import org.apache.fineract.infrastructure.core.service.RoutingDataSource; +import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; +import org.apache.fineract.portfolio.address.data.AddressData; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Service; + +@Service +public class AddressReadPlatformServiceImpl implements AddressReadPlatformService { + + private final JdbcTemplate jdbcTemplate; + private final PlatformSecurityContext context; + private final CodeValueReadPlatformService readService; + + @Autowired + public AddressReadPlatformServiceImpl(final PlatformSecurityContext context, final RoutingDataSource dataSource, + final CodeValueReadPlatformService readService) { + this.context = context; + this.jdbcTemplate = new JdbcTemplate(dataSource); + this.readService = readService; + } + + private static final class AddFieldsMapper implements RowMapper<AddressData> { + public String schema() { + return "addr.id as id,client.id as client_id,addr.street as street,addr.address_line_1 as address_line_1,addr.address_line_2 as address_line_2," + + "addr.address_line_3 as address_line_3,addr.town_village as town_village, addr.city as city,addr.county_district as county_district," + + "addr.state_province_id as state_province_id, addr.country_id as country_id,addr.postal_code as postal_code,addr.latitude as latitude," + + "addr.longitude as longitude,addr.created_by as created_by,addr.created_on as created_on,addr.updated_by as updated_by," + + "addr.updated_on as updated_on from m_address as addr,m_client client"; + } + + @Override + public AddressData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) + throws SQLException { + + final long addressId = rs.getLong("id"); + + final long clientId = rs.getLong("client_id"); + + final String street = rs.getString("street"); + + final String address_line_1 = rs.getString("address_line_1"); + + final String address_line_2 = rs.getString("address_line_2"); + + final String address_line_3 = rs.getString("address_line_3"); + + final String town_village = rs.getString("town_village"); + + final String city = rs.getString("city"); + + final String county_district = rs.getString("county_district"); + + final long state_province_id = rs.getLong("state_province_id"); + + final long country_id = rs.getLong("country_id"); + + final String postal_code = rs.getString("postal_code"); + + final BigDecimal latitude = rs.getBigDecimal("latitude"); + + final BigDecimal longitude = rs.getBigDecimal("longitude"); + + final String created_by = rs.getString("created_by"); + + final Date created_on = rs.getDate("created_on"); + + final String updated_by = rs.getString("updated_by"); + + final Date updated_on = rs.getDate("updated_on"); + + return AddressData.instance1(addressId, street, address_line_1, address_line_2, address_line_3, + town_village, city, county_district, state_province_id, country_id, postal_code, latitude, + longitude, created_by, created_on, updated_by, updated_on); + + } + } + + private static final class AddMapper implements RowMapper<AddressData> { + public String schema() { + return "cv2.code_value as addressType,ca.client_id as client_id,addr.id as id,ca.address_type_id as addresstyp,ca.is_active as is_active,addr.street as street,addr.address_line_1 as address_line_1,addr.address_line_2 as address_line_2," + + "addr.address_line_3 as address_line_3,addr.town_village as town_village, addr.city as city,addr.county_district as county_district," + + "addr.state_province_id as state_province_id,cv.code_value as state_name, addr.country_id as country_id,c.code_value as country_name,addr.postal_code as postal_code,addr.latitude as latitude," + + "addr.longitude as longitude,addr.created_by as created_by,addr.created_on as created_on,addr.updated_by as updated_by," + + "addr.updated_on as updated_on" + + " from m_address addr left join m_code_value cv on addr.state_province_id=cv.id" + + " left join m_code_value c on addr.country_id=c.id" + + " join m_client_address ca on addr.id= ca.address_id" + + " join m_code_value cv2 on ca.address_type_id=cv2.id"; + + } + + @Override + public AddressData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) + throws SQLException { + + final String addressType = rs.getString("addressType"); + final long addressId = rs.getLong("id"); + + final long client_id = rs.getLong("client_id"); + + final String street = rs.getString("street"); + + final long address_type_id = rs.getLong("addresstyp"); + + final boolean is_active = rs.getBoolean("is_active"); + + final String address_line_1 = rs.getString("address_line_1"); + + final String address_line_2 = rs.getString("address_line_2"); + + final String address_line_3 = rs.getString("address_line_3"); + + final String town_village = rs.getString("town_village"); + + final String city = rs.getString("city"); + + final String county_district = rs.getString("county_district"); + + final long state_province_id = rs.getLong("state_province_id"); + + final long country_id = rs.getLong("country_id"); + + final String country_name = rs.getString("country_name"); + + final String state_name = rs.getString("state_name"); + + final String postal_code = rs.getString("postal_code"); + + final BigDecimal latitude = rs.getBigDecimal("latitude"); + + final BigDecimal longitude = rs.getBigDecimal("longitude"); + + final String created_by = rs.getString("created_by"); + + final Date created_on = rs.getDate("created_on"); + + final String updated_by = rs.getString("updated_by"); + + final Date updated_on = rs.getDate("updated_on"); + + return AddressData.instance(addressType, client_id, addressId, address_type_id, is_active, street, + address_line_1, address_line_2, address_line_3, town_village, city, county_district, + state_province_id, country_id, state_name, country_name, postal_code, latitude, longitude, + created_by, created_on, updated_by, updated_on); + + } + } + + @Override + public Collection<AddressData> retrieveAddressFields(final long clientid) { + this.context.authenticatedUser(); + + final AddFieldsMapper rm = new AddFieldsMapper(); + final String sql = "select " + rm.schema() + " where client.id=?"; + + return this.jdbcTemplate.query(sql, rm, new Object[] { clientid }); + } + + @Override + public Collection<AddressData> retrieveAllClientAddress(final long clientid) { + this.context.authenticatedUser(); + final AddMapper rm = new AddMapper(); + final String sql = "select " + rm.schema() + " and ca.client_id=?"; + return this.jdbcTemplate.query(sql, rm, new Object[] { clientid }); + } + + @Override + public Collection<AddressData> retrieveAddressbyType(final long clientid, final long typeid) { + this.context.authenticatedUser(); + + final AddMapper rm = new AddMapper(); + final String sql = "select " + rm.schema() + " and ca.client_id=? and ca.address_type_id=?"; + + return this.jdbcTemplate.query(sql, rm, new Object[] { clientid, typeid }); + } + + @Override + public Collection<AddressData> retrieveAddressbyTypeAndStatus(final long clientid, final long typeid, + final String status) { + this.context.authenticatedUser(); + Boolean temp = false; + temp = Boolean.parseBoolean(status); + + final AddMapper rm = new AddMapper(); + final String sql = "select " + rm.schema() + " and ca.client_id=? and ca.address_type_id=? and ca.is_active=?"; + + return this.jdbcTemplate.query(sql, rm, new Object[] { clientid, typeid, temp }); + } + + @Override + public Collection<AddressData> retrieveAddressbyStatus(final long clientid, final String status) { + this.context.authenticatedUser(); + Boolean temp = false; + temp = Boolean.parseBoolean(status); + + final AddMapper rm = new AddMapper(); + final String sql = "select " + rm.schema() + " and ca.client_id=? and ca.is_active=?"; + + return this.jdbcTemplate.query(sql, rm, new Object[] { clientid, temp }); + } + + @Override + public AddressData retrieveTemplate() { + final List<CodeValueData> countryoptions = new ArrayList<>( + this.readService.retrieveCodeValuesByCode("COUNTRY")); + + final List<CodeValueData> StateOptions = new ArrayList<>(this.readService.retrieveCodeValuesByCode("STATES")); + + final List<CodeValueData> addressTypeOptions = new ArrayList<>( + this.readService.retrieveCodeValuesByCode("ADDRESS_TYPE")); + + return AddressData.template(countryoptions, StateOptions, addressTypeOptions); + } +} http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/b086e005/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressWritePlatformService.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressWritePlatformService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressWritePlatformService.java new file mode 100644 index 0000000..fa1219a --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressWritePlatformService.java @@ -0,0 +1,31 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.address.service; + +import org.apache.fineract.infrastructure.core.api.JsonCommand; +import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; +import org.apache.fineract.portfolio.client.domain.Client; + +public interface AddressWritePlatformService { + CommandProcessingResult addClientAddress(Long clientId, Long addressTypeId, JsonCommand command); + + CommandProcessingResult addNewClientAddress(Client client, JsonCommand command); + + CommandProcessingResult updateClientAddress(Long clientId, JsonCommand command); +} http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/b086e005/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressWritePlatformServiceImpl.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressWritePlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressWritePlatformServiceImpl.java new file mode 100644 index 0000000..847b20d --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/AddressWritePlatformServiceImpl.java @@ -0,0 +1,284 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.address.service; + +import java.math.BigDecimal; + +import org.apache.fineract.infrastructure.codes.domain.CodeValue; +import org.apache.fineract.infrastructure.codes.domain.CodeValueRepository; +import org.apache.fineract.infrastructure.core.api.JsonCommand; +import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; +import org.apache.fineract.infrastructure.core.data.CommandProcessingResultBuilder; +import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; +import org.apache.fineract.portfolio.address.domain.Address; +import org.apache.fineract.portfolio.address.domain.AddressRepository; +import org.apache.fineract.portfolio.address.serialization.AddressCommandFromApiJsonDeserializer; +import org.apache.fineract.portfolio.client.domain.Client; +import org.apache.fineract.portfolio.client.domain.ClientAddress; +import org.apache.fineract.portfolio.client.domain.ClientAddressRepository; +import org.apache.fineract.portfolio.client.domain.ClientAddressRepositoryWrapper; +import org.apache.fineract.portfolio.client.domain.ClientRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; + +@Service +public class AddressWritePlatformServiceImpl implements AddressWritePlatformService { + private final PlatformSecurityContext context; + private final CodeValueRepository codeValueRepository; + private final ClientAddressRepository clientAddressRepository; + private final ClientRepository clientRepository; + private final AddressRepository addressRepository; + private final ClientAddressRepositoryWrapper clientAddressRepositoryWrapper; + private final AddressCommandFromApiJsonDeserializer fromApiJsonDeserializer; + + @Autowired + public AddressWritePlatformServiceImpl(final PlatformSecurityContext context, + final CodeValueRepository codeValueRepository, final ClientAddressRepository clientAddressRepository, + final ClientRepository clientRepository, final AddressRepository addressRepository, + final ClientAddressRepositoryWrapper clientAddressRepositoryWrapper, + final AddressCommandFromApiJsonDeserializer fromApiJsonDeserializer) { + this.context = context; + this.codeValueRepository = codeValueRepository; + this.clientAddressRepository = clientAddressRepository; + this.clientRepository = clientRepository; + this.addressRepository = addressRepository; + this.clientAddressRepositoryWrapper = clientAddressRepositoryWrapper; + this.fromApiJsonDeserializer = fromApiJsonDeserializer; + + } + + @Override + public CommandProcessingResult addClientAddress(final Long clientId, final Long addressTypeId, + final JsonCommand command) { + CodeValue stateIdobj = null; + CodeValue countryIdObj = null; + long stateId; + long countryId; + + this.context.authenticatedUser(); + this.fromApiJsonDeserializer.validateForCreate(command.json(), true); + + System.out.println("request " + command.json()); + + if (command.longValueOfParameterNamed("stateProvinceId") != null) { + stateId = command.longValueOfParameterNamed("stateProvinceId"); + stateIdobj = this.codeValueRepository.getOne(stateId); + } + + if (command.longValueOfParameterNamed("countryId") != null) { + countryId = command.longValueOfParameterNamed("countryId"); + countryIdObj = this.codeValueRepository.getOne(countryId); + } + + final CodeValue addressTypeIdObj = this.codeValueRepository.getOne(addressTypeId); + + final Address add = Address.fromJson(command, stateIdobj, countryIdObj); + this.addressRepository.save(add); + final Long addressid = add.getId(); + final Address addobj = this.addressRepository.getOne(addressid); + + final Client client = this.clientRepository.getOne(clientId); + final boolean isActive = command.booleanPrimitiveValueOfParameterNamed("isActive"); + + final ClientAddress clientAddressobj = ClientAddress.fromJson(isActive, client, addobj, addressTypeIdObj); + this.clientAddressRepository.save(clientAddressobj); + + return new CommandProcessingResultBuilder().withCommandId(command.commandId()) + .withEntityId(clientAddressobj.getId()).build(); + } + + // following method is used for adding multiple addresses while creating new + // client + + @Override + public CommandProcessingResult addNewClientAddress(final Client client, final JsonCommand command) { + CodeValue stateIdobj = null; + CodeValue countryIdObj = null; + long stateId; + long countryId; + ClientAddress clientAddressobj = new ClientAddress(); + final JsonArray addressArray = command.arrayOfParameterNamed("address"); + + for (int i = 0; i < addressArray.size(); i++) { + final JsonObject jsonObject = addressArray.get(i).getAsJsonObject(); + + // validate every address + this.fromApiJsonDeserializer.validateForCreate(jsonObject.toString(), true); + + if (jsonObject.get("stateProvinceId") != null) { + stateId = jsonObject.get("stateProvinceId").getAsLong(); + stateIdobj = this.codeValueRepository.getOne(stateId); + } + + if (jsonObject.get("countryId") != null) { + countryId = jsonObject.get("countryId").getAsLong(); + countryIdObj = this.codeValueRepository.getOne(countryId); + } + + final long addressTypeId = jsonObject.get("addressTypeId").getAsLong(); + final CodeValue addressTypeIdObj = this.codeValueRepository.getOne(addressTypeId); + + final Address add = Address.fromJsonObject(jsonObject, stateIdobj, countryIdObj); + this.addressRepository.save(add); + final Long addressid = add.getId(); + final Address addobj = this.addressRepository.getOne(addressid); + + final boolean isActive = jsonObject.get("isActive").getAsBoolean(); + + clientAddressobj = ClientAddress.fromJson(isActive, client, addobj, addressTypeIdObj); + this.clientAddressRepository.save(clientAddressobj); + + } + + return new CommandProcessingResultBuilder().withCommandId(command.commandId()) + .withEntityId(clientAddressobj.getId()).build(); + } + + @Override + public CommandProcessingResult updateClientAddress(final Long clientId, final JsonCommand command) { + this.context.authenticatedUser(); + + long stateId; + + long countryId; + + CodeValue stateIdobj; + + CodeValue countryIdObj; + + boolean is_address_update = false; + + this.fromApiJsonDeserializer.validateForUpdate(command.json()); + + final long addressId = command.longValueOfParameterNamed("addressId"); + + final ClientAddress clientAddressObj = this.clientAddressRepositoryWrapper + .findOneByClientIdAndAddressId(clientId, addressId); + + final Address addobj = this.addressRepository.getOne(addressId); + + if (!(command.stringValueOfParameterNamed("street").isEmpty())) { + + is_address_update = true; + final String street = command.stringValueOfParameterNamed("street"); + addobj.setStreet(street); + } + + if (!(command.stringValueOfParameterNamed("addressLine1").isEmpty())) { + + is_address_update = true; + final String addressLine1 = command.stringValueOfParameterNamed("addressLine1"); + addobj.setAddressLine1(addressLine1); + + } + + if (!(command.stringValueOfParameterNamed("addressLine2").isEmpty())) { + + is_address_update = true; + final String addressLine2 = command.stringValueOfParameterNamed("addressLine2"); + addobj.setAddressLine2(addressLine2); + + } + + if (!(command.stringValueOfParameterNamed("addressLine3").isEmpty())) { + is_address_update = true; + final String addressLine3 = command.stringValueOfParameterNamed("addressLine3"); + addobj.setAddressLine3(addressLine3); + + } + + if (!(command.stringValueOfParameterNamed("townVillage").isEmpty())) { + + is_address_update = true; + final String townVillage = command.stringValueOfParameterNamed("townVillage"); + addobj.setTownVillage(townVillage); + } + + if (!(command.stringValueOfParameterNamed("city").isEmpty())) { + is_address_update = true; + final String city = command.stringValueOfParameterNamed("city"); + addobj.setCity(city); + } + + if (!(command.stringValueOfParameterNamed("countyDistrict").isEmpty())) { + is_address_update = true; + final String countyDistrict = command.stringValueOfParameterNamed("countyDistrict"); + addobj.setCountyDistrict(countyDistrict); + } + + if ((command.longValueOfParameterNamed("stateProvinceId") != null)) { + if ((command.longValueOfParameterNamed("stateProvinceId") != 0)) { + is_address_update = true; + stateId = command.longValueOfParameterNamed("stateProvinceId"); + stateIdobj = this.codeValueRepository.getOne(stateId); + addobj.setStateProvince(stateIdobj); + } + + } + if ((command.longValueOfParameterNamed("countryId") != null)) { + if ((command.longValueOfParameterNamed("countryId") != 0)) { + is_address_update = true; + countryId = command.longValueOfParameterNamed("countryId"); + countryIdObj = this.codeValueRepository.getOne(countryId); + addobj.setCountry(countryIdObj); + } + + } + + if (!(command.stringValueOfParameterNamed("postalCode").isEmpty())) { + is_address_update = true; + final String postalCode = command.stringValueOfParameterNamed("postalCode"); + addobj.setPostalCode(postalCode); + } + + if (command.bigDecimalValueOfParameterNamed("latitude") != null) { + + is_address_update = true; + final BigDecimal latitude = command.bigDecimalValueOfParameterNamed("latitude"); + + addobj.setLatitude(latitude); + } + if (command.bigDecimalValueOfParameterNamed("longitude") != null) { + is_address_update = true; + final BigDecimal longitude = command.bigDecimalValueOfParameterNamed("longitude"); + addobj.setLongitude(longitude); + + } + + if (is_address_update) { + + this.addressRepository.save(addobj); + + } + + final Boolean testActive = command.booleanPrimitiveValueOfParameterNamed("isActive"); + if (testActive != null) { + + final boolean active = command.booleanPrimitiveValueOfParameterNamed("isActive"); + clientAddressObj.setIs_active(active); + + } + + return new CommandProcessingResultBuilder().withCommandId(command.commandId()) + .withEntityId(clientAddressObj.getId()).build(); + } +} http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/b086e005/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/FieldConfigurationReadPlatformService.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/FieldConfigurationReadPlatformService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/FieldConfigurationReadPlatformService.java new file mode 100644 index 0000000..c3403f4 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/FieldConfigurationReadPlatformService.java @@ -0,0 +1,30 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.address.service; + +import java.util.Collection; +import java.util.List; + +import org.apache.fineract.portfolio.address.data.FieldConfigurationData; + +public interface FieldConfigurationReadPlatformService { + public Collection<FieldConfigurationData> retrieveFieldConfiguration(String entity); + + List<FieldConfigurationData> retrieveFieldConfigurationList(String entity); +} http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/b086e005/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/FieldConfigurationReadPlatformServiceImpl.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/FieldConfigurationReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/FieldConfigurationReadPlatformServiceImpl.java new file mode 100644 index 0000000..946a96f --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/service/FieldConfigurationReadPlatformServiceImpl.java @@ -0,0 +1,89 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.address.service; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Collection; +import java.util.List; + +import org.apache.fineract.infrastructure.core.service.RoutingDataSource; +import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; +import org.apache.fineract.portfolio.address.data.FieldConfigurationData; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Service; + +@Service +public class FieldConfigurationReadPlatformServiceImpl implements FieldConfigurationReadPlatformService { + private final JdbcTemplate jdbcTemplate; + private final PlatformSecurityContext context; + + @Autowired + public FieldConfigurationReadPlatformServiceImpl(final PlatformSecurityContext context, + final RoutingDataSource dataSource) { + this.context = context; + this.jdbcTemplate = new JdbcTemplate(dataSource); + } + + private static final class FieldMapper implements RowMapper<FieldConfigurationData> { + public String schema() { + return "fld.id as fieldConfigurationId,fld.entity as entity,fld.subentity as subentity,fld.field as field,fld.is_enabled as is_enabled," + + "fld.is_mandatory as is_mandatory,fld.validation_regex as validation_regex from m_field_configuration fld"; + } + + @Override + public FieldConfigurationData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) + throws SQLException { + final long fieldConfigurationId = rs.getLong("fieldConfigurationId"); + final String entity = rs.getString("entity"); + final String subentity = rs.getString("subentity"); + final String field = rs.getString("field"); + final boolean is_enabled = rs.getBoolean("is_enabled"); + final boolean is_mandatory = rs.getBoolean("is_mandatory"); + final String validation_regex = rs.getString("validation_regex"); + + return FieldConfigurationData.instance(fieldConfigurationId, entity, subentity, field, is_enabled, + is_mandatory, validation_regex); + + } + } + + @Override + public Collection<FieldConfigurationData> retrieveFieldConfiguration(final String entity) { + this.context.authenticatedUser(); + + final FieldMapper rm = new FieldMapper(); + final String sql = "select " + rm.schema() + " where fld.entity=?"; + + return this.jdbcTemplate.query(sql, rm, new Object[] { entity }); + } + + @Override + public List<FieldConfigurationData> retrieveFieldConfigurationList(final String entity) { + this.context.authenticatedUser(); + + final FieldMapper rm = new FieldMapper(); + final String sql = "select " + rm.schema() + " where fld.entity=?"; + + return this.jdbcTemplate.query(sql, new Object[] { entity }, rm); + + } +} http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/b086e005/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientAddressApiResources.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientAddressApiResources.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientAddressApiResources.java new file mode 100644 index 0000000..67c72b4 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientAddressApiResources.java @@ -0,0 +1,151 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.client.api; + +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.UriInfo; + +import org.apache.fineract.commands.domain.CommandWrapper; +import org.apache.fineract.commands.service.CommandWrapperBuilder; +import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService; +import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper; +import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; +import org.apache.fineract.infrastructure.core.serialization.ApiRequestJsonSerializationSettings; +import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer; +import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; +import org.apache.fineract.portfolio.address.data.AddressData; +import org.apache.fineract.portfolio.address.service.AddressReadPlatformServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Path("/client") +@Component +@Scope("singleton") +public class ClientAddressApiResources { + private final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("addressId", "street", + "addressLine1", "addressLine2", "addressLine3", "townVillage", "city", "countyDistrict", "stateProvinceId", + "countryId", "postalCode", "latitude", "longitude", "createdBy", "createdOn", "updatedBy", "updatedOn", + "clientAddressId", "client_id", "address_id", "address_type_id", "isActive", "fieldConfigurationId", + "entity", "table", "field", "is_enabled", "is_mandatory", "validation_regex")); + private final String resourceNameForPermissions = "Address"; + private final PlatformSecurityContext context; + private final AddressReadPlatformServiceImpl readPlatformService; + private final DefaultToApiJsonSerializer<AddressData> toApiJsonSerializer; + private final ApiRequestParameterHelper apiRequestParameterHelper; + private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; + + @Autowired + public ClientAddressApiResources(final PlatformSecurityContext context, + final AddressReadPlatformServiceImpl readPlatformService, + final DefaultToApiJsonSerializer<AddressData> toApiJsonSerializer, + final ApiRequestParameterHelper apiRequestParameterHelper, + final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) { + this.context = context; + this.readPlatformService = readPlatformService; + this.toApiJsonSerializer = toApiJsonSerializer; + this.apiRequestParameterHelper = apiRequestParameterHelper; + this.commandsSourceWritePlatformService = commandsSourceWritePlatformService; + } + + @GET + @Path("addresses/template") + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public String getAddressesTemplate(@Context final UriInfo uriInfo) { + this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + + final AddressData template = this.readPlatformService.retrieveTemplate(); + + final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper + .process(uriInfo.getQueryParameters()); + return this.toApiJsonSerializer.serialize(settings, template, this.RESPONSE_DATA_PARAMETERS); + + } + + @GET + @Path("/{clientid}/addresses") + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public String getAddresses(@QueryParam("status") final String status, @QueryParam("type") final long addressTypeId, + @PathParam("clientid") final long clientid, @Context final UriInfo uriInfo) { + Collection<AddressData> address; + + this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); + + if (addressTypeId == 0 && status == null) { + address = this.readPlatformService.retrieveAllClientAddress(clientid); + } else if (addressTypeId != 0 && status == null) { + address = this.readPlatformService.retrieveAddressbyType(clientid, addressTypeId); + } else if (addressTypeId != 0 && status != null) { + address = this.readPlatformService.retrieveAddressbyTypeAndStatus(clientid, addressTypeId, status); + } else { + address = this.readPlatformService.retrieveAddressbyStatus(clientid, status); + } + + final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper + .process(uriInfo.getQueryParameters()); + return this.toApiJsonSerializer.serialize(settings, address, this.RESPONSE_DATA_PARAMETERS); + + } + + @POST + @Path("/{clientid}/addresses") + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public String AddClientAddress(@QueryParam("type") final long addressTypeId, + @PathParam("clientid") final long clientid, final String apiRequestBodyAsJson) { + + final CommandWrapper commandRequest = new CommandWrapperBuilder().addClientAddress(clientid, addressTypeId) + .withJson(apiRequestBodyAsJson).build(); + + final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest); + + return this.toApiJsonSerializer.serialize(result); + } + + @PUT + @Path("/{clientid}/addresses") + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public String UpdateClientAddress(@PathParam("clientid") final long clientid, final String apiRequestBodyAsJson) { + + final CommandWrapper commandRequest = new CommandWrapperBuilder().updateClientAddress(clientid) + .withJson(apiRequestBodyAsJson).build(); + + final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest); + + return this.toApiJsonSerializer.serialize(result); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/b086e005/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientApiConstants.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientApiConstants.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientApiConstants.java index 861358a..fb07c0e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientApiConstants.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientApiConstants.java @@ -68,6 +68,7 @@ public class ClientApiConstants { // general public static final String localeParamName = "locale"; public static final String dateFormatParamName = "dateFormat"; + public static final String address = "address"; public static final String CLIENT_TYPE_INDIVIDUAL = "Individual"; @@ -175,14 +176,14 @@ public class ClientApiConstants { public static final String staffOptionsParamName = "staffOptions"; public static final Set<String> CLIENT_CREATE_REQUEST_DATA_PARAMETERS = new HashSet<>( - Arrays.asList(localeParamName, dateFormatParamName, groupIdParamName, accountNoParamName, externalIdParamName, + Arrays.asList(address,localeParamName, dateFormatParamName, groupIdParamName, accountNoParamName, externalIdParamName, mobileNoParamName, firstnameParamName, middlenameParamName, lastnameParamName, fullnameParamName, officeIdParamName, activeParamName, activationDateParamName, staffIdParamName, submittedOnDateParamName, savingsProductIdParamName, dateOfBirthParamName, genderIdParamName, clientTypeIdParamName, clientClassificationIdParamName, clientNonPersonDetailsParamName, displaynameParamName, legalFormIdParamName)); public static final Set<String> CLIENT_NON_PERSON_CREATE_REQUEST_DATA_PARAMETERS = new HashSet<>( - Arrays.asList(localeParamName, dateFormatParamName, incorpNumberParamName, remarksParamName, incorpValidityTillParamName, + Arrays.asList(address,localeParamName, dateFormatParamName, incorpNumberParamName, remarksParamName, incorpValidityTillParamName, constitutionIdParamName, mainBusinessLineIdParamName)); public static final Set<String> CLIENT_UPDATE_REQUEST_DATA_PARAMETERS = new HashSet<>(Arrays.asList(localeParamName, http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/b086e005/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientData.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientData.java index 1984417..bcba0fc 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientData.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientData.java @@ -29,6 +29,7 @@ import org.apache.fineract.infrastructure.codes.data.CodeValueData; import org.apache.fineract.infrastructure.core.data.EnumOptionData; import org.apache.fineract.organisation.office.data.OfficeData; import org.apache.fineract.organisation.staff.data.StaffData; +import org.apache.fineract.portfolio.address.data.AddressData; import org.apache.fineract.portfolio.group.data.GroupGeneralData; import org.apache.fineract.portfolio.savings.data.SavingsAccountData; import org.apache.fineract.portfolio.savings.data.SavingsProductData; @@ -95,13 +96,17 @@ final public class ClientData implements Comparable<ClientData> { private final List<EnumOptionData> clientLegalFormOptions; private final ClientNonPersonData clientNonPersonDetails; + + private final AddressData address; + + private final Boolean isAddressEnabled; public static ClientData template(final Long officeId, final LocalDate joinedDate, final Collection<OfficeData> officeOptions, final Collection<StaffData> staffOptions, final Collection<CodeValueData> narrations, final Collection<CodeValueData> genderOptions, final Collection<SavingsProductData> savingProductOptions, final Collection<CodeValueData> clientTypeOptions, final Collection<CodeValueData> clientClassificationOptions, final Collection<CodeValueData> clientNonPersonConstitutionOptions, final Collection<CodeValueData> clientNonPersonMainBusinessLineOptions, - final List<EnumOptionData> clientLegalFormOptions) { + final List<EnumOptionData> clientLegalFormOptions, final AddressData address,final Boolean isAddressEnabled) { final String accountNo = null; final EnumOptionData status = null; final CodeValueData subStatus = null; @@ -136,7 +141,7 @@ final public class ClientData implements Comparable<ClientData> { staffName, officeOptions, groups, staffOptions, narrations, genderOptions, timeline, savingProductOptions, savingsProductId, savingsProductName, savingsAccountId, savingAccountOptions, clientType, clientClassification, clientTypeOptions, clientClassificationOptions, clientNonPersonConstitutionOptions, clientNonPersonMainBusinessLineOptions, - clientNonPersonDetails, clientLegalFormOptions, legalForm); + clientNonPersonDetails, clientLegalFormOptions, legalForm,address, isAddressEnabled); } @@ -151,7 +156,7 @@ final public class ClientData implements Comparable<ClientData> { clientData.savingsProductName, clientData.savingsAccountId, clientData.savingAccountOptions, clientData.clientType, clientData.clientClassification, templateData.clientTypeOptions, templateData.clientClassificationOptions, templateData.clientNonPersonConstitutionOptions, templateData.clientNonPersonMainBusinessLineOptions, clientData.clientNonPersonDetails, - templateData.clientLegalFormOptions, clientData.legalForm); + templateData.clientLegalFormOptions, clientData.legalForm, clientData.address,clientData.isAddressEnabled); } @@ -167,7 +172,7 @@ final public class ClientData implements Comparable<ClientData> { clientData.savingsProductName, clientData.savingsAccountId, savingAccountOptions, clientData.clientType, clientData.clientClassification, clientData.clientTypeOptions, clientData.clientClassificationOptions, clientData.clientNonPersonConstitutionOptions, clientData.clientNonPersonMainBusinessLineOptions, clientData.clientNonPersonDetails, - clientData.clientLegalFormOptions, clientData.legalForm); + clientData.clientLegalFormOptions, clientData.legalForm,clientData.address, clientData.isAddressEnabled); } @@ -180,7 +185,8 @@ final public class ClientData implements Comparable<ClientData> { clientData.savingProductOptions, clientData.savingsProductId, clientData.savingsProductName, clientData.savingsAccountId, clientData.savingAccountOptions, clientData.clientType, clientData.clientClassification, clientData.clientTypeOptions, clientData.clientClassificationOptions, clientData.clientNonPersonConstitutionOptions, clientData.clientNonPersonMainBusinessLineOptions, - clientData.clientNonPersonDetails, clientData.clientLegalFormOptions, clientData.legalForm); + clientData.clientNonPersonDetails, clientData.clientLegalFormOptions, clientData.legalForm,clientData.address, + clientData.isAddressEnabled); } @@ -224,7 +230,7 @@ final public class ClientData implements Comparable<ClientData> { staffName, allowedOffices, groups, staffOptions, closureReasons, genderOptions, timeline, savingProductOptions, savingsProductId, savingsProductName, savingsAccountId, savingAccountOptions, clientType, clientClassification, clientTypeOptions, clientClassificationOptions, clientNonPersonConstitutionOptions, clientNonPersonMainBusinessLineOptions, - clientNonPerson, clientLegalFormOptions, legalForm); + clientNonPerson, clientLegalFormOptions, legalForm,null,null); } public static ClientData lookup(final Long id, final String displayName, final Long officeId, final String officeName) { @@ -270,7 +276,7 @@ final public class ClientData implements Comparable<ClientData> { staffName, allowedOffices, groups, staffOptions, closureReasons, genderOptions, timeline, savingProductOptions, savingsProductId, savingsProductName, savingsAccountId, savingAccountOptions, clientType, clientClassification, clientTypeOptions, clientClassificationOptions, clientNonPersonConstitutionOptions, clientNonPersonMainBusinessLineOptions, - clientNonPerson, clientLegalFormOptions, legalForm); + clientNonPerson, clientLegalFormOptions, legalForm,null,null); } @@ -298,7 +304,7 @@ final public class ClientData implements Comparable<ClientData> { staffName, allowedOffices, groups, staffOptions, closureReasons, genderOptions, timeline, savingProductOptions, savingsProductId, savingsProductName, savingsAccountId, null, clientType, clientClassification, clientTypeOptions, clientClassificationOptions, clientNonPersonConstitutionOptions, clientNonPersonMainBusinessLineOptions, clientNonPerson, - clientLegalFormOptions, legalForm); + clientLegalFormOptions, legalForm,null,null); } @@ -315,7 +321,7 @@ final public class ClientData implements Comparable<ClientData> { final CodeValueData clientClassification, final Collection<CodeValueData> clientTypeOptions, final Collection<CodeValueData> clientClassificationOptions, final Collection<CodeValueData> clientNonPersonConstitutionOptions, final Collection<CodeValueData> clientNonPersonMainBusinessLineOptions, final ClientNonPersonData clientNonPerson, - final List<EnumOptionData> clientLegalFormOptions, final EnumOptionData legalForm) { + final List<EnumOptionData> clientLegalFormOptions, final EnumOptionData legalForm,final AddressData address, final Boolean isAddressEnabled) { this.accountNo = accountNo; this.status = status; if (status != null) { @@ -374,6 +380,9 @@ final public class ClientData implements Comparable<ClientData> { this.savingAccountOptions = savingAccountOptions; this.legalForm = legalForm; this.clientNonPersonDetails = clientNonPerson; + + this.address = address; + this.isAddressEnabled = isAddressEnabled; } @@ -455,4 +464,8 @@ final public class ClientData implements Comparable<ClientData> { public LocalDate getActivationDate() { return this.activationDate; } + + public Boolean getIsAddressEnabled() { + return this.isAddressEnabled; + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/b086e005/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddress.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddress.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddress.java new file mode 100644 index 0000000..1dbe0b9 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddress.java @@ -0,0 +1,100 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.client.domain; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import org.apache.fineract.infrastructure.codes.domain.CodeValue; +import org.apache.fineract.infrastructure.core.api.JsonCommand; +import org.apache.fineract.portfolio.address.domain.Address; +import org.springframework.data.jpa.domain.AbstractPersistable; + +@Entity +@Table(name = "m_client_address") +public class ClientAddress extends AbstractPersistable<Long> { + + @ManyToOne + private Client client; + + @ManyToOne + private Address address; + + @ManyToOne + @JoinColumn(name = "address_type_id") + private CodeValue addressType; + + @Column(name = "is_active") + private boolean isActive; + + private ClientAddress(final Client client, final Address address, final CodeValue addressType, + final boolean isActive) { + this.client = client; + this.address = address; + this.addressType = addressType; + this.isActive = isActive; + + } + + public ClientAddress() { + + } + + public static ClientAddress fromJson(final boolean isActive, final Client client, final Address address, + final CodeValue address_type) { + + return new ClientAddress(client, address, address_type, isActive); + } + + public Client getClient() { + return this.client; + } + + public Address getAddress() { + return this.address; + } + + public CodeValue getAddressType() { + return this.addressType; + } + + public void setAddressType(final CodeValue addressType) { + this.addressType = addressType; + } + + public boolean isIs_active() { + return this.isActive; + } + + public void setClient(final Client client) { + this.client = client; + } + + public void setAddress(final Address address) { + this.address = address; + } + + public void setIs_active(final boolean isActive) { + this.isActive = isActive; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/b086e005/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddressRepository.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddressRepository.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddressRepository.java new file mode 100644 index 0000000..984b2ea --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddressRepository.java @@ -0,0 +1,35 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.client.domain; + +import org.apache.fineract.infrastructure.codes.domain.CodeValue; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +public interface ClientAddressRepository + extends JpaRepository<ClientAddress, Long>, JpaSpecificationExecutor<ClientAddress> { + ClientAddress findByClientId(String clientId); + + // ClientAddress findByAddressId(long addressId); + + ClientAddress findByClientIdAndAddressTypeAndIsActive(final long clientId, final CodeValue addressTypeId, + final boolean isActive); + + ClientAddress findByClientIdAndAddressId(final long clientId, final long addressId); +} http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/b086e005/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddressRepositoryWrapper.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddressRepositoryWrapper.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddressRepositoryWrapper.java new file mode 100644 index 0000000..fbe7cd2 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/domain/ClientAddressRepositoryWrapper.java @@ -0,0 +1,50 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.client.domain; + +import org.apache.fineract.infrastructure.codes.domain.CodeValue; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class ClientAddressRepositoryWrapper { + private final ClientAddressRepository clientAddressRepository; + + @Autowired + public ClientAddressRepositoryWrapper(final ClientAddressRepository clientAddressRepository) { + this.clientAddressRepository = clientAddressRepository; + } + + public ClientAddress findOneByClientIdAndAddressTypeAndIsActive(final long clientId, final CodeValue addressType, + final boolean isActive) { + final ClientAddress clientAddress = this.clientAddressRepository + .findByClientIdAndAddressTypeAndIsActive(clientId, addressType, isActive); + // if (clientAddress == null) { throw new + // AddressNotFoundException(clientId, addressType); } + return clientAddress; + } + + public ClientAddress findOneByClientIdAndAddressId(final long clientId, final long addressId) { + final ClientAddress clientAddress = this.clientAddressRepository.findByClientIdAndAddressId(clientId, + addressId); + + return clientAddress; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/b086e005/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/handler/AddClientAddressCommandHandler.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/handler/AddClientAddressCommandHandler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/handler/AddClientAddressCommandHandler.java new file mode 100644 index 0000000..2e9d844 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/handler/AddClientAddressCommandHandler.java @@ -0,0 +1,45 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.client.handler; + +import org.apache.fineract.commands.annotation.CommandType; +import org.apache.fineract.commands.handler.NewCommandSourceHandler; +import org.apache.fineract.infrastructure.core.api.JsonCommand; +import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; +import org.apache.fineract.portfolio.address.service.AddressWritePlatformService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +@CommandType(entity = "ADDRESS", action = "CREATE") +public class AddClientAddressCommandHandler implements NewCommandSourceHandler { + private final AddressWritePlatformService writePlatformService; + + @Autowired + public AddClientAddressCommandHandler(final AddressWritePlatformService writePlatformService) { + this.writePlatformService = writePlatformService; + } + + @Override + public CommandProcessingResult processCommand(final JsonCommand command) { + return this.writePlatformService.addClientAddress(command.getClientId(), command.entityId(), command); + + } + +} http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/b086e005/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/handler/UpdateClientAddressCommandHandler.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/handler/UpdateClientAddressCommandHandler.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/handler/UpdateClientAddressCommandHandler.java new file mode 100644 index 0000000..a7892c9 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/handler/UpdateClientAddressCommandHandler.java @@ -0,0 +1,51 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.client.handler; + +import org.apache.fineract.commands.annotation.CommandType; +import org.apache.fineract.commands.handler.NewCommandSourceHandler; +import org.apache.fineract.infrastructure.core.api.JsonCommand; +import org.apache.fineract.infrastructure.core.data.CommandProcessingResult; +import org.apache.fineract.portfolio.address.service.AddressWritePlatformService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +@CommandType(entity = "ADDRESS", action = "UPDATE") +public class UpdateClientAddressCommandHandler implements NewCommandSourceHandler { + + private final AddressWritePlatformService writePlatformService; + + @Autowired + public UpdateClientAddressCommandHandler(final AddressWritePlatformService writePlatformService) { + this.writePlatformService = writePlatformService; + } + + @Override + public CommandProcessingResult processCommand(final JsonCommand command) { + /* + * return + * this.writePlatformService.updateClientAddress(command.getClientId(), + * command.entityId(), command.getStatus(), command); + */ + return this.writePlatformService.updateClientAddress(command.getClientId(), command); + + } + +} http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/b086e005/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientAddressReadPlatformService.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientAddressReadPlatformService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientAddressReadPlatformService.java new file mode 100644 index 0000000..d33635f --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientAddressReadPlatformService.java @@ -0,0 +1,29 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.client.service; + +import java.util.Collection; + +import org.apache.fineract.portfolio.address.data.ClientAddressData; + +public interface ClientAddressReadPlatformService { + + public Collection<ClientAddressData> retrieveClientAddrConfiguration(String entity); + +} http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/b086e005/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientAddressReadPlatformServiceImpl.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientAddressReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientAddressReadPlatformServiceImpl.java new file mode 100644 index 0000000..63079ed --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/service/ClientAddressReadPlatformServiceImpl.java @@ -0,0 +1,76 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.portfolio.client.service; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Collection; + +import org.apache.fineract.infrastructure.core.service.RoutingDataSource; +import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; +import org.apache.fineract.portfolio.address.data.ClientAddressData; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Service; + +@Service +public class ClientAddressReadPlatformServiceImpl implements ClientAddressReadPlatformService { + + private final JdbcTemplate jdbcTemplate; + private final PlatformSecurityContext context; + + @Autowired + public ClientAddressReadPlatformServiceImpl(final PlatformSecurityContext context, + final RoutingDataSource dataSource) { + this.context = context; + this.jdbcTemplate = new JdbcTemplate(dataSource); + } + + private static final class ClientAddrMapper implements RowMapper<ClientAddressData> { + public String schema() { + return "fld.id as fieldConfigurationId,fld.entity as entity,fld.table as entitytable,fld.field as field,fld.is_enabled as is_enabled," + + "fld.is_mandatory as is_mandatory,fld.validation_regex as validation_regex from m_field_configuration fld"; + } + + @Override + public ClientAddressData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) + throws SQLException { + final long clientAddressId = rs.getLong("clientAddressId"); + final long client_id = rs.getLong("client_id"); + final long address_id = rs.getLong("address_id"); + final long address_type_id = rs.getLong("address_type_id"); + final boolean is_active = rs.getBoolean("is_active"); + + return ClientAddressData.instance(clientAddressId, client_id, address_id, address_type_id, is_active); + + } + } + + @Override + public Collection<ClientAddressData> retrieveClientAddrConfiguration(final String entity) { + this.context.authenticatedUser(); + + final ClientAddrMapper rm = new ClientAddrMapper(); + final String sql = "select " + rm.schema() + " where fld.entity=?"; + + return this.jdbcTemplate.query(sql, rm, new Object[] { entity }); + } + +}
