diff --git a/.gitignore b/.gitignore index a33ed9d..71b25b6 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ docker.sock .factorypath .settings/ .project +AGENTS.md diff --git a/pom.xml b/pom.xml index 18698e6..a152445 100644 --- a/pom.xml +++ b/pom.xml @@ -1,7 +1,6 @@ 4.0.0 - com.unicenta unicentaopos 5.4.0 @@ -116,7 +115,6 @@ poi 3.17 - org.apache.poi poi-ooxml @@ -181,7 +179,6 @@ slf4j-api - org.swinglabs.swingx @@ -255,11 +252,11 @@ derbytools ${derby.version} - - - - - + + + + + xml-apis xml-apis @@ -293,7 +290,6 @@ DynamicJasper-core-fonts 2.0 - org.eclipse.jdt.core.compiler ecj @@ -361,7 +357,7 @@ com.unicenta unicenta-plugins - 1.3.1 + 1.3.2-SNAPSHOT com.gluonhq @@ -450,7 +446,6 @@ 4.2.0 test - diff --git a/src/main/java/com/unicenta/pos/config/JPanelConfigPayment.java b/src/main/java/com/unicenta/pos/config/JPanelConfigPayment.java index dfd6084..ea12ec6 100644 --- a/src/main/java/com/unicenta/pos/config/JPanelConfigPayment.java +++ b/src/main/java/com/unicenta/pos/config/JPanelConfigPayment.java @@ -53,6 +53,7 @@ public class JPanelConfigPayment extends javax.swing.JPanel implements PanelConf initPayments("external", new ConfigPaymentPanelEmpty()); initPayments("PaymentSense", new ConfigPaymentPanelEmpty()); initPayments("Teya", new ConfigPaymentPanelEmpty()); + initPayments("MediaPayments", new ConfigPaymentPanelEmpty()); // Lector de tarjetas. jcboCardReader.addItem("Not defined"); @@ -91,9 +92,17 @@ public class JPanelConfigPayment extends javax.swing.JPanel implements PanelConf jcboCardReader.setSelectedItem(config.getProperty("payment.magcardreader")); jcboPaymentGateway.setSelectedItem(config.getProperty("payment.gateway")); - urlValue.setText(config.getProperty("payment.URL")); - deviceIdValue.setText(config.getProperty("payment.device-id")); - securityKeyValue.setText(config.getProperty("payment.security-key")); + + String gateway = comboValue(jcboPaymentGateway.getSelectedItem()); + if ("MediaPayments".equals(gateway)) { + urlValue.setText(config.getProperty("media-payments.pdq")); + deviceIdValue.setText(config.getProperty("media-payments.api-key")); + securityKeyValue.setText(config.getProperty("media-payments.secret")); + } else { + urlValue.setText(config.getProperty("payment.URL")); + deviceIdValue.setText(config.getProperty("payment.device-id")); + securityKeyValue.setText(config.getProperty("payment.security-key")); + } paymentConfiguration.loadProperties(config); dirty.setDirty(false); } @@ -107,9 +116,17 @@ public class JPanelConfigPayment extends javax.swing.JPanel implements PanelConf config.setProperty("payment.magcardreader", comboValue(jcboCardReader.getSelectedItem())); config.setProperty("payment.gateway", comboValue(jcboPaymentGateway.getSelectedItem())); - config.setProperty("payment.URL", urlValue.getText()); - config.setProperty("payment.device-id", deviceIdValue.getText()); - config.setProperty("payment.security-key", securityKeyValue.getText()); + + String gateway = comboValue(jcboPaymentGateway.getSelectedItem()); + if ("MediaPayments".equals(gateway)) { + config.setProperty("media-payments.pdq", urlValue.getText()); + config.setProperty("media-payments.api-key", deviceIdValue.getText()); + config.setProperty("media-payments.secret", securityKeyValue.getText()); + } else { + config.setProperty("payment.URL", urlValue.getText()); + config.setProperty("payment.device-id", deviceIdValue.getText()); + config.setProperty("payment.security-key", securityKeyValue.getText()); + } paymentConfiguration.saveProperties(config); dirty.setDirty(false); } @@ -275,6 +292,9 @@ public class JPanelConfigPayment extends javax.swing.JPanel implements PanelConf paymentConfiguration = paymentsName.get(comboValue(jcboPaymentGateway.getSelectedItem())); if (comboValue(jcboPaymentGateway.getSelectedItem()).equals("PaymentSense")) { + urlLabel.setText("URL"); + deviceIdLabel.setText("Device ID"); + securityKeyLabel.setText("Security Key"); emvConfigPanel.setVisible(Boolean.TRUE); jcboCardReader.setSelectedItem("EMV"); jcboCardReader.setEnabled(Boolean.FALSE); @@ -285,7 +305,18 @@ public class JPanelConfigPayment extends javax.swing.JPanel implements PanelConf jcboCardReader.setSelectedItem("EMV"); jcboCardReader.setEnabled(Boolean.FALSE); } + else if (comboValue(jcboPaymentGateway.getSelectedItem()).equals("MediaPayments")) { + urlLabel.setText("Terminal ID"); + deviceIdLabel.setText("API Key"); + securityKeyLabel.setText("Security Key"); + emvConfigPanel.setVisible(Boolean.TRUE); + jcboCardReader.setSelectedItem("EMV"); + jcboCardReader.setEnabled(Boolean.FALSE); + } else { + urlLabel.setText("URL"); + deviceIdLabel.setText("Device ID"); + securityKeyLabel.setText("Security Key"); emvConfigPanel.setVisible(Boolean.FALSE); jcboCardReader.setEnabled(Boolean.TRUE); } diff --git a/src/main/java/com/unicenta/pos/payment/PaymentGatewayFac.java b/src/main/java/com/unicenta/pos/payment/PaymentGatewayFac.java index c0a8f55..2c27bf7 100644 --- a/src/main/java/com/unicenta/pos/payment/PaymentGatewayFac.java +++ b/src/main/java/com/unicenta/pos/payment/PaymentGatewayFac.java @@ -41,6 +41,8 @@ public class PaymentGatewayFac { return new PaymentGatewayPaymentSense(); case "Teya": return new PaymentGatewayTeya(); + case "MediaPayments": + return new PaymentGatewayMediaPayments(); default: return null; } diff --git a/src/main/java/com/unicenta/pos/payment/PaymentGatewayMediaPayments.java b/src/main/java/com/unicenta/pos/payment/PaymentGatewayMediaPayments.java new file mode 100644 index 0000000..72339cb --- /dev/null +++ b/src/main/java/com/unicenta/pos/payment/PaymentGatewayMediaPayments.java @@ -0,0 +1,98 @@ +// uniCenta oPOS - Touch Friendly Point Of Sale +// Copyright (c) 2009-2018 uniCenta & previous Openbravo POS works +// https://unicenta.com +// +// This file is part of uniCenta oPOS +// +// uniCenta oPOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// uniCenta oPOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with uniCenta oPOS. If not, see . + +package com.unicenta.pos.payment; + +import com.unicenta.plugins.Application; +import com.unicenta.plugins.common.AppContext; +import com.unicenta.pos.util.RoundUtils; +import lombok.extern.slf4j.Slf4j; + +import java.awt.*; +import java.util.ArrayList; + +@Slf4j +public class PaymentGatewayMediaPayments implements PaymentGateway { + + public PaymentGatewayMediaPayments() { + } + + Window getPaymentWindow(double amount) { + if (amount > 0) { + ArrayList paymentWindows = new ArrayList<>(); + for (Window window : Window.getWindows()) { + if (window instanceof JPaymentSelectReceipt) { + paymentWindows.add((JPaymentSelectReceipt) window); + } + } + return paymentWindows.get(paymentWindows.size()-1); + } + else { + ArrayList paymentWindows = new ArrayList<>(); + for (Window window : Window.getWindows()) { + if (window instanceof JPaymentSelectRefund) { + paymentWindows.add((JPaymentSelectRefund) window); + } + } + return paymentWindows.get(paymentWindows.size()-1); + } + } + + @Override + public void execute(PaymentInfoMagcard payinfo) { + + int timer = 0; + int timeout = 180; + + double roundedValue = RoundUtils.round(payinfo.getTotal()); + new Application().mediaPaymentsTransaction(roundedValue, getPaymentWindow(roundedValue)); + + while (AppContext.getIsProcessing() == null || AppContext.getIsProcessing()) { + try { + log.info("uniCenta-oPos: waiting for payment to complete ...."); + Thread.sleep(1000); + timer += 1; + if (timer > timeout) break; + } catch (InterruptedException e) { + log.error(e.getMessage()); + } + } + + if (AppContext.getMediaPaymentsPaymentResult() == null) { + payinfo.paymentError("Transaction Error! Please try again", "No Response"); + } + else if ("APPROVED".equals(AppContext.getMediaPaymentsPaymentResult().getProcessingDetails().getStatus())) { + payinfo.setCardName(AppContext.getMediaPaymentsPaymentResult().getProcessingDetails().getCard().getType()); + payinfo.setVerification(AppContext.getMediaPaymentsPaymentResult().getProcessingDetails().getVerificationMethod()); + payinfo.setChipAndPin(true); + payinfo.paymentOK( + AppContext.getMediaPaymentsPaymentResult().getAdditionalInformation().getRequestId(), + AppContext.getMediaPaymentsPaymentResult().getTransactionDetails().getId(), + AppContext.getMediaPaymentsPaymentResult().getProcessingDetails().getStatus() + ); + } + else { + String errorMsg = AppContext.getMediaPaymentsPaymentResult().getErrorMessage(); + if (errorMsg == null) { + errorMsg = AppContext.getMediaPaymentsPaymentResult().getMessage(); + } + payinfo.paymentError("Transaction Error! Please try again", errorMsg); + } + } +} diff --git a/test.jpg b/test.jpg new file mode 100644 index 0000000..13f3618 Binary files /dev/null and b/test.jpg differ