Mostrar reservas
This commit is contained in:
@ -1,5 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
use Incoviba\Controller\Ventas\Cierres;
|
//use Incoviba\Controller\Ventas\Cierres;
|
||||||
|
use Incoviba\Controller\Ventas\Reservations as Cierres;
|
||||||
|
|
||||||
$app->group('/cierres', function($app) {
|
$app->group('/cierres', function($app) {
|
||||||
$app->get('[/]', Cierres::class);
|
$app->get('[/]', Cierres::class);
|
||||||
|
287
app/resources/views/ventas/reservations.blade.php
Normal file
287
app/resources/views/ventas/reservations.blade.php
Normal file
@ -0,0 +1,287 @@
|
|||||||
|
@extends('layout.base')
|
||||||
|
|
||||||
|
@section('page_title')
|
||||||
|
Cierres -Reservas
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('page_content')
|
||||||
|
<div class="ui container">
|
||||||
|
<h2 class="ui header">Cierres - Reservas</h2>
|
||||||
|
|
||||||
|
<div class="ui compact segment" id="projects">
|
||||||
|
<div class="ui header">Proyectos</div>
|
||||||
|
@if (count($projects) == 0)
|
||||||
|
<div class="ui message">
|
||||||
|
No hay proyectos en venta.
|
||||||
|
</div>
|
||||||
|
@else
|
||||||
|
<div class="ui link list">
|
||||||
|
@foreach ($projects as $project)
|
||||||
|
<div class="item link" data-id="{{ $project->id }}">
|
||||||
|
{{ $project->descripcion }}
|
||||||
|
</div>
|
||||||
|
@endforeach
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
<h4 class="ui header" id="project"></h4>
|
||||||
|
<div class="ui right aligned top attached basic segment" id="controls">
|
||||||
|
<div class="ui tiny icon buttons">
|
||||||
|
<button class="ui button" id="up_button">
|
||||||
|
<i class="up arrow icon"></i>
|
||||||
|
</button>
|
||||||
|
<button class="ui button" id="refresh_button">
|
||||||
|
<i class="refresh icon"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<table class="ui striped table" id="reservations">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Unidades</th>
|
||||||
|
<th>Cliente</th>
|
||||||
|
<th>Fecha</th>
|
||||||
|
<th>Oferta</th>
|
||||||
|
<th>¿Valida?</th>
|
||||||
|
<th>Operador</th>
|
||||||
|
<th class="right aligned">
|
||||||
|
<button class="ui small tertiary green icon button" id="add_button">
|
||||||
|
<i class="plus icon"></i>
|
||||||
|
</button>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody></tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@push('page_styles')
|
||||||
|
<style>
|
||||||
|
.item.link {
|
||||||
|
cursor: pointer;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
@endpush
|
||||||
|
|
||||||
|
@push('page_scripts')
|
||||||
|
<script>
|
||||||
|
class Projects {
|
||||||
|
display = {
|
||||||
|
projects: '',
|
||||||
|
project: ''
|
||||||
|
}
|
||||||
|
component_id = ''
|
||||||
|
component = null
|
||||||
|
current_project = null;
|
||||||
|
title_id = ''
|
||||||
|
title_component = null
|
||||||
|
|
||||||
|
constructor({component_id, title_id}) {
|
||||||
|
this.component_id = component_id
|
||||||
|
this.component = document.getElementById(this.component_id)
|
||||||
|
this.display.projects = this.component.style.display
|
||||||
|
this.title_id = title_id
|
||||||
|
this.title_component = document.getElementById(this.title_id)
|
||||||
|
this.display.project = this.title_component.style.display
|
||||||
|
|
||||||
|
this.show()
|
||||||
|
this.watch()
|
||||||
|
}
|
||||||
|
|
||||||
|
select(event) {
|
||||||
|
event.preventDefault()
|
||||||
|
|
||||||
|
const project_id = event.currentTarget.dataset.id
|
||||||
|
if (project_id === this.curent_project) {
|
||||||
|
this.hide()
|
||||||
|
this.title_component.innerHTML = event.currentTarget.innerHTML
|
||||||
|
|
||||||
|
reservations.action().reservations()
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.curent_project = project_id
|
||||||
|
reservations.get().reservations(project_id)
|
||||||
|
|
||||||
|
this.hide()
|
||||||
|
this.title_component.innerHTML = event.currentTarget.innerHTML
|
||||||
|
}
|
||||||
|
watch() {
|
||||||
|
this.component.querySelectorAll('.item.link').forEach(item => {
|
||||||
|
item.addEventListener('click', this.select.bind(this))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
show() {
|
||||||
|
this.component.style.display = this.display.projects
|
||||||
|
this.title_component.style.display = 'none'
|
||||||
|
}
|
||||||
|
hide() {
|
||||||
|
this.component.style.display = 'none'
|
||||||
|
this.title_component.style.display = this.display.project
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class Reservations {
|
||||||
|
display = {
|
||||||
|
reservations: '',
|
||||||
|
controls: ''
|
||||||
|
}
|
||||||
|
component_id = ''
|
||||||
|
component = null
|
||||||
|
controls_id = ''
|
||||||
|
controls = null
|
||||||
|
formatters = {
|
||||||
|
date: null,
|
||||||
|
ufs: null
|
||||||
|
}
|
||||||
|
|
||||||
|
reservations = []
|
||||||
|
|
||||||
|
constructor({component_id, controls_id, formatters = {date, ufs}}) {
|
||||||
|
this.component_id = component_id
|
||||||
|
this.component = document.getElementById(this.component_id)
|
||||||
|
this.display.reservations = this.component.style.display
|
||||||
|
this.controls_id = controls_id
|
||||||
|
this.controls = document.getElementById(this.controls_id)
|
||||||
|
this.display.controls = this.controls.style.display
|
||||||
|
this.formatters = formatters
|
||||||
|
|
||||||
|
this.watch()
|
||||||
|
this.hide()
|
||||||
|
}
|
||||||
|
|
||||||
|
watch() {
|
||||||
|
const buttons = this.controls.querySelectorAll('button')
|
||||||
|
const up_button = buttons[0]
|
||||||
|
const reset_button = buttons[1]
|
||||||
|
up_button.addEventListener('click', reservations.action().up.bind(reservations))
|
||||||
|
reset_button.addEventListener('click', reservations.action().reset.bind(reservations))
|
||||||
|
}
|
||||||
|
|
||||||
|
set() {
|
||||||
|
return {
|
||||||
|
reservations: reservations => {
|
||||||
|
this.reservations = reservations
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
draw() {
|
||||||
|
const tbody = this.component.querySelector('tbody')
|
||||||
|
tbody.innerHTML = ''
|
||||||
|
this.reservations.forEach(reservation => {
|
||||||
|
const tr = document.createElement('tr')
|
||||||
|
const date = new Date(Date.parse(reservation.fecha) + 24 * 60 * 60 * 1000)
|
||||||
|
tr.innerHTML = `
|
||||||
|
<td>${reservation.summary}</td>
|
||||||
|
<td>${reservation.buyer.nombreCompleto}</td>
|
||||||
|
<td>${this.formatters.date.format(date)}</td>
|
||||||
|
<td>${this.formatters.ufs.format(reservation.offer)} UF</td>
|
||||||
|
<td>${reservation.valid ? 'Si' : 'No'}</td>
|
||||||
|
<td>${reservation.broker?.name ?? ''}</td>
|
||||||
|
<td class="right aligned">
|
||||||
|
<button class="ui small icon button" data-id="${reservation.id}">
|
||||||
|
<i class="edit icon"></i>
|
||||||
|
</button>
|
||||||
|
<button class="ui small icon button" data-id="${reservation.id}">
|
||||||
|
<i class="trash icon"></i>
|
||||||
|
</button>
|
||||||
|
</td>
|
||||||
|
`
|
||||||
|
tbody.appendChild(tr)
|
||||||
|
})
|
||||||
|
this.show()
|
||||||
|
}
|
||||||
|
|
||||||
|
show() {
|
||||||
|
this.component.style.display = this.display.reservations
|
||||||
|
this.controls.style.display = this.display.controls
|
||||||
|
}
|
||||||
|
hide() {
|
||||||
|
this.component.style.display = 'none'
|
||||||
|
this.controls.style.display = 'none'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const reservations = {
|
||||||
|
components: {
|
||||||
|
projects: null,
|
||||||
|
reservations: null
|
||||||
|
},
|
||||||
|
get() {
|
||||||
|
return {
|
||||||
|
reservations: project_id => {
|
||||||
|
const reservations = [
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
summary: 'D1',
|
||||||
|
buyer: {
|
||||||
|
rut: '12345678-9',
|
||||||
|
nombreCompleto: 'Juan Perez'
|
||||||
|
},
|
||||||
|
fecha: '2021-01-01',
|
||||||
|
offer: 1000,
|
||||||
|
valid: false,
|
||||||
|
broker: {
|
||||||
|
name: 'Operador 1'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
summary: 'D2',
|
||||||
|
buyer: {
|
||||||
|
rut: '12345678-9',
|
||||||
|
nombreCompleto: 'Pedro Gonzalez'
|
||||||
|
},
|
||||||
|
fecha: '2021-10-01',
|
||||||
|
offer: 1200,
|
||||||
|
valid: true,
|
||||||
|
broker: null
|
||||||
|
}
|
||||||
|
]
|
||||||
|
this.components.reservations.set().reservations(reservations).draw()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
action() {
|
||||||
|
return {
|
||||||
|
reset: event => {
|
||||||
|
event.preventDefault()
|
||||||
|
this.components.projects.current_project = null
|
||||||
|
this.components.reservations.reservations = []
|
||||||
|
this.components.reservations.hide()
|
||||||
|
this.components.projects.show()
|
||||||
|
return false
|
||||||
|
},
|
||||||
|
up: event => {
|
||||||
|
event.preventDefault()
|
||||||
|
this.components.reservations.hide()
|
||||||
|
this.components.projects.show()
|
||||||
|
return false
|
||||||
|
},
|
||||||
|
reservations: () => {
|
||||||
|
this.components.reservations.draw()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
setup(configuration) {
|
||||||
|
const formatters = {
|
||||||
|
date: new Intl.DateTimeFormat('es-CL', {year: 'numeric', month: 'long', day: 'numeric'}),
|
||||||
|
ufs: new Intl.NumberFormat('es-CL', {minimumFractionDigits: 2, maximumFractionDigits: 2})
|
||||||
|
}
|
||||||
|
this.components.projects = new Projects({component_id: configuration.ids.projects, title_id: configuration.ids.project})
|
||||||
|
this.components.reservations = new Reservations({component_id: configuration.ids.reservations, controls_id: configuration.ids.controls, formatters})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$(document).ready(() => {
|
||||||
|
reservations.setup({
|
||||||
|
ids: {
|
||||||
|
projects: 'projects',
|
||||||
|
project: 'project',
|
||||||
|
controls: 'controls',
|
||||||
|
reservations: 'reservations'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
@endpush
|
22
app/src/Controller/Ventas/Reservations.php
Normal file
22
app/src/Controller/Ventas/Reservations.php
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
namespace Incoviba\Controller\Ventas;
|
||||||
|
|
||||||
|
use Psr\Http\Message\ResponseInterface;
|
||||||
|
use Psr\Http\Message\ServerRequestInterface;
|
||||||
|
use Incoviba\Common\Alias\View;
|
||||||
|
use Incoviba\Common\Implement\Exception\EmptyResult;
|
||||||
|
use Incoviba\Repository;
|
||||||
|
use Incoviba\Service;
|
||||||
|
|
||||||
|
class Reservations
|
||||||
|
{
|
||||||
|
public function __invoke(ServerRequestInterface $request, ResponseInterface $response,
|
||||||
|
Service\Proyecto $proyectoService, View $view): ResponseInterface
|
||||||
|
{
|
||||||
|
$projects = [];
|
||||||
|
try {
|
||||||
|
$projects = $proyectoService->getVendibles('descripcion');
|
||||||
|
} catch (EmptyResult) {}
|
||||||
|
return $view->render($response, 'ventas.reservations', compact('projects'));
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user