diff --git a/web/org.openbravo.retail.posterminal/js/model/order.js b/web/org.openbravo.retail.posterminal/js/model/order.js
--- a/web/org.openbravo.retail.posterminal/js/model/order.js
+++ b/web/org.openbravo.retail.posterminal/js/model/order.js
@@ -1659,6 +1659,8 @@
         order.trigger('displayTotal');
         order.save();
       }); // call with callback, no args
+      // isCash check enough cash available.
+      order.trigger('checkaddpayment', order, payment);
     },
 
     overpaymentExists: function () {
diff --git a/web/org.openbravo.retail.posterminal/js/pointofsale/view/payment.js b/web/org.openbravo.retail.posterminal/js/pointofsale/view/payment.js
--- a/web/org.openbravo.retail.posterminal/js/pointofsale/view/payment.js
+++ b/web/org.openbravo.retail.posterminal/js/pointofsale/view/payment.js
@@ -528,6 +528,7 @@
       this.$.doneButton.setDisabled(true);
       this.$.exactButton.setDisabled(true);
     }
+    return hasEnoughCash;
   },
 
   initComponents: function () {
@@ -567,6 +568,39 @@
         return;
       }
     }, this);
+    this.model.get('order').on('checkaddpayment', function (order, paymentMeth) {
+      var paymentstatus, payment;
+      if (!_.isUndefined(order) && !_.isUndefined(paymentMeth)) {
+        // validate the payment isCash
+        if (paymentMeth.get('isCash')) {
+          paymentstatus = order.getPaymentStatus();
+          payment = OB.MobileApp.model.paymentnames[OB.MobileApp.model.get('paymentcash')];
+          if (!this.checkEnoughCashAvailable(paymentstatus, payment)) {
+            payments = order.get('payments');
+            var i = 0;
+            var currentCash = OB.DEC.Zero;
+            if (payment.currentCash > 0) {
+              currentCash = payment.currentCash;
+            }
+            for (i; i < payments.length; i++) {
+              var p = payments.at(i);
+              if (p.get('isCash')) {
+                // 1. delete the current cash payment.
+                // order.removePayment(p);
+                // 2. Actual payment cash amount is less than available cash, not modify
+                if (OB.DEC.compare(currentCash - p.get('amount')) < 0) {
+                  // 2. Set the actual available cash because the cash payment is higher
+                  p.set('amount', currentCash);
+                }
+                order.adjustPayment();
+                order.trigger('displayTotal');
+                return;
+              }
+            }
+          }
+        }
+      }
+    }, this);
     //    this.model.get('multiOrders').on('change:isMultiOrders', function () {
     //      if (!this.model.get('multiOrders').get('isMultiOrders')) {
     //        this.$.multiPayments.hide();
