Advertisement
kitlolz012

anti multiple booking 1

Nov 15th, 2023 (edited)
35
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.29 KB | None | 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. for (DataSnapshot bookingSnapshot : dataSnapshot.getChildren()) {
  341. String existingCheckOutDate = bookingSnapshot.child("checkOutDate").getValue(String.class);
  342.  
  343. SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
  344. Date currentDate = new Date();
  345. Date existingCheckOut = null;
  346.  
  347. try {
  348. existingCheckOut = sdf.parse(existingCheckOutDate);
  349. } catch (ParseException e) {
  350. e.printStackTrace();
  351. }
  352.  
  353. if (existingCheckOut != null && currentDate.before(existingCheckOut)) {
  354. canSubmit = false;
  355. break;
  356. }
  357. }
  358.  
  359. if (canSubmit) {
  360. saveBooking(userId, hotelId, fullName, checkInDate, checkOutDate, adults, children, contactNumber, email, roomPreference, yourGcashName, yourGcashNumber, referenceNumber);
  361. } else {
  362. Toast.makeText(BookForm.this, "You cannot submit a new booking until your current booking has ended.", Toast.LENGTH_SHORT).show();
  363. }
  364. }
  365.  
  366. @Override
  367. public void onCancelled(DatabaseError databaseError) {
  368. Log.e("BookForm", "Database error: " + databaseError.getMessage());
  369. }
  370. });
  371. }
  372.  
  373.  
  374.  
  375. private boolean isDateRangeOverlap(String start1, String end1, String start2, String end2) {
  376. try {
  377. SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
  378. Date startDate1 = sdf.parse(start1);
  379. Date endDate1 = sdf.parse(end1);
  380. Date startDate2 = sdf.parse(start2);
  381. Date endDate2 = sdf.parse(end2);
  382.  
  383. return !(endDate1.before(startDate2) || endDate2.before(startDate1));
  384. } catch (ParseException e) {
  385. e.printStackTrace();
  386. return false;
  387. }
  388. }
  389.  
  390.  
  391. private void saveBooking(String userId, String hotelId, String fullName, String checkInDate, String checkOutDate,
  392. int adults, int children, String contactNumber, String email, String roomPreference,
  393. String yourGcashName, String yourGcashNumber, String referenceNumber) {
  394.  
  395. DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();
  396. DatabaseReference hotelRef = databaseReference.child("hotels").child(hotelId).child("user_id");
  397. Log.d("BookForm", "hotelref: " + hotelRef);
  398.  
  399. hotelRef.addListenerForSingleValueEvent(new ValueEventListener() {
  400. @Override
  401. public void onDataChange(@NonNull DataSnapshot hotelDataSnapshot) {
  402. if (hotelDataSnapshot.exists()) {
  403. String hotelUserId = hotelDataSnapshot.getValue(String.class);
  404. Log.d("BookForm", "HotelUserId: " + hotelUserId);
  405.  
  406. DatabaseReference bookingsRef = databaseReference.child("booking_info").push();
  407. String bookingId = bookingsRef.getKey();
  408.  
  409. bookingsRef.child("userId").setValue(userId);
  410. bookingsRef.child("fullName").setValue(fullName);
  411. bookingsRef.child("checkInDate").setValue(checkInDate);
  412. bookingsRef.child("checkOutDate").setValue(checkOutDate);
  413. bookingsRef.child("adults").setValue(adults);
  414. bookingsRef.child("children").setValue(children);
  415. bookingsRef.child("contactNumber").setValue(contactNumber);
  416. bookingsRef.child("email").setValue(email);
  417. bookingsRef.child("roomPreference").setValue(roomPreference);
  418. bookingsRef.child("GcashName").setValue(yourGcashName);
  419. bookingsRef.child("yGcashNumber").setValue(yourGcashNumber);
  420. bookingsRef.child("referenceNumber").setValue(referenceNumber);
  421. bookingsRef.child("hotelUserId").setValue(hotelUserId);
  422.  
  423.  
  424. if (selectedImageUri != null) {
  425. saveBookingWithImage(bookingsRef, userId, hotelId);
  426. } else {
  427. Log.d("BookForm", "Booking data saved successfully.");
  428. Toast.makeText(BookForm.this, "Booking submitted successfully.", Toast.LENGTH_SHORT).show();
  429. }
  430. }
  431. }
  432.  
  433. @Override
  434. public void onCancelled(@NonNull DatabaseError hotelDatabaseError) {
  435. Log.e("BookForm", "Hotel database error: " + hotelDatabaseError.getMessage());
  436. }
  437. });
  438.  
  439. }
  440.  
  441. private void saveBookingWithImage(DatabaseReference bookingsRef, String userId, String hotelId) {
  442. StorageReference storageReference = FirebaseStorage.getInstance().getReference();
  443. StorageReference imageRef = storageReference.child("payment_receipts/" + userId + "/" + hotelId + "/image.jpg");
  444.  
  445. imageRef.putFile(selectedImageUri)
  446. .addOnSuccessListener(taskSnapshot -> {
  447. imageRef.getDownloadUrl().addOnSuccessListener(downloadUri -> {
  448. String imageUrl = downloadUri.toString();
  449. bookingsRef.child("imageUrl").setValue(imageUrl);
  450. Log.d("BookForm", "Booking data with image URL saved successfully.");
  451. Toast.makeText(this, "Booking submitted successfully.", Toast.LENGTH_SHORT).show();
  452. });
  453. })
  454. .addOnFailureListener(e -> {
  455. Log.e("BookForm", "Image upload failed: " + e.getMessage());
  456. Toast.makeText(this, "Failed to upload image.", Toast.LENGTH_SHORT).show();
  457. });
  458. }
  459. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement