package org.taobao88.taobao.controllers;
import java.sql.Timestamp;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.taobao88.taobao.enterprise.dao.OrderDAO;
import org.taobao88.taobao.enterprise.dao.OrdersStatusesDAO;
import org.taobao88.taobao.enterprise.dao.PackagesStatusesDAO;
import org.taobao88.taobao.enterprise.dao.StatusesDAO;
import org.taobao88.taobao.enterprise.dao.UserDAO;
import org.taobao88.taobao.enterprise.dao.UuidDAO;
import org.taobao88.taobao.enterprise.entity.BalanceOperation;
import org.taobao88.taobao.enterprise.entity.Message;
import org.taobao88.taobao.enterprise.entity.OrderT;
import org.taobao88.taobao.enterprise.entity.OrdersStatuses;
import org.taobao88.taobao.enterprise.entity.PackageT;
import org.taobao88.taobao.enterprise.entity.PackagesStatuses;
import org.taobao88.taobao.enterprise.entity.Status;
import org.taobao88.taobao.enterprise.entity.UserT;
import org.taobao88.taobao.enterprise.entity.Uuid;
import org.taobao88.taobao.enterprise.service.BalanceService;
import org.taobao88.taobao.enterprise.service.MailService;
import org.taobao88.taobao.enterprise.service.MessagesService;
import org.taobao88.taobao.enterprise.service.PackageService;
import org.taobao88.taobao.enterprise.service.UserService;
import org.taobao88.taobao.mail.Templates;
import freemarker.template.Configuration;
@Controller
@RequestMapping(value = "/pay")
public class PayController {
@Autowired private UserDAO userDAO;
@Autowired private PackageService packageService;
@Autowired private BalanceService balanceService;
@Autowired private StatusesDAO statusesDAO;
@Autowired private OrdersStatusesDAO ordersStatusesDAO;
@Autowired private PackagesStatusesDAO packagesStatusesDAO;
@Autowired private MailService mailService;
@Autowired private UserService userService;
@Autowired private MessagesService messageService;
@Autowired private UuidDAO uuidDAO;
@Autowired private OrderDAO orderDAO;
@RequestMapping(value = "/deductFromAccount", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody String deductFromAccount(@RequestParam ("idPackage") int idPackage,
HttpServletRequest request) {
PackageT packageT = packageService.findPackageById(idPackage);
UserT user = (UserT) request.getSession().getAttribute("user");
double userBalance = balanceService.getBalance(user);
if (userBalance < packageT.getFullPrice()) {
return "{\"success\":false,\"message\":\"not_enough_money\"}";
} else {
BalanceOperation bo = new BalanceOperation();
bo.setUserT(user);
bo.setAmount(-packageT.getFullPrice());
bo.setCreatedAt(new Timestamp(new Date().getTime()));
bo.setUpdatedAt(new Timestamp(new Date().getTime()));
bo.setReason("Payment for package #" + packageT.getIdPackage() + " from user " + user.getFullNameUser() + " " + user.getFemailUser());
bo.setId(balanceService.adjustBalance(bo));
packageT.setPurchased(1);
packageT.setPurchasedAmount(packageT.getFullPrice());
packageService.updatePackage(packageT);
Status status = statusesDAO.findById(2);
PackagesStatuses ps = new PackagesStatuses();
ps.setPackageT(packageT);
ps.setStatus(status);
ps.setCreatedAt(new Timestamp(new Date().getTime()));
packagesStatusesDAO.add(ps);
for (OrderT o : packageT.getOrders()) {
OrdersStatuses os = new OrdersStatuses();
os.setOrderT(o);
os.setStatus(status);
os.setCreatedAt(ps.getCreatedAt());
ordersStatusesDAO.add(os);
o.setPurchasedAmount(o.getFullPrice());
o.setChanged(0);
orderDAO.updateOrder(o);
}
ResourceBundle getPath = ResourceBundle.getBundle("mail");
String from = getPath.getString("mailAdmin");
String to = getPath.getString("mailReceiver");
mailService.sendSimpleMessage(from, to, "Оплата посылки #" + packageT.getIdPackage(), Templates.getPaymentCompletedTemplate(user, packageT, bo));
Map<String, Object> templateModel = new HashMap<>();
templateModel.put("packageT", packageT);
templateModel.put("userT", user);
templateModel.put("transaction", bo);
mailService.sendMessageByFreemarkerTemplate((Configuration) request.getServletContext().getAttribute("freemarker_cfg"), templateModel, user.getGmail(), "Оплата посылки #" + packageT.getIdPackage(), "payment.ftl");
Message message = new Message();
message.setFromUser(userService.findUserById(1));
message.setToUser(user);
message.setMessage("Посылка #" + packageT.getIdPackage() + " успешно оплачена. Со счета списано $" + (-bo.getAmount()));
message.setPackageT(packageT);
messageService.createMessage(message);
return "{\"success\":true,\"message\":\"payment_completed\"}";
}
}
@RequestMapping(value = "/confirmBalanceAdjustment", method = RequestMethod.GET)
public String confirmBalanceAdjustment(HttpServletRequest request,
Model model) {
String uuidStr = request.getParameter("uuid");
Uuid uuid = uuidDAO.findUuid(uuidStr);
if (uuid != null) {
int amount = Integer.parseInt(request.getParameter("amount"));
int userId = Integer.parseInt(request.getParameter("userId"));
UserT user = userService.findUserById(userId);
BalanceOperation bo = new BalanceOperation();
bo.setUserT(user);
bo.setAmount(amount);
bo.setReason("Increment by Admin");
balanceService.adjustBalance(bo);
uuidDAO.deleteUuid(uuid);
model.addAttribute("confirmation_complete", true);
model.addAttribute("confirmation_user", user);
model.addAttribute("confirmation_amount", amount);
return "balancesAdmin";
} else {
model.addAttribute("confirmation_error", true);
return "balancesAdmin";
}
}
@RequestMapping(value = "/additionPay", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody String additionPay(@RequestParam ("idPackage") int idPackage,
HttpServletRequest request) {
PackageT packageT = packageService.findPackageById(idPackage);
UserT user = (UserT) request.getSession().getAttribute("user");
double userBalance = balanceService.getBalance(user);
if (userBalance < packageT.getFullPrice()) {
return "{\"success\":false,\"message\":\"not_enough_money\"}";
} else {
int toDeduction = packageT.getFullPrice() - packageT.getPurchasedAmount();
BalanceOperation bo = new BalanceOperation();
bo.setUserT(user);
bo.setAmount(-toDeduction);
bo.setCreatedAt(new Timestamp(new Date().getTime()));
bo.setUpdatedAt(new Timestamp(new Date().getTime()));
bo.setReason("Addition payment for package #" + packageT.getIdPackage() + " from user " + user.getFullNameUser() + " " + user.getFemailUser());
bo.setId(balanceService.adjustBalance(bo));
packageT.setPurchased(1);
packageT.setPurchasedAmount(packageT.getFullPrice());
packageService.updatePackage(packageT);
Status status = statusesDAO.findById(2);
for (OrderT o : packageT.getOrders()) {
if (o.getChanged() == 1) {
OrdersStatuses os = new OrdersStatuses();
os.setOrderT(o);
os.setStatus(status);
os.setCreatedAt(new Timestamp(new Date().getTime()));
ordersStatusesDAO.add(os);
o.setPurchasedAmount(o.getFullPrice());
o.setChanged(0);
orderDAO.updateOrder(o);
}
}
ResourceBundle getPath = ResourceBundle.getBundle("mail");
String from = getPath.getString("mailAdmin");
String to = getPath.getString("mailReceiver");
mailService.sendSimpleMessage(from, to, "Оплата посылки #" + packageT.getIdPackage(), Templates.getPaymentCompletedTemplate(user, packageT, bo));
Map<String, Object> templateModel = new HashMap<>();
templateModel.put("packageT", packageT);
templateModel.put("userT", user);
templateModel.put("transaction", bo);
mailService.sendMessageByFreemarkerTemplate((Configuration) request.getServletContext().getAttribute("freemarker_cfg"), templateModel, user.getGmail(), "Оплата посылки #" + packageT.getIdPackage(), "payment.ftl");
Message message = new Message();
message.setFromUser(userService.findUserById(1));
message.setToUser(user);
message.setMessage("Посылка #" + packageT.getIdPackage() + " успешно оплачена. Со счета списано $" + (-bo.getAmount()));
message.setPackageT(packageT);
messageService.createMessage(message);
return "{\"success\":true,\"message\":\"payment_completed\"}";
}
}
@RequestMapping(value = "/returnMoney", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody String returnMoney(@RequestParam ("idPackage") int idPackage,
HttpServletRequest request) {
PackageT packageT = packageService.findPackageById(idPackage);
UserT user = (UserT) request.getSession().getAttribute("user");
int toDeduction = packageT.getPurchasedAmount() - packageT.getFullPrice();
BalanceOperation bo = new BalanceOperation();
bo.setUserT(user);
bo.setAmount(toDeduction);
bo.setCreatedAt(new Timestamp(new Date().getTime()));
bo.setUpdatedAt(new Timestamp(new Date().getTime()));
bo.setReason("Return money for package #" + packageT.getIdPackage() + " from user " + user.getFullNameUser() + " " + user.getFemailUser());
bo.setId(balanceService.adjustBalance(bo));
packageT.setPurchasedAmount(packageT.getPurchasedAmount() - bo.getAmount());
packageService.updatePackage(packageT);
Status status = statusesDAO.findById(2);
for (OrderT o : packageT.getOrders()) {
if (o.getChanged() == 1) {
o.setChanged(0);
o.setPurchasedAmount(o.getFullPrice());
orderDAO.updateOrder(o);
ordersStatusesDAO.deleteAllByOrder(o);
OrdersStatuses os = new OrdersStatuses();
os.setOrderT(o);
os.setStatus(status);
os.setCreatedAt(new Timestamp(new Date().getTime()));
ordersStatusesDAO.add(os);
}
}
return "{\"success\":true,\"message\":\"return_completed\"}";
}
}