Commit 4f07bdd7 authored by Wahyu Wibowo's avatar Wahyu Wibowo

add fitur payment

parent 7490e8df
package com.example.yourcashiertest.activities; package com.example.yourcashiertest.activities;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil; import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import android.content.Intent; import android.content.Intent;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import com.example.yourcashiertest.R; import com.example.yourcashiertest.R;
import com.example.yourcashiertest.adapters.CartAdapter; import com.example.yourcashiertest.adapters.CartAdapter;
import com.example.yourcashiertest.databinding.ActivityCartBinding; import com.example.yourcashiertest.databinding.ActivityCartBinding;
import com.example.yourcashiertest.entities.Cart; import com.example.yourcashiertest.entities.Cart;
import com.example.yourcashiertest.utils.Convert;
import com.example.yourcashiertest.viewmodels.CartViewModel; import com.example.yourcashiertest.viewmodels.CartViewModel;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.List;
public class CartActivity extends AppCompatActivity { public class CartActivity extends AppCompatActivity {
ActivityCartBinding binding; ActivityCartBinding binding;
CartAdapter adapter; CartAdapter adapter;
private static int SUM = 0;
public static String PRICE = "price";
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
...@@ -37,35 +34,32 @@ public class CartActivity extends AppCompatActivity { ...@@ -37,35 +34,32 @@ public class CartActivity extends AppCompatActivity {
CartViewModel cartViewModel = new ViewModelProvider(this).get(CartViewModel.class); CartViewModel cartViewModel = new ViewModelProvider(this).get(CartViewModel.class);
cartViewModel.getCarts().observe(this, carts -> adapter.setCartList(carts)); cartViewModel.getCarts().observe(this, carts -> adapter.setCartList(carts));
cartViewModel.getCarts().observe(this, new Observer<List<Cart>>() { cartViewModel.getCarts().observe(this, carts -> {
@Override int count = 0;
public void onChanged(List<Cart> carts) { if (carts.size() != 0){
int sum = 0;
for (int i = 0; i < carts.size(); i++){ for (int i = 0; i < carts.size(); i++){
sum += carts.get(i).getPrice(); count += carts.get(i).getPrice();
} }
binding.tvTotalPrice.setText(String.valueOf(sum));
} }
SUM = count;
binding.tvTotalPrice.setText(Convert.changeToCurrency(SUM));
}); });
adapter.setCartListener(new CartAdapter.CartListener() { adapter.setCartListener(new CartAdapter.CartListener() {
@RequiresApi(api = Build.VERSION_CODES.N)
@Override @Override
public void onIncrease(Cart cart) { public void onIncrease(Cart cart) {
cart.setQty(cart.getQty() + 1); cart.setQty(cart.getQty() + 1);
cart.setPrice(Math.multiplyExact(cart.getRealPrice(), cart.getQty())); cart.setPrice(cart.getRealPrice() * cart.getQty());
cartViewModel.updateCart(cart); cartViewModel.updateCart(cart);
} }
@RequiresApi(api = Build.VERSION_CODES.N)
@Override @Override
public void onDecrease(Cart cart) { public void onDecrease(Cart cart) {
cart.setQty(cart.getQty() - 1); cart.setQty(cart.getQty() - 1);
if (cart.getQty() == 0){ cart.setPrice(cart.getRealPrice() * cart.getQty());
cartViewModel.updateCart(cart);
if (cart.getQty() <= 0){
cartViewModel.deleteCart(cart); cartViewModel.deleteCart(cart);
}else {
cart.setPrice(Math.multiplyExact(cart.getRealPrice(), cart.getQty()));
cartViewModel.updateCart(cart);
} }
} }
}); });
...@@ -74,23 +68,15 @@ public class CartActivity extends AppCompatActivity { ...@@ -74,23 +68,15 @@ public class CartActivity extends AppCompatActivity {
binding.ivBtnBack.setOnClickListener(view -> startActivity(new Intent(CartActivity.this, MainActivity.class))); binding.ivBtnBack.setOnClickListener(view -> startActivity(new Intent(CartActivity.this, MainActivity.class)));
binding.btnCheckout.setOnClickListener(view -> { binding.btnCheckout.setOnClickListener(view -> {
startActivity(new Intent(CartActivity.this, PaymentActivity.class)); startActivity(new Intent(CartActivity.this, PaymentActivity.class).putExtra(PRICE, SUM));
finish(); finish();
}); });
} }
@Override
private String changeToCurrency(int totalPrice){ protected void onDestroy() {
DecimalFormat decimalFormat = (DecimalFormat) DecimalFormat.getCurrencyInstance(); super.onDestroy();
binding = null;
DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols();
formatSymbols.setCurrencySymbol("Rp. ");
formatSymbols.setMonetaryDecimalSeparator(',');
formatSymbols.setGroupingSeparator('.');
String priceRupiah = decimalFormat.format(totalPrice);
return priceRupiah;
} }
} }
\ No newline at end of file
...@@ -3,7 +3,6 @@ package com.example.yourcashiertest.activities; ...@@ -3,7 +3,6 @@ package com.example.yourcashiertest.activities;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil; import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import android.Manifest; import android.Manifest;
...@@ -12,8 +11,6 @@ import android.content.Intent; ...@@ -12,8 +11,6 @@ import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.text.Editable; import android.text.Editable;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.view.Menu;
import android.view.View;
import android.widget.PopupMenu; import android.widget.PopupMenu;
import android.widget.Toast; import android.widget.Toast;
...@@ -22,12 +19,9 @@ import com.example.yourcashiertest.adapters.ProductAdapter; ...@@ -22,12 +19,9 @@ import com.example.yourcashiertest.adapters.ProductAdapter;
import com.example.yourcashiertest.databinding.ActivityMainBinding; import com.example.yourcashiertest.databinding.ActivityMainBinding;
import com.example.yourcashiertest.entities.Cart; import com.example.yourcashiertest.entities.Cart;
import com.example.yourcashiertest.entities.Product; import com.example.yourcashiertest.entities.Product;
import com.example.yourcashiertest.models.CartModel;
import com.example.yourcashiertest.viewmodels.CartViewModel; import com.example.yourcashiertest.viewmodels.CartViewModel;
import com.example.yourcashiertest.viewmodels.ProductViewModel; import com.example.yourcashiertest.viewmodels.ProductViewModel;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity { public class MainActivity extends AppCompatActivity {
...@@ -41,6 +35,7 @@ public class MainActivity extends AppCompatActivity { ...@@ -41,6 +35,7 @@ public class MainActivity extends AppCompatActivity {
Manifest.permission.WRITE_EXTERNAL_STORAGE}; Manifest.permission.WRITE_EXTERNAL_STORAGE};
public static boolean visibility = false; public static boolean visibility = false;
ProductViewModel viewModel;
CartViewModel cartViewModel; CartViewModel cartViewModel;
@Override @Override
...@@ -92,7 +87,7 @@ public class MainActivity extends AppCompatActivity { ...@@ -92,7 +87,7 @@ public class MainActivity extends AppCompatActivity {
}); });
binding.rvProducts.setAdapter(adapter); binding.rvProducts.setAdapter(adapter);
ProductViewModel viewModel = new ViewModelProvider(this).get(ProductViewModel.class); viewModel = new ViewModelProvider(this).get(ProductViewModel.class);
viewModel.getProducts().observe(this, adapter::setProducts); viewModel.getProducts().observe(this, adapter::setProducts);
adapter.setListener(new ProductAdapter.ProductListener() { adapter.setListener(new ProductAdapter.ProductListener() {
...@@ -134,6 +129,8 @@ public class MainActivity extends AppCompatActivity { ...@@ -134,6 +129,8 @@ public class MainActivity extends AppCompatActivity {
public void addToCart(Product product){ public void addToCart(Product product){
product.setQuantity(product.getQuantity() - 1);
viewModel.updateProduct(product);
Cart cart = new Cart(0,"", "", 0, 0, 0); Cart cart = new Cart(0,"", "", 0, 0, 0);
cart.setIdProduct(product.getId()); cart.setIdProduct(product.getId());
cart.setImage(product.getPhoto()); cart.setImage(product.getPhoto());
...@@ -142,7 +139,7 @@ public class MainActivity extends AppCompatActivity { ...@@ -142,7 +139,7 @@ public class MainActivity extends AppCompatActivity {
cart.setQty(1); cart.setQty(1);
cart.setRealPrice(product.getPrice()); cart.setRealPrice(product.getPrice());
cartViewModel.insertCart(cart); cartViewModel.insertCart(cart);
Toast.makeText(MainActivity.this, "Data berhasil ditambahkan ke keranjang", Toast.LENGTH_LONG).show(); Toast.makeText(MainActivity.this, "Produk berhasil ditambahkan ke keranjang", Toast.LENGTH_LONG).show();
} }
......
package com.example.yourcashiertest.activities; package com.example.yourcashiertest.activities;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.cardview.widget.CardView; import androidx.cardview.widget.CardView;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.ViewModelProvider;
import android.content.Intent; import android.content.Intent;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log;
import android.view.View; import android.view.View;
import com.example.yourcashiertest.R; import com.example.yourcashiertest.R;
import com.example.yourcashiertest.databinding.ActivityPaymentBinding;
import com.example.yourcashiertest.utils.Convert;
import com.example.yourcashiertest.viewmodels.CartViewModel;
public class PaymentActivity extends AppCompatActivity { public class PaymentActivity extends AppCompatActivity {
ActivityPaymentBinding binding;
public static String REFUND = "refund";
public int refund;
public int amount;
CartViewModel cartViewModel;
@RequiresApi(api = Build.VERSION_CODES.N)
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_payment); binding = DataBindingUtil.setContentView(this, R.layout.activity_payment);
cartViewModel = new ViewModelProvider(this).get(CartViewModel.class);
amount = getIntent().getIntExtra(CartActivity.PRICE, 0);
binding.setAmount(Convert.changeToCurrency(amount));
} }
public void btnPay(View view) { public void btnPay(View view) {
startActivity(new Intent(PaymentActivity.this, StatusPayment.class)); int amountPaid = Integer.parseInt(binding.etAmountPaid.getText().toString());
refund = amountPaid - amount;
startActivity(new Intent(PaymentActivity.this, StatusPayment.class).putExtra(REFUND, refund));
cartViewModel.clear();
finish(); finish();
} }
@Override
protected void onDestroy() {
super.onDestroy();
binding = null;
}
} }
\ No newline at end of file
package com.example.yourcashiertest.activities; package com.example.yourcashiertest.activities;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log;
import android.view.View; import android.view.View;
import com.example.yourcashiertest.R; import com.example.yourcashiertest.R;
import com.example.yourcashiertest.databinding.ActivityStatusPaymentBinding;
import com.example.yourcashiertest.utils.Convert;
public class StatusPayment extends AppCompatActivity { public class StatusPayment extends AppCompatActivity {
ActivityStatusPaymentBinding binding;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_status_payment); binding = DataBindingUtil.setContentView(this, R.layout.activity_status_payment);
int refund = getIntent().getIntExtra(PaymentActivity.REFUND, 0);
Log.d("Tag", String.valueOf(refund));
binding.setRefund(Convert.changeToCurrency(refund));
} }
public void btnFinish(View view) { public void btnFinish(View view) {
startActivity(new Intent(StatusPayment.this, MainActivity.class)); startActivity(new Intent(StatusPayment.this, MainActivity.class));
finish(); finish();
} }
@Override
protected void onDestroy() {
super.onDestroy();
binding = null;
}
} }
\ No newline at end of file
...@@ -25,4 +25,7 @@ public interface CartDao { ...@@ -25,4 +25,7 @@ public interface CartDao {
@Delete @Delete
public void deleteCart(Cart cart); public void deleteCart(Cart cart);
@Query("DELETE FROM Cart")
public void deletAll();
} }
...@@ -32,6 +32,10 @@ public class CartRepository { ...@@ -32,6 +32,10 @@ public class CartRepository {
LocalDatabase.databaseWriteExecutor.execute(() -> cartDao.deleteCart(cart)); LocalDatabase.databaseWriteExecutor.execute(() -> cartDao.deleteCart(cart));
} }
public void clear(){
LocalDatabase.databaseWriteExecutor.execute(() -> cartDao.deletAll());
}
public LiveData<List<Cart>> getAllCart(){ public LiveData<List<Cart>> getAllCart(){
return this.carts; return this.carts;
} }
......
package com.example.yourcashiertest.utils;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
public class Convert {
public static String changeToCurrency(long totalPrice){
DecimalFormat decimalFormat = (DecimalFormat) DecimalFormat.getCurrencyInstance();
DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols();
formatSymbols.setCurrencySymbol("Rp. ");
formatSymbols.setMonetaryDecimalSeparator(',');
formatSymbols.setGroupingSeparator('.');
String priceRupiah = decimalFormat.format(totalPrice);
return priceRupiah;
}
}
...@@ -40,6 +40,10 @@ public class CartViewModel extends AndroidViewModel { ...@@ -40,6 +40,10 @@ public class CartViewModel extends AndroidViewModel {
repository.delete(cart); repository.delete(cart);
} }
public void clear(){
repository.clear();
}
public MutableLiveData<Cart> getCart(){ public MutableLiveData<Cart> getCart(){
return this.cart; return this.cart;
} }
......
...@@ -79,7 +79,6 @@ ...@@ -79,7 +79,6 @@
android:layout_height="20dp" android:layout_height="20dp"
android:gravity="top" android:gravity="top"
android:textColor="#fff" android:textColor="#fff"
android:text=""
android:textAppearance="@style/some_id" android:textAppearance="@style/some_id"
app:layout_constraintBottom_toBottomOf="@+id/amount" app:layout_constraintBottom_toBottomOf="@+id/amount"
app:layout_constraintEnd_toEndOf="@+id/amount" app:layout_constraintEnd_toEndOf="@+id/amount"
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools">
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
tools:context=".activities.StatusPayment">
<TextView <data>
android:id="@+id/tvPaymentStatus" <variable
android:layout_width="wrap_content" name="refund"
android:layout_height="wrap_content" type="String" />
android:layout_marginTop="16dp" </data>
android:gravity="top"
android:text="@string/payment_status"
android:textAppearance="@style/payment"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.072"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/icConfirmed"
android:layout_width="150dp"
android:layout_height="130dp"
android:src="@drawable/confirmed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvPaymentStatus"
android:layout_marginTop="40dp"
tools:layout_editor_absoluteX="140dp"
tools:layout_editor_absoluteY="29dp" />
<TextView
android:id="@+id/tvPaymentSuccess"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:layout_marginTop="20dp" android:padding="10dp"
android:textSize="24dp" tools:context=".activities.StatusPayment">
android:gravity="center"
android:text="@string/payment_by_cash_was_successful"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/icConfirmed" />
<TextView <TextView
android:id="@+id/tvRefund" android:id="@+id/tvPaymentStatus"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="64dp" android:layout_marginTop="16dp"
android:gravity="center" android:gravity="top"
android:text="@string/refund" android:text="@string/payment_status"
android:textSize="35dp" android:textAppearance="@style/payment"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0" app:layout_constraintHorizontal_bias="0.072"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvPaymentSuccess" /> app:layout_constraintTop_toTopOf="parent" />
<TextView <ImageView
android:id="@+id/tvNominalRefund" android:id="@+id/icConfirmed"
android:layout_width="match_parent" android:layout_width="150dp"
android:layout_height="wrap_content" android:layout_height="130dp"
android:layout_marginTop="28dp" android:src="@drawable/confirmed"
android:gravity="center" app:layout_constraintStart_toStartOf="parent"
android:text="Rp. 44000" app:layout_constraintEnd_toEndOf="parent"
android:textSize="45dp" app:layout_constraintTop_toBottomOf="@id/tvPaymentStatus"
app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="40dp"
app:layout_constraintHorizontal_bias="0.0" tools:layout_editor_absoluteX="140dp"
app:layout_constraintStart_toStartOf="parent" tools:layout_editor_absoluteY="29dp" />
app:layout_constraintTop_toBottomOf="@id/tvRefund" />
<com.google.android.material.button.MaterialButton <TextView
android:id="@+id/btnFinish" android:id="@+id/tvPaymentSuccess"
android:onClick="btnFinish" android:layout_width="match_parent"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_height="60dp" android:layout_marginTop="20dp"
android:text="FINISH" android:textSize="24dp"
android:textSize="20dp" android:gravity="center"
app:layout_constraintBottom_toBottomOf="parent" android:text="@string/payment_by_cash_was_successful"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0" app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvNominalRefund" app:layout_constraintTop_toBottomOf="@id/icConfirmed" />
app:layout_constraintVertical_bias="1.0" />
<TextView
android:id="@+id/tvRefund"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="64dp"
android:gravity="center"
android:text="@string/refund"
android:textSize="35dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvPaymentSuccess" />
<TextView
android:id="@+id/tvNominalRefund"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="28dp"
android:gravity="center"
android:text="@{refund}"
android:textSize="45dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvRefund" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnFinish"
android:onClick="btnFinish"
android:layout_width="match_parent"
android:layout_height="60dp"
android:text="FINISH"
android:textSize="20dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvNominalRefund"
app:layout_constraintVertical_bias="1.0" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file </layout>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment