Subversion Repositories SmartDukaan

Rev

Rev 2708 | Rev 3010 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1946 chandransh 1
package in.shop2020.payment.service.handler;
2
 
3
import java.util.ArrayList;
4
import java.util.Date;
5
import java.util.HashMap;
6
import java.util.List;
7
import java.util.Map;
8
 
9
import org.apache.thrift.TException;
10
import org.springframework.context.ApplicationContext;
11
import org.springframework.context.support.ClassPathXmlApplicationContext;
12
 
2747 chandransh 13
import in.shop2020.payment.domain.Refund;
1946 chandransh 14
import in.shop2020.payment.handler.PaymentGatewayHandler;
15
import in.shop2020.payment.handler.PaymentHandler;
2747 chandransh 16
import in.shop2020.payment.handler.RefundHandler;
1946 chandransh 17
import in.shop2020.payments.Attribute;
18
import in.shop2020.payments.Payment;
19
import in.shop2020.payments.PaymentException;
20
import in.shop2020.payments.PaymentGateway;
21
import in.shop2020.payments.PaymentService.Iface;
22
import in.shop2020.payments.PaymentStatus;
23
 
24
public class PaymentServiceHandler implements Iface {
2391 chandransh 25
	public static final long PAYMENT_NOT_CREATED = -1;
26
	private static final String FLAG_KEY = "IsFlagged";
27
	private static final String TXN_KEY = "TransactionID";
28
	private static final String AUTH_TXN_ID = "AuthTxnId";
29
	private static final String CAPTURE_TXN_ID = "CaptureTxnId";
30
	private static final String CAPTURE_TIME = "CaptureTime";
31
 
1946 chandransh 32
	ApplicationContext context = new ClassPathXmlApplicationContext("context.xml");
33
	PaymentHandler paymentHandler = (PaymentHandler) context.getBean("paymentHandler");
34
	PaymentGatewayHandler paymentGatewayHandler = (PaymentGatewayHandler) context.getBean("paymentGatewayHandler");
2747 chandransh 35
	RefundHandler refundHandler = (RefundHandler) context.getBean("refundHandler");
1946 chandransh 36
 
37
	@Override
38
	public void closeSession() throws TException {
39
		// TODO Auto-generated method stub		
40
	}
41
 
42
	@Override
43
	public long createPayment(long userId, double amount, long gatewayId, long txnId) throws PaymentException, TException {
44
		in.shop2020.payment.domain.Payment payment = new in.shop2020.payment.domain.Payment();
45
		payment.setUserId(userId);
46
		payment.setAmount(amount);
47
		payment.setGatewayId(gatewayId);
48
		payment.setMerchantTxnId(txnId);
49
		payment.setStatus(PaymentStatus.INIT.getValue());
50
 
51
		return paymentHandler.insertPayment(payment);
52
	}
53
 
54
	@Override
55
	public List<Payment> getPaymentsForUser(long userId, long fromTime, long toTime, PaymentStatus status, long gatewayId) throws PaymentException, TException {
2291 chandransh 56
		int statusValue = -1;
57
		if(status != null)
58
			statusValue = status.getValue();
59
		else
60
			statusValue = -1;
61
		return getThriftPayments(paymentHandler.getPaymentsForUser(userId, fromTime, toTime, statusValue, gatewayId));
1946 chandransh 62
	}
63
 
64
	@Override
65
	public List<Payment> getPayments(long fromTime, long toTime, PaymentStatus status, long gatewayId) throws PaymentException,	TException {
2291 chandransh 66
		int statusValue = -1;
67
		if(status != null)
68
			statusValue = status.getValue();
69
		else
70
			statusValue = -1;
71
		return getThriftPayments(paymentHandler.getPayments(fromTime, toTime, statusValue, gatewayId));
1946 chandransh 72
	}
73
 
74
	@Override
75
	public PaymentGateway getPaymentGateway(long id) throws PaymentException, TException {
2291 chandransh 76
		return paymentGatewayHandler.getPaymentGateway(id).getThriftPaymentGateway();
1946 chandransh 77
	}
78
 
79
	@Override
80
	public Payment getPayment(long id) throws PaymentException, TException {
81
		return paymentHandler.getPayment(id).getThriftPayment();
82
	}
83
 
84
	@Override
85
	public List<Payment> getPaymentForTxnId(long txnId) throws PaymentException, TException {
86
		return getThriftPayments(paymentHandler.getPaymentForTxn(txnId));
87
	}
88
 
89
	@Override
90
	public boolean updatePaymentDetails(long id, String gatewayPaymentId,
91
			String sessionId, String gatewayTxnStatus, String description,
92
			String gatewayTxnId, String authCode, String referenceCode,
93
			String errorCode, PaymentStatus status, String gatewayTxnDate,
94
			List<Attribute> attributes) throws PaymentException, TException {
95
		in.shop2020.payment.domain.Payment payment = paymentHandler.getPayment(id);
96
		payment.setGatewayPaymentId(gatewayPaymentId);
97
		payment.setSessionId(sessionId);
98
		payment.setGatewayTxnStatus(gatewayTxnStatus);
99
		payment.setDescription(description);
100
		payment.setGatewayTxnId(gatewayTxnId);
101
		payment.setAuthCode(authCode);
102
		payment.setReferenceCode(referenceCode);
103
		payment.setErrorCode(errorCode);
104
		if(status!=null){
105
			payment.setStatus(status.getValue());
106
			if(status.equals(PaymentStatus.SUCCESS))
107
				payment.setSuccessTimestamp(new Date());
108
			else if(status.equals(PaymentStatus.FAILED))
109
				payment.setErrorTimestamp(new Date());
110
		}
111
 
112
		payment.setGatewayTxnDate(gatewayTxnDate);
113
 
114
		Map<String, String> attrMap = new HashMap<String, String>();
2272 rajveer 115
		if(attributes != null){
116
			for(Attribute attribute : attributes){
117
				attrMap.put(attribute.getName(), attribute.getValue());
118
			}
1946 chandransh 119
		}
120
 
121
		paymentHandler.updatePayment(payment, attrMap);
122
		return true;
123
	}
124
 
125
	@Override
126
	public List<Double> getSuccessfulPaymentsAmountRange() throws TException {
127
		List<Double> minMaxAmounts = new ArrayList<Double>();
128
		Map<String, Float> minMax = paymentHandler.getMinMaxPaymentAmount();
129
		minMaxAmounts.add(Double.parseDouble(Float.toString(minMax.get("MIN"))));
130
		minMaxAmounts.add(Double.parseDouble(Float.toString(minMax.get("MAX"))));
131
		return minMaxAmounts;
132
	}
133
 
134
	private List<Payment> getThriftPayments(List<in.shop2020.payment.domain.Payment> daoPayments){
135
		List<Payment> payments = new ArrayList<Payment>();
136
		for(in.shop2020.payment.domain.Payment payment : daoPayments){
137
			payments.add(payment.getThriftPayment());
138
		}
139
		return payments;
140
	}
2391 chandransh 141
 
142
	@Override
143
	public Payment updateAndCaptureEbsPayment(Map<String, String> paymentParams) throws PaymentException, TException {
144
		long merchantPaymentId = Long.parseLong(paymentParams.get("MerchantRefNo"));
145
		String gatewayPaymentId = paymentParams.get("PaymentID");
146
		double amount = Double.parseDouble(paymentParams.get("Amount"));
147
		String isFlagged = paymentParams.get(FLAG_KEY);
148
		String gatewayTxnStatus = paymentParams.get("ResponseCode");
149
		String description = paymentParams.get("ResponseMessage");
150
		String authTxnId = paymentParams.get(TXN_KEY);
151
 
152
 
153
		List<Attribute> attributes = new ArrayList<Attribute>();
154
		attributes.add(new Attribute(FLAG_KEY, isFlagged));
155
		attributes.add(new Attribute(AUTH_TXN_ID, authTxnId));
156
 
157
		Payment payment = null;
158
		try {
159
			payment = getPayment(merchantPaymentId);
160
		} catch (PaymentException e1) {
161
			throw new PaymentException(e1);
162
		}
163
 
164
		if(!validatePaymentParams(amount, payment)){
165
			throw new PaymentException(102, "Checks and balance failed on returned data");
166
		}
167
 
168
		if(gatewayTxnStatus.equals("0")){
169
			//Update payment status as authorized
170
			updatePaymentDetails(merchantPaymentId, gatewayPaymentId, "", gatewayTxnStatus, description, "", "", "", "", PaymentStatus.AUTHORIZED, "", attributes);
171
 
172
			Map<String, String> captureResult = EbsPaymentHandler.capturePayment(amount, "" + gatewayPaymentId);
173
 
174
			String captureStatus = captureResult.get(EbsPaymentHandler.STATUS);
175
 
176
			if("".equals(captureStatus)){
177
				//Failure
178
				description = captureResult.get(EbsPaymentHandler.ERROR);
179
				String errorCode = captureResult.get(EbsPaymentHandler.ERR_CODE);
180
 
181
				updatePaymentDetails(merchantPaymentId, gatewayPaymentId, "", gatewayTxnStatus, description, "", "", "", errorCode, PaymentStatus.FAILED, "", attributes);
182
			}else{
183
				//Success
184
				attributes.add(new Attribute(CAPTURE_TXN_ID, captureResult.get(EbsPaymentHandler.TXN_ID)));
185
				attributes.add(new Attribute(CAPTURE_TIME, captureResult.get(EbsPaymentHandler.DATE_TIME)));
186
 
187
				updatePaymentDetails(merchantPaymentId, gatewayPaymentId, "", captureStatus, description, "", "", "", "", PaymentStatus.SUCCESS, "", attributes);
188
			}
189
 
190
 
191
		}else{
192
			updatePaymentDetails(merchantPaymentId, gatewayPaymentId, "", gatewayTxnStatus, description, "", "", "", "", PaymentStatus.FAILED, "", attributes);		
193
		}
194
 
195
		payment = getPayment(merchantPaymentId);
196
 
197
		return payment;
198
	}
199
 
200
	@Override
201
	public String initializeHdfcPayment(long merchantPaymentId) throws PaymentException, TException {
202
		in.shop2020.payment.domain.Payment payment = paymentHandler.getPayment(merchantPaymentId);
203
		String redirectURL;
204
		try {
205
			redirectURL = HdfcPaymentHandler.initializeHdfcPayment(payment, this);
206
		} catch (Exception e) {
207
			throw new PaymentException(102, "Error while initiliazing payment. Check service log for more details.");
208
		}
209
		return redirectURL;
210
	}
211
 
212
	@Override
2708 chandransh 213
	public Map<String, String> captureHdfcPayment(long merchantPaymentId) throws PaymentException, TException {
2391 chandransh 214
		in.shop2020.payment.domain.Payment payment = paymentHandler.getPayment(merchantPaymentId);
215
		return HdfcPaymentHandler.capturePayment(payment);
216
	}
217
 
2689 chandransh 218
	@Override
2708 chandransh 219
	public Map<String, String> captureEbsPayment(long merchantPaymentId) throws PaymentException, TException {
220
		in.shop2020.payment.domain.Payment payment = paymentHandler.getPayment(merchantPaymentId);
221
		return EbsPaymentHandler.capturePayment(payment.getAmount(), payment.getGatewayPaymentId());
222
	}
223
 
224
	@Override
2689 chandransh 225
    public long createRefund(long orderId, long merchantTxnId, double amount) throws PaymentException, TException{
226
		List<in.shop2020.payment.domain.Payment> payments = paymentHandler.getPaymentForTxn(merchantTxnId);
227
		in.shop2020.payment.domain.Payment payment = null;
228
		if(payments ==null || payments.isEmpty())
229
			throw new PaymentException(104, "No payments found corresponding to the merchant txn " + merchantTxnId);
230
 
231
		payment = payments.get(0);
232
		if(payment.getStatus() != PaymentStatus.SUCCESS.getValue())
233
			throw new PaymentException(104, "No successful payments found corresponding to the merchant txn " + merchantTxnId);
234
 
2747 chandransh 235
		Refund refund = new Refund();
236
		refund.setOrderId(orderId);
237
		refund.setPaymentId(payment.getId());
238
		refund.setGatewayId(payment.getGatewayId());
239
		refund.setAmount(amount);
240
		refund.setAttempts(0);
241
		return refundHandler.createRefund(refund);
2689 chandransh 242
    }
243
 
2391 chandransh 244
	private boolean validatePaymentParams(double amount, Payment payment){
245
		if(payment==null || payment.getAmount()!= amount){
246
			// We did not request this payment or the authorised amount is different.
247
			return false;
248
		}
249
		return true;
250
	}
1946 chandransh 251
}