BasketInvoiceRestController.java
package sk.iway.iwcm.components.basket.rest;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import sk.iway.iwcm.Constants;
import sk.iway.iwcm.SendMail;
import sk.iway.iwcm.common.CloudToolsForCore;
import sk.iway.iwcm.components.basket.jpa.BasketInvoiceEditorFields;
import sk.iway.iwcm.components.basket.jpa.BasketInvoiceEntity;
import sk.iway.iwcm.components.basket.jpa.BasketInvoicesRepository;
import sk.iway.iwcm.i18n.Prop;
import sk.iway.iwcm.system.datatable.Datatable;
import sk.iway.iwcm.system.datatable.DatatablePageImpl;
import sk.iway.iwcm.system.datatable.DatatableRestControllerV2;
import sk.iway.iwcm.system.datatable.ProcessItemAction;
@RestController
@RequestMapping("/admin/rest/eshop/basket")
@PreAuthorize("@WebjetSecurityService.hasPermission('cmp_basket')")
@Datatable
public class BasketInvoiceRestController extends DatatableRestControllerV2<BasketInvoiceEntity, Long> {
private final BasketInvoicesRepository basketInvoicesRepository;
private static final String ORDER_PLACEHOLDER = "{ORDER_DETAILS}";
private static final String STATUS_PLACEHOLDER = "{STATUS}";
@Autowired
public BasketInvoiceRestController(BasketInvoicesRepository basketInvoicesRepository) {
super(basketInvoicesRepository);
this.basketInvoicesRepository = basketInvoicesRepository;
}
@Override
public Page<BasketInvoiceEntity> getAllItems(Pageable pageable) {
DatatablePageImpl<BasketInvoiceEntity> page = new DatatablePageImpl<>(basketInvoicesRepository.findAllByDomainId(CloudToolsForCore.getDomainId(), pageable));
fillStatusSelect(page);
processFromEntity(page, ProcessItemAction.GETALL);
return page;
}
@Override
public void afterSave(BasketInvoiceEntity entity, BasketInvoiceEntity saved) {
BasketInvoiceEditorFields bied = entity.getEditorFields();
if(bied != null && Boolean.TRUE.equals(bied.getSendNotification())) {
StringBuilder sb = new StringBuilder();
//Styles
sb.append(bied.getOrderRecapHead());
//Email body AND replace "{ORDER_DETAILS}" with actual order details
sb.append( bied.getBody().replace(ORDER_PLACEHOLDER, bied.getOrderRecapBody()) );
//
Integer actualStatus = basketInvoicesRepository.getStatusId(saved.getId(), CloudToolsForCore.getDomainId());
sb.replace(sb.indexOf(STATUS_PLACEHOLDER), sb.indexOf(STATUS_PLACEHOLDER) + STATUS_PLACEHOLDER.length(), actualStatus.toString());
boolean emailSendOK = SendMail.send(getUser().getFullName(), getUser().getEmail(), entity.getContactEmail(), bied.getSubject(), sb.toString(), getRequest());
if(!emailSendOK) throwError("components.basket.errorSendingEmail");
}
}
@Override
public BasketInvoiceEntity processFromEntity(BasketInvoiceEntity entity, ProcessItemAction action) {
if(entity.getEditorFields() == null) {
BasketInvoiceEditorFields bief = new BasketInvoiceEditorFields();
bief.fromBasketInvoice(entity, getRequest());
}
return entity;
}
@Override
public boolean deleteItem(BasketInvoiceEntity entity, long id) {
//DELETE action is allowed only if basketInvoiced is set as CANCELLED
if(entity.getStatusId().equals(BasketInvoiceEntity.INVOICE_STATUS_CANCELLED) ) {
return super.deleteItem(entity, id);
} else {
//Reject delete
throwError("components.basket.invoice.delete_err");
return false;
}
}
@Override
public BasketInvoiceEntity insertItem(BasketInvoiceEntity entity) {
throwError(getProp().getText("config.not_permitted_action_err"));
return null;
}
@Override
public void beforeDuplicate(BasketInvoiceEntity entity) {
throwError(getProp().getText("config.not_permitted_action_err"));
}
private final void fillStatusSelect(DatatablePageImpl<BasketInvoiceEntity> page) {
String label = "statusId";
Prop prop = getProp();
//Add default statuses
String defaultKeyPrefix = "components.basket.invoice.status.";
page.addDefaultOption(label, prop.getText( defaultKeyPrefix + "1" ), "1");
page.addDefaultOption(label, prop.getText( defaultKeyPrefix + "2" ), "2");
page.addDefaultOption(label, prop.getText( defaultKeyPrefix + "3" ), "3");
page.addDefaultOption(label, prop.getText( defaultKeyPrefix + "4" ), "4");
page.addDefaultOption(label, prop.getText( defaultKeyPrefix + "5" ), "5");
page.addDefaultOption(label, prop.getText( defaultKeyPrefix + "8" ), "8");
//Add custom statuses
Map<String, String> bonusStatuses = Constants.getHashtable("basketInvoiceBonusStatuses");
for (Map.Entry<String, String> entry : bonusStatuses.entrySet()) {
//It must be number 10 or higher, lower numbers are reserved for default statuses
if(Integer.valueOf(entry.getKey()) >= 10)
page.addDefaultOption(label, prop.getText( entry.getValue() ), entry.getKey());
}
}
}