Advertisement
kitlolz012

anti multiple booking 2

Nov 15th, 2023
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 20.45 KB | Source Code | 0 0
  1. package com.example.gypsy;
  2.  
  3. import androidx.annotation.NonNull;
  4. import androidx.appcompat.app.AppCompatActivity;
  5.  
  6. import android.app.DatePickerDialog;
  7. import android.content.Intent;
  8. import android.net.Uri;
  9. import android.os.AsyncTask;
  10. import android.os.Bundle;
  11. import android.util.Log;
  12. import android.view.View;
  13. import android.widget.ArrayAdapter;
  14. import android.widget.Button;
  15. import android.widget.EditText;
  16. import android.widget.ImageView;
  17. import android.widget.NumberPicker;
  18. import android.widget.ProgressBar;
  19. import android.widget.Spinner;
  20. import android.widget.TextView;
  21. import android.widget.Toast;
  22.  
  23. import com.google.firebase.auth.FirebaseAuth;
  24. import com.google.firebase.auth.FirebaseUser;
  25. import com.google.firebase.database.DataSnapshot;
  26. import com.google.firebase.database.DatabaseError;
  27. import com.google.firebase.database.DatabaseReference;
  28. import com.google.firebase.database.FirebaseDatabase;
  29. import com.google.firebase.database.ValueEventListener;
  30. import com.google.firebase.storage.FirebaseStorage;
  31. import com.google.firebase.storage.StorageReference;
  32. import com.google.firebase.storage.UploadTask;
  33.  
  34. import java.text.ParseException;
  35. import java.text.SimpleDateFormat;
  36. import java.util.ArrayList;
  37. import java.util.Calendar;
  38. import java.util.Date;
  39. import java.util.List;
  40. import java.util.Locale;
  41.  
  42. public class BookForm extends AppCompatActivity {
  43.     private Spinner roomPreferenceSpinner;
  44.     private List<String> roomTypeList = new ArrayList<>();
  45.     private EditText fullNameET;
  46.     private EditText contactNumberET;
  47.     private EditText emailET;
  48.     private EditText checkInDateET;
  49.     private EditText checkOutDateET;
  50.     private EditText yourGcashNameET;
  51.     private EditText yourGcashNumberET;
  52.     private EditText referenceNumberET;
  53.     private Button submitButton;
  54.     private ImageView attachedImageView;
  55.     private static final int PICK_IMAGE_REQUEST = 1;
  56.     private Uri selectedImageUri;
  57.  
  58.     private Calendar selectedCheckInDate = Calendar.getInstance();
  59.     private Calendar selectedCheckOutDate = Calendar.getInstance();
  60.  
  61.  
  62.     private TextView adultsNumberPicker;
  63.     private int adultCount = 0;
  64.     private TextView childrenNumberPicker;
  65.     private int childrenCount = 0;
  66.  
  67.     @Override
  68.     protected void onCreate(Bundle savedInstanceState) {
  69.         super.onCreate(savedInstanceState);
  70.         setContentView(R.layout.activity_book_form);
  71.  
  72.         Intent intent = getIntent(); // kunin yung hotelId sa DynamicHotel para sa
  73.         String hotelId = intent.getStringExtra("hotelKey"); // personalized fields nila
  74.         Log.d("BookFormActivity", "hotelId: " + hotelId); // sa book info like roomtypes etc
  75.  
  76.         DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();
  77.         DatabaseReference roomPreferencesRef = databaseReference.child("hotels").child(hotelId).child("roomTypes");
  78.  
  79.         fullNameET = findViewById(R.id.fullNameET);
  80.         contactNumberET = findViewById(R.id.contactNumberET);
  81.         emailET = findViewById(R.id.emailET);
  82.         submitButton = findViewById(R.id.submitButton);
  83.         roomPreferenceSpinner = findViewById(R.id.roomPreferenceSpinner);
  84.         checkInDateET = findViewById(R.id.checkInDateET);
  85.         checkOutDateET = findViewById(R.id.checkOutDateET);
  86.         yourGcashNameET = findViewById(R.id.yourGcashNameET);
  87.         yourGcashNumberET = findViewById(R.id.yourGcashNumberET);
  88.         referenceNumberET = findViewById(R.id.referenceNumberET);
  89.         attachedImageView = findViewById(R.id.attachedImageView);
  90.  
  91.         ArrayAdapter<String> roomTypeAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, roomTypeList);
  92.         roomTypeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
  93.  
  94.         roomPreferenceSpinner.setAdapter(roomTypeAdapter);
  95.  
  96.         adultsNumberPicker = findViewById(R.id.adultsNumberPicker);
  97.         childrenNumberPicker = findViewById(R.id.childrenNumberPicker);
  98.  
  99.  
  100.         // Check-In Date Picker
  101.         checkInDateET.setOnClickListener(v -> {
  102.             selectedCheckInDate = Calendar.getInstance();
  103.             showDatePickerDialog(selectedCheckInDate, Calendar.getInstance());
  104.         });
  105.  
  106. // Check-Out Date Picker
  107.         checkOutDateET.setOnClickListener(v -> {
  108.             selectedCheckOutDate = Calendar.getInstance();
  109.             showDatePickerDialog(selectedCheckOutDate, selectedCheckInDate);
  110.         });
  111.  
  112.         // Load room preferences from Firebase
  113.         roomPreferencesRef.addListenerForSingleValueEvent(new ValueEventListener() {
  114.             @Override
  115.             public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
  116.                 if (dataSnapshot.exists()) {
  117.                     roomTypeList.clear();
  118.                     for (DataSnapshot preferenceSnapshot : dataSnapshot.getChildren()) {
  119.                         String roomPreference = preferenceSnapshot.getValue(String.class);
  120.                         roomTypeList.add(roomPreference);
  121.                     }
  122.                     roomTypeAdapter.notifyDataSetChanged();
  123.                 }
  124.             }
  125.  
  126.             @Override
  127.             public void onCancelled(@NonNull DatabaseError databaseError) {
  128.                 Log.e("BookForm", "Error: " + databaseError.getMessage());
  129.             }
  130.         });
  131.  
  132.         submitButton.setOnClickListener(new View.OnClickListener() {
  133.             @Override
  134.             public void onClick(View v) {
  135.                 if (allFields()) {
  136.  
  137.                     // Assuming you have a reference to your loadingProgressBar
  138.                     ProgressBar loadingProgressBar = findViewById(R.id.loadingProgressBar);
  139.  
  140.                     // Show loading indicator
  141.                     submitButton.setVisibility(View.GONE);
  142.                     loadingProgressBar.setVisibility(View.VISIBLE);
  143.  
  144.                     new AsyncTask<Void, Void, Void>() {
  145.                         @Override
  146.                         protected Void doInBackground(Void... params) {
  147.                             // TODO: Perform form submission here in the background
  148.                             // Replace the following line with your actual form submission logic
  149.                             // Simulating a delay for demonstration purposes
  150.                             try {
  151.                                 Thread.sleep(2000); // Simulating a 2-second delay
  152.                             } catch (InterruptedException e) {
  153.                                 e.printStackTrace();
  154.                             }
  155.                             return null;
  156.                         }
  157.  
  158.                         @Override
  159.                         protected void onPostExecute(Void result) {
  160.                             // After the form submission is complete, hide the loading indicator
  161.                             loadingProgressBar.setVisibility(View.GONE);
  162.                             submitButton.setVisibility(View.VISIBLE);
  163.  
  164.                             // Navigate to DynamicHotel activity
  165.                             Intent dynamicHotelIntent = new Intent(BookForm.this, DynamicHotel.class);
  166.                             dynamicHotelIntent.putExtra("hotelKey", hotelId); // Pass necessary data if needed
  167.                             startActivity(dynamicHotelIntent);
  168.                             finish(); // Optional: finish the current activity if you don't want to go back to it
  169.                         }
  170.                     }.execute();
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.                     FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();
  179.  
  180.                     if (currentUser != null) {
  181.                         String userId = currentUser.getUid();
  182.                         String fullName = fullNameET.getText().toString();
  183.                         String checkInDate = checkInDateET.getText().toString();
  184.                         String checkOutDate = checkOutDateET.getText().toString();
  185.                         int adults = Integer.parseInt(adultsNumberPicker.getText().toString());
  186.                         int children = Integer.parseInt(childrenNumberPicker.getText().toString());
  187.                         String contactNumber = contactNumberET.getText().toString();
  188.                         String email = emailET.getText().toString();
  189.                         String roomPreference = roomPreferenceSpinner.getSelectedItem().toString();
  190.                         String yourGcashName = yourGcashNameET.getText().toString();
  191.                         String yourGcashNumber = yourGcashNumberET.getText().toString();
  192.                         String referenceNumber = referenceNumberET.getText().toString();
  193.  
  194.                         // Prevent multiple bookings for the same period
  195.                         canSubmitBooking(userId, hotelId, fullName, checkInDate, checkOutDate, adults,
  196.                                 children, contactNumber, email, roomPreference, yourGcashName, yourGcashNumber, referenceNumber);
  197.                     } else {
  198.                         Log.e("BookForm", "User is not authenticated");
  199.                     }
  200.                 } else {
  201.                     Toast.makeText(BookForm.this, "Please fill in all required fields.", Toast.LENGTH_SHORT).show();
  202.                 }
  203.             }
  204.         });
  205.  
  206.         Button attachPhotoButton = findViewById(R.id.attachPhotoButton);
  207.         attachPhotoButton.setOnClickListener(new View.OnClickListener() {
  208.             @Override
  209.             public void onClick(View v) {
  210.                 openFileChooser();
  211.             }
  212.         });
  213.     }
  214.  
  215.  
  216.     public void incrementValue(View view) {
  217.         if (adultCount < 9) {
  218.             adultCount++;
  219.             updateAdultsCount();
  220.         }
  221.     }
  222.  
  223.     public void decrementValue(View view) {
  224.         if (adultCount > 0) {
  225.             adultCount--;
  226.             updateAdultsCount();
  227.         }
  228.     }
  229.  
  230.     private void updateAdultsCount() {
  231.         adultsNumberPicker.setText(String.valueOf(adultCount));
  232.     }
  233.  
  234.     public void incrementValue2(View view) {
  235.         if (childrenCount < 9) {
  236.             childrenCount++;
  237.             updateChildrenCount();
  238.         }
  239.     }
  240.  
  241.     public void decrementValue2(View view) {
  242.         if (childrenCount > 0) {
  243.             childrenCount--;
  244.             updateChildrenCount();
  245.         }
  246.     }
  247.  
  248.     private void updateChildrenCount() {
  249.         childrenNumberPicker.setText(String.valueOf(childrenCount));
  250.     }
  251.  
  252.  
  253.     private void openFileChooser() {
  254.         Intent intent = new Intent();
  255.         intent.setType("image/*");
  256.         intent.setAction(Intent.ACTION_GET_CONTENT);
  257.         startActivityForResult(intent, PICK_IMAGE_REQUEST);
  258.     }
  259.  
  260.     @Override
  261.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  262.         super.onActivityResult(requestCode, resultCode, data);
  263.  
  264.         if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
  265.             selectedImageUri = data.getData();
  266.             attachedImageView.setImageURI(selectedImageUri);
  267.             attachedImageView.setVisibility(View.VISIBLE);
  268.         }
  269.     }
  270.  
  271.  
  272.     private void showDatePickerDialog(final Calendar selectedDate, final Calendar minDate) {
  273.         DatePickerDialog datePickerDialog = new DatePickerDialog(
  274.                 BookForm.this,
  275.                 (view, year, monthOfYear, dayOfMonth) -> {
  276.                     selectedDate.set(year, monthOfYear, dayOfMonth);
  277.  
  278.                     // Check if the selected date is today or in the future
  279.                     Calendar currentDate = Calendar.getInstance();
  280.                     currentDate.set(Calendar.HOUR_OF_DAY, 0);
  281.                     currentDate.set(Calendar.MINUTE, 0);
  282.                     currentDate.set(Calendar.SECOND, 0);
  283.                     currentDate.set(Calendar.MILLISECOND, 0);
  284.  
  285.                     if (!selectedDate.before(currentDate)) {
  286.                         updateDateField(selectedDate);
  287.                     } else {
  288.                         Toast.makeText(getApplicationContext(), "Please select a valid date", Toast.LENGTH_SHORT).show();
  289.                     }
  290.                 },
  291.                 selectedDate.get(Calendar.YEAR),
  292.                 selectedDate.get(Calendar.MONTH),
  293.                 selectedDate.get(Calendar.DAY_OF_MONTH)
  294.         );
  295.  
  296.         // Set the minimum date to the check-in date
  297.         datePickerDialog.getDatePicker().setMinDate(minDate.getTimeInMillis());
  298.  
  299.         // Optionally set the maximum date (if you want to limit to a specific future date)
  300.         // datePickerDialog.getDatePicker().setMaxDate(your_max_date_in_milliseconds);
  301.  
  302.         datePickerDialog.show();
  303.     }
  304.     private void updateDateField(Calendar selectedDate) {
  305.         SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy", Locale.getDefault());
  306.  
  307.         // Update the corresponding EditText field
  308.         if (selectedDate.equals(selectedCheckInDate)) {
  309.             checkInDateET.setText(dateFormat.format(selectedDate.getTime()));
  310.         } else if (selectedDate.equals(selectedCheckOutDate)) {
  311.             checkOutDateET.setText(dateFormat.format(selectedDate.getTime()));
  312.         }
  313.     }
  314.  
  315.  
  316.  
  317.     private boolean allFields() {
  318.         return !fullNameET.getText().toString().isEmpty() &&
  319.                 !contactNumberET.getText().toString().isEmpty() &&
  320.                 !emailET.getText().toString().isEmpty() &&
  321.                 !checkInDateET.getText().toString().isEmpty() &&
  322.                 !checkOutDateET.getText().toString().isEmpty() &&
  323.                 !roomPreferenceSpinner.getSelectedItem().toString().isEmpty() &&
  324.                 !yourGcashNameET.getText().toString().isEmpty() &&
  325.                 !yourGcashNumberET.getText().toString().isEmpty() &&
  326.                 !referenceNumberET.getText().toString().isEmpty();
  327.     }
  328.  
  329.     private void canSubmitBooking(String userId, String hotelId, String fullName, String checkInDate, String checkOutDate,
  330.                                   int adults, int children, String contactNumber, String email, String roomPreference,
  331.                                   String yourGcashName, String yourGcashNumber, String referenceNumber) {
  332.  
  333.         DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();
  334.  
  335.         DatabaseReference userBookingsRef = databaseReference.child("booking_info");
  336.         userBookingsRef.orderByChild("userId").equalTo(userId).addListenerForSingleValueEvent(new ValueEventListener() {
  337.             @Override
  338.             public void onDataChange(DataSnapshot dataSnapshot) {
  339.                 boolean canSubmit = true;
  340.                 SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
  341.                 Date currentDate = new Date();
  342.  
  343.                 for (DataSnapshot bookingSnapshot : dataSnapshot.getChildren()) {
  344.                     String existingCheckInDate = bookingSnapshot.child("checkInDate").getValue(String.class);
  345.                     String existingCheckOutDate = bookingSnapshot.child("checkOutDate").getValue(String.class);
  346.  
  347.                     try {
  348.                         Date existingCheckIn = sdf.parse(existingCheckInDate);
  349.                         Date existingCheckOut = sdf.parse(existingCheckOutDate);
  350.  
  351.                         if (currentDate.after(existingCheckIn) && currentDate.before(existingCheckOut)) {
  352.                             canSubmit = false;
  353.                             break;
  354.                         }
  355.                     } catch (ParseException e) {
  356.                         e.printStackTrace();
  357.                     }
  358.                 }
  359.  
  360.                 if (canSubmit) {
  361.                     saveBooking(userId, hotelId, fullName, checkInDate, checkOutDate, adults, children, contactNumber, email, roomPreference, yourGcashName, yourGcashNumber, referenceNumber);
  362.                 } else {
  363.                     Toast.makeText(BookForm.this, "You cannot submit a new booking until your current booking has ended.", Toast.LENGTH_SHORT).show();
  364.                 }
  365.             }
  366.  
  367.             @Override
  368.             public void onCancelled(DatabaseError databaseError) {
  369.                 Log.e("BookForm", "Database error: " + databaseError.getMessage());
  370.             }
  371.         });
  372.     }
  373.  
  374.  
  375.  
  376.     private boolean isDateRangeOverlap(String start1, String end1, String start2, String end2) {
  377.         try {
  378.             SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
  379.             Date startDate1 = sdf.parse(start1);
  380.             Date endDate1 = sdf.parse(end1);
  381.             Date startDate2 = sdf.parse(start2);
  382.             Date endDate2 = sdf.parse(end2);
  383.  
  384.             return !(endDate1.before(startDate2) || endDate2.before(startDate1));
  385.         } catch (ParseException e) {
  386.             e.printStackTrace();
  387.             return false;
  388.         }
  389.     }
  390.  
  391.  
  392.     private void saveBooking(String userId, String hotelId, String fullName, String checkInDate, String checkOutDate,
  393.                              int adults, int children, String contactNumber, String email, String roomPreference,
  394.                              String yourGcashName, String yourGcashNumber, String referenceNumber) {
  395.  
  396.         DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();
  397.         DatabaseReference hotelRef = databaseReference.child("hotels").child(hotelId).child("user_id");
  398.         Log.d("BookForm", "hotelref: " + hotelRef);
  399.  
  400.         hotelRef.addListenerForSingleValueEvent(new ValueEventListener() {
  401.             @Override
  402.             public void onDataChange(@NonNull DataSnapshot hotelDataSnapshot) {
  403.                 if (hotelDataSnapshot.exists()) {
  404.                     String hotelUserId = hotelDataSnapshot.getValue(String.class);
  405.                     Log.d("BookForm", "HotelUserId: " + hotelUserId);
  406.  
  407.                     DatabaseReference bookingsRef = databaseReference.child("booking_info").push();
  408.                     String bookingId = bookingsRef.getKey();
  409.  
  410.                     bookingsRef.child("userId").setValue(userId);
  411.                     bookingsRef.child("fullName").setValue(fullName);
  412.                     bookingsRef.child("checkInDate").setValue(checkInDate);
  413.                     bookingsRef.child("checkOutDate").setValue(checkOutDate);
  414.                     bookingsRef.child("adults").setValue(adults);
  415.                     bookingsRef.child("children").setValue(children);
  416.                     bookingsRef.child("contactNumber").setValue(contactNumber);
  417.                     bookingsRef.child("email").setValue(email);
  418.                     bookingsRef.child("roomPreference").setValue(roomPreference);
  419.                     bookingsRef.child("GcashName").setValue(yourGcashName);
  420.                     bookingsRef.child("yGcashNumber").setValue(yourGcashNumber);
  421.                     bookingsRef.child("referenceNumber").setValue(referenceNumber);
  422.                     bookingsRef.child("hotelUserId").setValue(hotelUserId);
  423.  
  424.  
  425.                     if (selectedImageUri != null) {
  426.                         saveBookingWithImage(bookingsRef, userId, hotelId);
  427.                     } else {
  428.                         Log.d("BookForm", "Booking data saved successfully.");
  429.                         Toast.makeText(BookForm.this, "Booking submitted successfully.", Toast.LENGTH_SHORT).show();
  430.                     }
  431.                 }
  432.             }
  433.  
  434.             @Override
  435.             public void onCancelled(@NonNull DatabaseError hotelDatabaseError) {
  436.                 Log.e("BookForm", "Hotel database error: " + hotelDatabaseError.getMessage());
  437.             }
  438.         });
  439.  
  440.     }
  441.  
  442.     private void saveBookingWithImage(DatabaseReference bookingsRef, String userId, String hotelId) {
  443.         StorageReference storageReference = FirebaseStorage.getInstance().getReference();
  444.         StorageReference imageRef = storageReference.child("payment_receipts/" + userId + "/" + hotelId + "/image.jpg");
  445.  
  446.         imageRef.putFile(selectedImageUri)
  447.                 .addOnSuccessListener(taskSnapshot -> {
  448.                     imageRef.getDownloadUrl().addOnSuccessListener(downloadUri -> {
  449.                         String imageUrl = downloadUri.toString();
  450.                         bookingsRef.child("imageUrl").setValue(imageUrl);
  451.                         Log.d("BookForm", "Booking data with image URL saved successfully.");
  452.                         Toast.makeText(this, "Booking submitted successfully.", Toast.LENGTH_SHORT).show();
  453.                     });
  454.                 })
  455.                 .addOnFailureListener(e -> {
  456.                     Log.e("BookForm", "Image upload failed: " + e.getMessage());
  457.                     Toast.makeText(this, "Failed to upload image.", Toast.LENGTH_SHORT).show();
  458.                 });
  459.     }
  460. }
Tags: Android
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement