374 lines
17 KiB
PHP
374 lines
17 KiB
PHP
@push('page_scripts')
|
|
<script>
|
|
class ReservationModal {
|
|
prefix
|
|
ids = {
|
|
modal: '',
|
|
form: '',
|
|
date: '',
|
|
rut: '',
|
|
digit: '',
|
|
birthdate: '',
|
|
comuna: '',
|
|
region: '',
|
|
broker: '',
|
|
promotion_button: '',
|
|
promotions: '',
|
|
projects: '',
|
|
project_name: '',
|
|
unit_buttons: '',
|
|
units: ''
|
|
}
|
|
components = {
|
|
$modal: null,
|
|
form: null,
|
|
$date: null,
|
|
rut: null,
|
|
digit: null,
|
|
$birthdate: null,
|
|
$comuna: null,
|
|
$region: null,
|
|
$broker: null,
|
|
promotion_button: null,
|
|
promotions: null,
|
|
projects: null,
|
|
project_name: null,
|
|
unit_buttons: null,
|
|
units: null,
|
|
payments: null,
|
|
$loader: null
|
|
}
|
|
data = {
|
|
current_project: null,
|
|
comunas: {},
|
|
brokers: {},
|
|
promotions: {},
|
|
unit_buttons: [],
|
|
units: {},
|
|
added_units: {},
|
|
current_user: null
|
|
}
|
|
maps = {
|
|
unit_types: {
|
|
departamento: 'building',
|
|
estacionamiento: 'car',
|
|
bodega: 'warehouse',
|
|
terraza: 'tree',
|
|
}
|
|
}
|
|
constructor({projects_id, prefix, components}) {
|
|
this.prefix = prefix
|
|
this.ids = {
|
|
modal: `${this.prefix}_reservation_modal`,
|
|
form: `${this.prefix}_reservation_form`,
|
|
date: `${this.prefix}_date`,
|
|
rut: `${this.prefix}_rut`,
|
|
digit: `${this.prefix}_digit`,
|
|
birthdate: `${this.prefix}_birthdate`,
|
|
comuna: `${this.prefix}_comuna`,
|
|
region: `${this.prefix}_region`,
|
|
broker: `${this.prefix}_broker`,
|
|
promotion_button: `${this.prefix}_promotion`,
|
|
promotions: `${this.prefix}_promotions`,
|
|
projects: projects_id,
|
|
project_name: `${this.prefix}_project_name`,
|
|
unit_buttons: `${this.prefix}_unit_buttons`,
|
|
units: `${this.prefix}_units`,
|
|
loader: `${this.prefix}_rut_loader`
|
|
}
|
|
Object.keys(components).forEach(key => {
|
|
this.components[key] = components[key]
|
|
})
|
|
this.setup()
|
|
}
|
|
load(project_id) {
|
|
this.reset()
|
|
this.data.current_project = project_id
|
|
this.components.project_name.textContent = this.components.projects.querySelector(`.item[data-id="${project_id}"]`).textContent
|
|
this.components.form.querySelector(`input[name="${this.prefix}_project_id"]`).value = project_id
|
|
|
|
this.get.brokers(project_id)
|
|
this.get.promotions(project_id).then(() => {
|
|
const promotions = structuredClone(reservations.data.promotions[project_id])
|
|
this.components.promotions.data.promotions = promotions.map(promotion => {
|
|
return {
|
|
text: promotion.description,
|
|
name: promotion.description,
|
|
value: promotion.id
|
|
}
|
|
})
|
|
this.components.promotions.draw.promotions()
|
|
})
|
|
this.get.units(project_id).then(() => {
|
|
const unitTypes = structuredClone(reservations.data.units[project_id])
|
|
Object.entries(unitTypes).map(([type, units]) => {
|
|
units = units.map(unit => {
|
|
return {
|
|
text: unit.descripcion,
|
|
name: unit.descripcion,
|
|
value: unit.id
|
|
}
|
|
})
|
|
units.sort((a, b) => {
|
|
return parseInt(a.text) - parseInt(b.text)
|
|
})
|
|
unitTypes[type] = units
|
|
})
|
|
this.components.units.data.types = unitTypes
|
|
this.components.units.draw.buttons()
|
|
})
|
|
}
|
|
reset() {
|
|
this.components.form.reset()
|
|
this.components.promotions.reset()
|
|
this.components.units.reset()
|
|
this.components.payments.reset()
|
|
}
|
|
get = {
|
|
comunas: region_id => {
|
|
if (region_id in this.data.comunas) {
|
|
this.components.$comuna.dropdown('change values', this.data.comunas[region_id])
|
|
if (this.data.current_user !== null && this.data.current_user?.direccion?.comuna !== null) {
|
|
this.components.$comuna.dropdown('set selected', this.data.current_user.direccion.comuna.id)
|
|
}
|
|
return
|
|
}
|
|
return reservations.get.comunas(region_id).then(comunas => {
|
|
this.data.comunas[region_id] = comunas
|
|
this.components.$comuna.dropdown('change values', this.data.comunas[region_id])
|
|
|
|
if (this.data.current_user !== null && this.data.current_user?.direccion?.comuna !== null) {
|
|
this.components.$comuna.dropdown('set selected', this.data.current_user.direccion.comuna.id)
|
|
}
|
|
})
|
|
},
|
|
brokers: project_id => {
|
|
if (project_id in this.data.brokers) {
|
|
return new Promise((resolve, reject) => {
|
|
resolve(this.data.brokers[project_id])
|
|
})
|
|
}
|
|
return reservations.get.brokers(project_id).then(() => {
|
|
this.data.brokers[project_id] = reservations.data.brokers[project_id]
|
|
this.fill.brokers()
|
|
})
|
|
},
|
|
/*broker: (broker_rut) => {
|
|
const uri = `/api/proyectos/broker/${broker_rut}`
|
|
return APIClient.fetch(uri).then(response => response.json()).then(json => {
|
|
if (!('broker' in json)) {
|
|
return []
|
|
}
|
|
return json.broker
|
|
})
|
|
},*/
|
|
promotions: project_id => {
|
|
if (project_id in this.data.promotions) {
|
|
return new Promise((resolve, reject) => {
|
|
resolve(this.data.promotions[project_id])
|
|
})
|
|
}
|
|
return reservations.get.promotions(project_id).then(promotions => {
|
|
this.data.promotions[project_id] = promotions
|
|
})
|
|
},
|
|
units: project_id => {
|
|
if (project_id in this.data.units) {
|
|
return new Promise((resolve, reject) => {
|
|
resolve(this.data.units[project_id])
|
|
})
|
|
}
|
|
return reservations.get.units(project_id).then(units => {
|
|
this.data.units[project_id] = units
|
|
})
|
|
},
|
|
user: rut => {
|
|
if (this.data.current_user !== null && this.data.current_user?.rut === rut) {
|
|
return this.data.current_user
|
|
}
|
|
this.loader.show()
|
|
const uri = `/api/persona/${rut}`
|
|
return APIClient.fetch(uri).then(response => response.json()).then(json => {
|
|
this.loader.hide()
|
|
if (!json.success) {
|
|
return
|
|
}
|
|
this.data.current_user = json.persona
|
|
return json.persona
|
|
})
|
|
}
|
|
}
|
|
fill = {
|
|
user: user => {
|
|
if (typeof user === 'undefined' || user === null) {
|
|
return
|
|
}
|
|
const form = this.components.form
|
|
form.querySelector(`input[name="${this.prefix}_buyer_name"]`).value = user.nombres || ''
|
|
form.querySelector(`input[name="${this.prefix}_buyer_last_name"]`).value = user.apellidoPaterno || ''
|
|
form.querySelector(`input[name="${this.prefix}_buyer_last_name2"]`).value = user.apellidoMaterno || ''
|
|
form.querySelector(`input[name="${this.prefix}_buyer_address_street"]`).value = user.datos?.direccion?.calle || ''
|
|
form.querySelector(`input[name="${this.prefix}_buyer_address_number"]`).value = user.datos?.direccion?.numero || ''
|
|
form.querySelector(`input[name="${this.prefix}_buyer_address_extra"]`).value = user.datos?.direccion?.extra || ''
|
|
if (parseInt(this.components.$region.dropdown('get value')) !== user.datos?.direccion?.comuna?.provincia?.region?.id) {
|
|
this.components.$region.dropdown('set selected', user.datos?.direccion?.comuna?.provincia?.region?.id)
|
|
} else {
|
|
this.components.$comuna.dropdown('set selected', user.datos?.direccion?.comuna?.id)
|
|
}
|
|
form.querySelector(`input[name="${this.prefix}_buyer_phone"]`).value = user.datos?.telefono || ''
|
|
const email_parts = user.datos?.email?.split('@') || []
|
|
form.querySelector(`input[name="${this.prefix}_buyer_email_name"]`).value = email_parts[0] || ''
|
|
form.querySelector(`input[name="${this.prefix}_buyer_email_domain"]`).value = email_parts[1] || ''
|
|
if (user.datos !== null && 'estadoCivil' in user.datos) {
|
|
form.querySelector(`input[name="${this.prefix}_buyer_marital_status"]`).value = user.datos?.estadoCivil.charAt(0).toUpperCase() + user.datos?.estadoCivil.slice(1)
|
|
} else {
|
|
form.querySelector(`input[name="${this.prefix}_buyer_marital_status"]`).value = ''
|
|
}
|
|
if (user.datos !== null &&'ocupacion' in user.datos) {
|
|
form.querySelector(`input[name="${this.prefix}_buyer_profession"]`).value = user.datos?.ocupacion.charAt(0).toUpperCase() + user.datos?.ocupacion.slice(1).toLowerCase()
|
|
} else {
|
|
form.querySelector(`input[name="${this.prefix}_buyer_profession"]`).value = ''
|
|
}
|
|
if (user.datos !== null &&'fechaNacimiento' in user.datos) {
|
|
this.components.$birthdate.calendar('set date', user.datos?.fechaNacimiento)
|
|
}
|
|
},
|
|
brokers: () => {
|
|
this.components.$broker.dropdown('change values', this.data.brokers[this.data.current_project])
|
|
},
|
|
units: () => {
|
|
const buttons = []
|
|
Object.entries(this.maps.unit_types).forEach(([type, map]) => {
|
|
if (!(type in this.data.units[this.data.current_project])) {
|
|
return
|
|
}
|
|
buttons.push(`<div class="field"><div class="ui icon button" data-type="${type}" title="${type.charAt(0).toUpperCase() + type.slice(1)}"><i class="plus icon"></i><i class="${map} icon"></i></div></div>`)
|
|
})
|
|
|
|
this.components.unit_buttons.innerHTML = buttons.join('')
|
|
this.components.unit_buttons.querySelectorAll('.ui.icon.button').forEach(button => {
|
|
button.addEventListener('click', () => {
|
|
this.units.add(button.dataset.type)
|
|
})
|
|
})
|
|
}
|
|
}
|
|
watch = {
|
|
region: (value, text, $choice) => {
|
|
this.get.comunas(value)
|
|
},
|
|
}
|
|
loader = {
|
|
show: () => {
|
|
this.components.$loader.show()
|
|
},
|
|
hide: () => {
|
|
this.components.$loader.hide()
|
|
}
|
|
}
|
|
validateBody(body) {
|
|
const fieldMap = {
|
|
'project_id': this.reservation.project_id,
|
|
'date': this.reservation.date,
|
|
'buyer_rut': this.reservation.buyer.rut.toString(),
|
|
'buyer_digit': this.reservation.buyer.digito,
|
|
'buyer_name': this.reservation.buyer.nombres,
|
|
'buyer_last_name': this.reservation.buyer.apellidoPaterno,
|
|
'buyer_last_name2': this.reservation.buyer.apellidoMaterno,
|
|
'buyer_address_street': this.reservation.buyer.datos?.direccion?.calle,
|
|
'buyer_address_number': this.reservation.buyer.datos?.direccion?.numero?.toString(),
|
|
'buyer_address_extra': this.reservation.buyer.datos?.direccion?.extra,
|
|
'buyer_address_comuna_id': this.reservation.buyer.datos?.direccion?.comuna?.id?.toString(),
|
|
'buyer_phone': this.reservation.buyer.datos?.telefono,
|
|
'buyer_email': this.reservation.buyer.datos?.email,
|
|
'buyer_birthdate': this.reservation.buyer.datos?.fechaNacimiento,
|
|
'buyer_marital_status': this.reservation.buyer.datos?.estadoCivil,
|
|
'buyer_profession': this.reservation.buyer.datos?.ocupacion,
|
|
'broker_rut': this.reservation.broker?.rut?.toString(),
|
|
'payment_pie': this.reservation.payment?.pie?.valor?.toString(),
|
|
'payment_cuotas': this.reservation.payment?.pie?.cuotas?.toString(),
|
|
'payment_credit': this.reservation.payment?.credito?.valor?.toString(),
|
|
'promotions[]': this.reservation.promotions?.map(p => p.id.toString()),
|
|
'units[]': this.reservation.units?.map(u => u.unit.id.toString()),
|
|
'units_value[]': this.reservation.units?.map(u => u.value.toString()),
|
|
}
|
|
Object.entries(fieldMap).forEach(([key, value]) => {
|
|
if (key.includes('[]') && body.has(`${this.prefix}_${key}`)) {
|
|
const values = body.getAll(`${this.prefix}_${key}`)
|
|
if (values.length !== value.length) {
|
|
return
|
|
}
|
|
const diff = values.some(v => !value.includes(v))
|
|
if (diff.length > 0) {
|
|
return
|
|
}
|
|
if (JSON.stringify(values.sort()) !== JSON.stringify(value.sort())) {
|
|
return
|
|
}
|
|
body.delete(`${this.prefix}_${key}`)
|
|
return
|
|
}
|
|
if (body.has(`${this.prefix}_${key}`) && value === body.get(`${this.prefix}_${key}`)) {
|
|
body.delete(`${this.prefix}_${key}`)
|
|
}
|
|
})
|
|
|
|
return body
|
|
}
|
|
show() {
|
|
this.reset()
|
|
this.components.$modal.modal('show')
|
|
}
|
|
setup() {
|
|
this.components.$modal = $(`#${this.ids.modal}`)
|
|
this.components.form = document.getElementById(this.ids.form)
|
|
this.components.$date = $(`#${this.ids.date}`)
|
|
this.components.rut = document.getElementById(this.ids.rut)
|
|
this.components.digit = document.getElementById(this.ids.digit)
|
|
this.components.$birthdate = $(`#${this.ids.birthdate}`)
|
|
this.components.$comuna = $(`#${this.ids.comuna}`)
|
|
this.components.$region = $(`#${this.ids.region}`)
|
|
this.components.$broker = $(`#${this.ids.broker}`)
|
|
this.components.projects = document.getElementById(this.ids.projects)
|
|
this.components.project_name = document.getElementById(this.ids.project_name)
|
|
this.components.units.parent = this
|
|
|
|
const cdo = structuredClone(calendar_date_options)
|
|
cdo['initialDate'] = new Date()
|
|
cdo['maxDate'] = new Date()
|
|
this.components.$date.calendar(cdo)
|
|
const rutInput = this.components.rut.querySelector('input')
|
|
rutInput.addEventListener('input', event => {
|
|
const value = event.currentTarget.value.replace(/\D/g, '')
|
|
if (value.length <= 3) {
|
|
return
|
|
}
|
|
this.components.digit.textContent = Rut.digitoVerificador(value)
|
|
})
|
|
rutInput.addEventListener('blur', event => {
|
|
const value = event.currentTarget.value.replace(/\D/g, '')
|
|
if (value.length <= 3) {
|
|
return
|
|
}
|
|
event.currentTarget.value = Rut.format(value)
|
|
this.get.user(value).then(user => {
|
|
this.fill.user(user)
|
|
})
|
|
})
|
|
const cdo2 = structuredClone(cdo)
|
|
cdo2['initialDate'].setFullYear(cdo2['initialDate'].getFullYear() - 18)
|
|
cdo2['maxDate'].setFullYear(cdo2['maxDate'].getFullYear() - 18)
|
|
this.components.$birthdate.calendar(cdo2)
|
|
this.components.$region.dropdown({
|
|
fireOnInit: true,
|
|
onChange: this.watch.region
|
|
})
|
|
this.components.$region.dropdown('set selected', 13)
|
|
this.components.$comuna.dropdown()
|
|
this.components.$broker.dropdown()
|
|
this.components.$loader = $(`#${this.ids.loader}`)
|
|
}
|
|
}
|
|
</script>
|
|
@endpush
|