/*
* #%L
* jVoiD Open Platform
* %%
* Copyright 2014-2015 Schogini Systems Pvt Ltd (http://www.schogini.com)
* Project Website: http://www.jvoid.com
* %%
* Licensed 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.
* #L%
*/
package com.jvoid.customers.customer.service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Properties;
import java.util.Map.Entry;
import java.util.Random;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import com.jvoid.customers.customer.model.Entities;
import com.jvoid.customers.customer.model.Customer;
import com.jvoid.customers.customer.model.CustomerEntityValues;
import com.jvoid.customers.customer.model.CustomerMaster;
import com.jvoid.customers.utils.Utilities;
import com.sun.mail.iap.Protocol;
/**
* All Customer related operations such as add, edit, delete and validation functions
* change/reset customer password etc.
*
* @author Shajir K, Rajeev Pillai
* @version 1.0
*/
public class CustomerMasterService {
@Autowired
private CustomerService customerService;
@Autowired
private CustomerEntityValuesService customerEntityValuesService;
@Autowired
private EntitiesService entitiesService;
@Autowired
private CustomerGroupService customerGroupService;
public void setCustomerGroupService(CustomerGroupService customerGroupService) {
this.customerGroupService = customerGroupService;
}
public void setCustomerService(CustomerService customerService) {
this.customerService = customerService;
}
public void setCustomerEntityValuesService(CustomerEntityValuesService customerEntityValuesService) {
this.customerEntityValuesService = customerEntityValuesService;
}
public void setEntitiesService(EntitiesService entitiesService){
this.entitiesService = entitiesService;
}
public int deleteCustomer(int id) {
int status = 0;
Customer customer = this.customerService.getcustomerById(id);
if ( null != customer ) {
this.customerService.removecustomer(id);
status = removeCustomerEntities(id);
}else{
status = 0;
}
return status;
}
public int removeCustomerEntities(int id) {
int status = 1;
List<CustomerEntityValues> customerEntityValuesList = this.customerEntityValuesService
.getCustomerEntityValuesByCustomerId(id);
List<Integer> deleteIds = new ArrayList<>();
for(int i=0; i<customerEntityValuesList.size(); i++) {
if ( customerEntityValuesList.get(i).getCustomerId() == id ){
deleteIds.add(customerEntityValuesList.get(i).getId());
}
}
if( deleteIds.size() > 0 ) {
for(int i=0; i<deleteIds.size(); i++){
this.customerEntityValuesService.removeCustomerAttributeValues(deleteIds.get(i).intValue());
}
}else{
status = 0;
}
return status;
}
public String randomPassword(){
String pwd = null;
char[] chars = "abcdefghijklmnopqrstuvwxyz".toCharArray();
StringBuilder sb = new StringBuilder();
Random random = new Random();
for (int i = 0; i < 20; i++) {
char c = chars[random.nextInt(chars.length)];
sb.append(c);
}
pwd = sb.toString();
return pwd;
}
public void sendEmail(String email, String password){
Properties properties = System.getProperties();
properties.put("mail.smtp.starttls.enable", "true");
properties.put("mail.smtp.starttls.enable", "true");
properties.put("mail.smtp.auth", false);
properties.put("mail.smtp.host", "smtp.gmail.com");
properties.put("mail.smtp.port", 587);
Session session = Session.getInstance(properties, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("test@example.com", "test123");
}
});
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("toaddress@example.com"));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(email));
message.setSubject("Reset Password");
String content = "Your new password is " + password;
message.setText(content);
Transport.send(message);
} catch (MessagingException e) {
throw new RuntimeException(e);
}
}
public int changePassword(String email, String oldPwd, String newPwd){
int status = 0;
Customer customer = this.customerService.getCustomerByEmailId(email);
int attributeId = 28;// password attribute
if ( null != customer ) {
CustomerEntityValues custAttrValue = this.customerEntityValuesService
.getCustomerEntityValuesByCustomerIdAndAttributeId(customer.getId(), attributeId);
if ( oldPwd.equals(custAttrValue.getValue())){
custAttrValue.setCustomerId(customer.getId());
custAttrValue.setLanguage(custAttrValue.getLanguage());
custAttrValue.setAttributeId(attributeId);
String password = randomPassword();
custAttrValue.setValue(newPwd);
custAttrValue.setId(custAttrValue.getId());
customerEntityValuesService.updateCustomerAttributeValues(custAttrValue);
status = 1;
}
}
return status;
}
public int resetPassword(String email) {
int status = 0;
Customer customer = this.customerService.getCustomerByEmailId(email);
int attributeId = 28;// password attribute
if ( null != customer ) {
CustomerEntityValues custAttrValue = this.customerEntityValuesService
.getCustomerEntityValuesByCustomerIdAndAttributeId(customer.getId(), attributeId);
custAttrValue.setCustomerId(customer.getId());
custAttrValue.setLanguage(custAttrValue.getLanguage());
custAttrValue.setAttributeId(attributeId);
String password = randomPassword();
custAttrValue.setValue(password);
custAttrValue.setId(custAttrValue.getId());
customerEntityValuesService.updateCustomerAttributeValues(custAttrValue);
sendEmail(email, password);
status = 1;
}
return status;
}
public boolean isEmailAlreadyExists(String email) {
boolean status = false;
Customer customer = this.customerService.getCustomerByEmailId(email);
if ( customer != null ) {
status = true;
}
return status;
}
public CustomerMaster getCustomerByEmail(String email) {
CustomerMaster customerMaster = new CustomerMaster();
Customer customer = this.customerService.getCustomerByEmailId(email);
int customerId = customer.getId();
if ( null != customer ) {
customerMaster.setId(customerId);
List<CustomerEntityValues> customerEntityValuesList = this.customerEntityValuesService.getCustomerEntityValuesByCustomerId(customer.getId());
for (CustomerEntityValues customerEntityValues : customerEntityValuesList) {
System.out.println("CustEntityValues:"+customerEntityValuesList.toString());
switch (customerEntityValues.getAttributeId()) {
case 19:
customerMaster.setCustomerGroup(customer.getCustomerGroupId());
break;
case 20:
customerMaster.setPrefix(customerEntityValues.getValue());
break;
case 21:
customerMaster.setFirstName(customerEntityValues.getValue());
break;
case 22:
customerMaster.setMiddleName(customerEntityValues.getValue());
break;
case 23:
customerMaster.setLastName(customerEntityValues.getValue());
break;
case 24:
customerMaster.setEmail(customerEntityValues.getValue());
break;
case 25:
customerMaster.setDateOfBirth(customerEntityValues.getValue());
break;
case 26:
customerMaster.setTaxNumber(customerEntityValues.getValue());
break;
case 27:
customerMaster.setGender(customerEntityValues.getValue());
break;
case 28:
customerMaster.setPassword(customerEntityValues.getValue());
break;
case 29:
customerMaster.setCompany(customerEntityValues.getValue());
break;
case 30:
customerMaster.setStreetAddress1(customerEntityValues.getValue());
break;
case 31:
customerMaster.setStreetAddress2(customerEntityValues.getValue());
break;
case 32:
customerMaster.setStreetAddress3(customerEntityValues.getValue());
break;
case 33:
customerMaster.setCity(customerEntityValues.getValue());
break;
case 34:
customerMaster.setCountry(customerEntityValues.getValue());
break;
case 35:
customerMaster.setState(customerEntityValues.getValue());
break;
case 36:
customerMaster.setPostalCode(customerEntityValues.getValue());
break;
case 37:
customerMaster.setPhone(customerEntityValues.getValue());
break;
case 38:
customerMaster.setFax(customerEntityValues.getValue());
break;
default:
break;
}
}
}
return customerMaster;
}
public CustomerMaster getCustomer(int customerId) {
CustomerMaster customerMaster = new CustomerMaster();
Customer customer = this.customerService.getcustomerById(customerId);
if ( null != customer ) {
List<CustomerEntityValues> customerEntityValuesList = this.customerEntityValuesService.getCustomerEntityValuesByCustomerId(customer.getId());
for (CustomerEntityValues customerEntityValues : customerEntityValuesList) {
switch (customerEntityValues.getAttributeId()) {
case 19:
customerMaster.setCustomerGroup(customer.getCustomerGroupId());
break;
case 20:
customerMaster.setPrefix(customerEntityValues.getValue());
break;
case 21:
customerMaster.setFirstName(customerEntityValues.getValue());
break;
case 22:
customerMaster.setMiddleName(customerEntityValues.getValue());
break;
case 23:
customerMaster.setLastName(customerEntityValues.getValue());
break;
case 24:
customerMaster.setEmail(customerEntityValues.getValue());
break;
case 25:
customerMaster.setDateOfBirth(customerEntityValues.getValue());
break;
case 26:
customerMaster.setTaxNumber(customerEntityValues.getValue());
break;
case 27:
customerMaster.setGender(customerEntityValues.getValue());
break;
case 28:
customerMaster.setPassword(customerEntityValues.getValue());
break;
case 29:
customerMaster.setCompany(customerEntityValues.getValue());
break;
case 30:
customerMaster.setStreetAddress1(customerEntityValues.getValue());
break;
case 31:
customerMaster.setStreetAddress2(customerEntityValues.getValue());
break;
case 32:
customerMaster.setStreetAddress3(customerEntityValues.getValue());
break;
case 33:
customerMaster.setCity(customerEntityValues.getValue());
break;
case 34:
customerMaster.setCountry(customerEntityValues.getValue());
break;
case 35:
customerMaster.setState(customerEntityValues.getValue());
break;
case 36:
customerMaster.setPostalCode(customerEntityValues.getValue());
break;
case 37:
customerMaster.setPhone(customerEntityValues.getValue());
break;
case 38:
customerMaster.setFax(customerEntityValues.getValue());
break;
default:
break;
}
}
}
return customerMaster;
}
public List<CustomerMaster> getAllCustomers() {
List<CustomerMaster> customerMasterList = new ArrayList<>();
List<Customer> customerList = this.customerService.listcustomers();
for (Customer customer : customerList) {
List<CustomerEntityValues> customerEntityValuesList = this.customerEntityValuesService.getCustomerEntityValuesByCustomerId(customer.getId());
CustomerMaster customerMaster = new CustomerMaster();
customerMaster.setId(customer.getId());
customerMaster.setCustomerGroup(customer.getCustomerGroupId());
customerMaster.setEmail(customer.getEmail());
for (CustomerEntityValues customerEntityValues : customerEntityValuesList) {
switch (customerEntityValues.getAttributeId()) {
case 19:
customerMaster.setCustomerGroup(customer.getCustomerGroupId());
break;
case 20:
customerMaster.setPrefix(customerEntityValues.getValue());
break;
case 21:
customerMaster.setFirstName(customerEntityValues.getValue());
break;
case 22:
customerMaster.setMiddleName(customerEntityValues.getValue());
break;
case 23:
customerMaster.setLastName(customerEntityValues.getValue());
break;
case 24:
customerMaster.setEmail(customerEntityValues.getValue());
break;
case 25:
customerMaster.setDateOfBirth(customerEntityValues.getValue());
break;
case 26:
customerMaster.setTaxNumber(customerEntityValues.getValue());
break;
case 27:
customerMaster.setGender(customerEntityValues.getValue());
break;
case 28:
customerMaster.setPassword(customerEntityValues.getValue());
break;
case 29:
customerMaster.setCompany(customerEntityValues.getValue());
break;
case 30:
customerMaster.setStreetAddress1(customerEntityValues.getValue());
break;
case 31:
customerMaster.setStreetAddress2(customerEntityValues.getValue());
break;
case 32:
customerMaster.setStreetAddress3(customerEntityValues.getValue());
break;
case 33:
customerMaster.setCity(customerEntityValues.getValue());
break;
case 34:
customerMaster.setCountry(customerEntityValues.getValue());
break;
case 35:
customerMaster.setState(customerEntityValues.getValue());
break;
case 36:
customerMaster.setPostalCode(customerEntityValues.getValue());
break;
case 37:
customerMaster.setPhone(customerEntityValues.getValue());
break;
case 38:
customerMaster.setFax(customerEntityValues.getValue());
break;
default:
break;
}
}
customerMasterList.add(customerMaster);
}
return customerMasterList;
}
public int updateCustomer(JSONObject jObj) {
int status = 0;
Customer customer = null;
int customerId = 0;
try {
customerId = jObj.getInt("id");
customer = this.customerService.getcustomerById(customerId);
} catch (JSONException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
if ( null != customer ) {
System.out.println("Date:"+Utilities.getCurrentDateTime());
System.out.println("CO:"+customer.toString());
customer.setUpdatedAt(Utilities.getCurrentDateTime());
customer.setCreatedAt(customer.getCreatedAt());
try {
customer.setEmail(jObj.getString("email"));
customer.setCustomerGroupId(jObj.getInt("customerGroup"));
} catch (JSONException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
this.customerService.updatecustomer(customer);
List<Entities> listAttributes = this.entitiesService.listAttributes();
HashMap<Integer, String> attrs = getAttributesList(listAttributes, "Customer");
System.out.println("attrs==>"+attrs.toString());
for(Entry<Integer, String> entry : attrs.entrySet()) {
Integer attrId = entry.getKey();
String attrName = entry.getValue();
CustomerEntityValues customerEntityValue = this.customerEntityValuesService.getCustomerEntityValuesByCustomerIdAndAttributeId(customerId, attrId);
String attrValue;
try {
attrValue = jObj.getString(attrName);
if ( null != attrValue ) {
CustomerEntityValues custAttrValue = new CustomerEntityValues();
custAttrValue.setCustomerId(customerId);
custAttrValue.setLanguage(customerEntityValue.getLanguage());
custAttrValue.setAttributeId(attrId);
custAttrValue.setValue(attrValue);
custAttrValue.setId(customerEntityValue.getId());
customerEntityValuesService.updateCustomerAttributeValues(custAttrValue);
System.out.println("custAttrValue-->"+custAttrValue.toString());
}
} catch (JSONException e) {
e.printStackTrace();
}
}
status = 1;
}else{
status = 0;
}
return status;
}
public int addCustomer(JSONObject jObj) {
int cid = 0;
String emailId = null;
Customer customer = new Customer();
customer.setCreatedAt(Utilities.getCurrentDateTime());
customer.setUpdatedAt(Utilities.getCurrentDateTime());
try {
customer.setCustomerGroupId(jObj.getInt("customerGroup"));
emailId = jObj.getString("email");
System.out.println("EMAIL ID:"+emailId);
customer.setEmail(emailId);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if ( null == emailId ) {
return cid;
}else if ( isEmailAlreadyExists(emailId) ){
return cid;
}
customerService.addcustomer(customer);
cid = customer.getId();
System.out.println("customer==>"+customer.toString());
List<Entities> listAttributes = this.entitiesService.listAttributes();
HashMap<Integer, String> attrs = getAttributesList(listAttributes, "Customer");
System.out.println("attrs==>"+attrs.toString());
for(Entry<Integer, String> entry : attrs.entrySet()) {
Integer attrId = entry.getKey();
String attrName = entry.getValue();
String attrValue = null;
try {
attrValue = jObj.getString(attrName);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if ( null != attrValue ) {
CustomerEntityValues custAttrValue = new CustomerEntityValues();
custAttrValue.setCustomerId(cid);
custAttrValue.setLanguage("enUS");
custAttrValue.setAttributeId(attrId);
custAttrValue.setValue(attrValue);
customerEntityValuesService.addCustomerAttributeValues(custAttrValue);
System.out.println("custAttrValue-->"+custAttrValue.toString());
}
}
return cid;
/* //Rest call
final String SERVER_URI = "http://localhost:8080/jvoidattributes/listCustomerAttriburtes";
RestTemplate restTemplate = new RestTemplate();
String returnString = restTemplate.getForObject(SERVER_URI, String.class);
JSONObject returnJsonObj = null;
try {
returnJsonObj = new JSONObject(returnString);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("returnJsonObj=>"+returnJsonObj);
JSONArray arr = null;
try {
arr = returnJsonObj.getJSONArray("Attributes");
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int i=0; i<arr.length(); i++) {
try {
String attrValue = arr.getJSONObject(i).getString("code");
Integer attrId = Integer.parseInt(arr.getJSONObject(i).getString("id"));
System.out.println("id = "+attrId+" code = "+attrValue);
CustomerAttributeValues custAttrValue = new CustomerAttributeValues();
custAttrValue.setCustomerId(customer.getId());//get it from customer table
custAttrValue.setLanguage("enUS");
custAttrValue.setAttributeId(attrId);
custAttrValue.setValue(customerMaster.toAttributedHashMap().get(attrValue));
customerAttributeValuesService.addCustomerAttributeValues(custAttrValue);
System.out.println("custAttrValue-->"+custAttrValue.toString());
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
*/
}
public HashMap<Integer, String> getAttributesList(List<Entities> listAttributes, String type){
HashMap<Integer, String> attrMap = new HashMap<Integer, String>();
for(int i=0; i<listAttributes.size(); i++) {
if ( listAttributes.get(i).getType().equalsIgnoreCase(type) ){
attrMap.put(listAttributes.get(i).getId(), listAttributes.get(i).getCode());
}
}
return attrMap;
}
}