Move the consent creation process to when the appointment gets created and not earlier
This commit is contained in:
parent
afe21e3960
commit
e4e285931f
4 changed files with 54 additions and 69 deletions
|
@ -37,6 +37,7 @@ class Booking extends EA_Controller {
|
||||||
$this->load->model('services_model');
|
$this->load->model('services_model');
|
||||||
$this->load->model('customers_model');
|
$this->load->model('customers_model');
|
||||||
$this->load->model('settings_model');
|
$this->load->model('settings_model');
|
||||||
|
$this->load->model('consents_model');
|
||||||
|
|
||||||
$this->load->library('timezones');
|
$this->load->library('timezones');
|
||||||
$this->load->library('synchronization');
|
$this->load->library('synchronization');
|
||||||
|
@ -66,7 +67,7 @@ class Booking extends EA_Controller {
|
||||||
$disable_booking = setting('disable_booking');
|
$disable_booking = setting('disable_booking');
|
||||||
$google_analytics_code = setting('google_analytics_code');
|
$google_analytics_code = setting('google_analytics_code');
|
||||||
$matomo_analytics_url = setting('matomo_analytics_url');
|
$matomo_analytics_url = setting('matomo_analytics_url');
|
||||||
|
|
||||||
if ($disable_booking)
|
if ($disable_booking)
|
||||||
{
|
{
|
||||||
$disable_booking_message = setting('disable_booking_message');
|
$disable_booking_message = setting('disable_booking_message');
|
||||||
|
@ -134,7 +135,7 @@ class Booking extends EA_Controller {
|
||||||
|
|
||||||
$timezones = $this->timezones->to_array();
|
$timezones = $this->timezones->to_array();
|
||||||
$grouped_timezones = $this->timezones->to_grouped_array();
|
$grouped_timezones = $this->timezones->to_grouped_array();
|
||||||
|
|
||||||
$appointment_hash = html_vars('appointment_hash');
|
$appointment_hash = html_vars('appointment_hash');
|
||||||
|
|
||||||
if ( ! empty($appointment_hash))
|
if ( ! empty($appointment_hash))
|
||||||
|
@ -271,13 +272,13 @@ class Booking extends EA_Controller {
|
||||||
* Render the booking page and display the selected appointment.
|
* Render the booking page and display the selected appointment.
|
||||||
*
|
*
|
||||||
* This method will call the "index" callback to handle the page rendering.
|
* This method will call the "index" callback to handle the page rendering.
|
||||||
*
|
*
|
||||||
* @param string $appointment_hash
|
* @param string $appointment_hash
|
||||||
*/
|
*/
|
||||||
public function reschedule($appointment_hash)
|
public function reschedule($appointment_hash)
|
||||||
{
|
{
|
||||||
html_vars(['appointment_hash' => $appointment_hash]);
|
html_vars(['appointment_hash' => $appointment_hash]);
|
||||||
|
|
||||||
$this->index();
|
$this->index();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -474,6 +475,30 @@ class Booking extends EA_Controller {
|
||||||
$appointment['color'] = $service['color'];
|
$appointment['color'] = $service['color'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$customer_ip = $this->input->ip_address();
|
||||||
|
|
||||||
|
// Create the consents (if needed).
|
||||||
|
$consent = [
|
||||||
|
'first_name' => $customer['first_name'] ?? '-',
|
||||||
|
'last_name' => $customer['last_name'] ?? '-',
|
||||||
|
'email' => $customer['email'] ?? '-',
|
||||||
|
'ip' => $customer_ip,
|
||||||
|
];
|
||||||
|
|
||||||
|
if (setting('display_terms_and_conditions'))
|
||||||
|
{
|
||||||
|
$consent['type'] = 'terms-and-conditions';
|
||||||
|
|
||||||
|
$this->consents_model->save($consent);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (setting('display_privacy_policy'))
|
||||||
|
{
|
||||||
|
$consent['type'] = 'privacy-policy';
|
||||||
|
|
||||||
|
$this->consents_model->save($consent);
|
||||||
|
}
|
||||||
|
|
||||||
// Save customer language (the language which is used to render the booking page).
|
// Save customer language (the language which is used to render the booking page).
|
||||||
$customer['language'] = session('language') ?? config('language');
|
$customer['language'] = session('language') ?? config('language');
|
||||||
|
|
||||||
|
@ -495,6 +520,7 @@ class Booking extends EA_Controller {
|
||||||
$customer = $this->customers_model->find($customer_id);
|
$customer = $this->customers_model->find($customer_id);
|
||||||
|
|
||||||
$appointment['id_users_customer'] = $customer_id;
|
$appointment['id_users_customer'] = $customer_id;
|
||||||
|
$appointment['is_unavailability'] = FALSE;
|
||||||
|
|
||||||
$this->appointments_model->only($appointment, [
|
$this->appointments_model->only($appointment, [
|
||||||
'start_datetime',
|
'start_datetime',
|
||||||
|
@ -506,7 +532,7 @@ class Booking extends EA_Controller {
|
||||||
'id_users_customer',
|
'id_users_customer',
|
||||||
'id_services',
|
'id_services',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$appointment_id = $this->appointments_model->save($appointment);
|
$appointment_id = $this->appointments_model->save($appointment);
|
||||||
$appointment = $this->appointments_model->find($appointment_id);
|
$appointment = $this->appointments_model->find($appointment_id);
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ class Consents extends EA_Controller {
|
||||||
/**
|
/**
|
||||||
* Save (insert or update) the consent
|
* Save (insert or update) the consent
|
||||||
*/
|
*/
|
||||||
public function save_consent()
|
public function save()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@ -40,6 +40,28 @@ class Consents extends EA_Controller {
|
||||||
|
|
||||||
$consent['ip'] = $this->input->ip_address();
|
$consent['ip'] = $this->input->ip_address();
|
||||||
|
|
||||||
|
$occurrences = $this->consents_model->get(['ip' => $consent['ip']], 1, 0, 'create_datetime DESC');
|
||||||
|
|
||||||
|
if ( ! empty($occurrences))
|
||||||
|
{
|
||||||
|
$last_consent = $occurrences[0];
|
||||||
|
|
||||||
|
$last_consent_create_datetime_instance = new DateTime($last_consent['create_datetime']);
|
||||||
|
|
||||||
|
$threshold_datetime_instance = new DateTime('-24 hours');
|
||||||
|
|
||||||
|
if ($last_consent_create_datetime_instance > $threshold_datetime_instance)
|
||||||
|
{
|
||||||
|
// Do not create a new consent.
|
||||||
|
|
||||||
|
json_response([
|
||||||
|
'success' => TRUE,
|
||||||
|
]);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$consent['id'] = $this->consents_model->save($consent);
|
$consent['id'] = $this->consents_model->save($consent);
|
||||||
|
|
||||||
json_response([
|
json_response([
|
||||||
|
|
|
@ -302,22 +302,6 @@ App.Http.Booking = (function () {
|
||||||
processingUnavailabilities = false;
|
processingUnavailabilities = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Save the user's consent.
|
|
||||||
*
|
|
||||||
* @param {Object} consent Contains user's consents.
|
|
||||||
*/
|
|
||||||
function saveConsent(consent) {
|
|
||||||
const url = App.Utils.Url.siteUrl('consents/save_consent');
|
|
||||||
|
|
||||||
const data = {
|
|
||||||
csrf_token: vars('csrf_token'),
|
|
||||||
consent: consent
|
|
||||||
};
|
|
||||||
|
|
||||||
$.post(url, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete personal information.
|
* Delete personal information.
|
||||||
*
|
*
|
||||||
|
@ -341,7 +325,6 @@ App.Http.Booking = (function () {
|
||||||
getAvailableHours,
|
getAvailableHours,
|
||||||
getUnavailabilityDates,
|
getUnavailabilityDates,
|
||||||
applyPreviousUnavailabilityDates,
|
applyPreviousUnavailabilityDates,
|
||||||
saveConsent,
|
|
||||||
deletePersonalInformation
|
deletePersonalInformation
|
||||||
};
|
};
|
||||||
})();
|
})();
|
||||||
|
|
|
@ -35,20 +35,6 @@ App.Pages.Booking = (function () {
|
||||||
const $bookAppointmentSubmit = $('#book-appointment-submit');
|
const $bookAppointmentSubmit = $('#book-appointment-submit');
|
||||||
const $deletePersonalInformation = $('#delete-personal-information');
|
const $deletePersonalInformation = $('#delete-personal-information');
|
||||||
|
|
||||||
/**
|
|
||||||
* Contains terms and conditions consent.
|
|
||||||
*
|
|
||||||
* @type {Object}
|
|
||||||
*/
|
|
||||||
let termsAndConditionsConsent;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Contains privacy policy consent.
|
|
||||||
*
|
|
||||||
* @type {Object}
|
|
||||||
*/
|
|
||||||
let privacyPolicyConsent;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines the functionality of the page.
|
* Determines the functionality of the page.
|
||||||
*
|
*
|
||||||
|
@ -365,38 +351,6 @@ App.Pages.Booking = (function () {
|
||||||
return; // Validation failed, do not continue.
|
return; // Validation failed, do not continue.
|
||||||
} else {
|
} else {
|
||||||
updateConfirmFrame();
|
updateConfirmFrame();
|
||||||
|
|
||||||
const $acceptToTermsAndConditions = $('#accept-to-terms-and-conditions');
|
|
||||||
if ($acceptToTermsAndConditions.length && $acceptToTermsAndConditions.prop('checked') === true) {
|
|
||||||
const newTermsAndConditionsConsent = {
|
|
||||||
first_name: $firstName.val(),
|
|
||||||
last_name: $lastName.val(),
|
|
||||||
email: $email.val(),
|
|
||||||
type: 'terms-and-conditions'
|
|
||||||
};
|
|
||||||
|
|
||||||
if (
|
|
||||||
JSON.stringify(newTermsAndConditionsConsent) !== JSON.stringify(termsAndConditionsConsent)
|
|
||||||
) {
|
|
||||||
termsAndConditionsConsent = newTermsAndConditionsConsent;
|
|
||||||
App.Http.Booking.saveConsent(termsAndConditionsConsent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const $acceptToPrivacyPolicy = $('#accept-to-privacy-policy');
|
|
||||||
if ($acceptToPrivacyPolicy.length && $acceptToPrivacyPolicy.prop('checked') === true) {
|
|
||||||
const newPrivacyPolicyConsent = {
|
|
||||||
first_name: $firstName.val(),
|
|
||||||
last_name: $lastName.val(),
|
|
||||||
email: $email.val(),
|
|
||||||
type: 'privacy-policy'
|
|
||||||
};
|
|
||||||
|
|
||||||
if (JSON.stringify(newPrivacyPolicyConsent) !== JSON.stringify(privacyPolicyConsent)) {
|
|
||||||
privacyPolicyConsent = newPrivacyPolicyConsent;
|
|
||||||
App.Http.Booking.saveConsent(privacyPolicyConsent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue