2021-03-25 21:10:44 -03:00
|
|
|
<?php
|
|
|
|
namespace App\Controller;
|
|
|
|
|
|
|
|
use Carbon\Carbon;
|
|
|
|
use App\Definition\Controller;
|
|
|
|
use Incoviba\old\Common\Direccion;
|
|
|
|
use Incoviba\old\Common\Region;
|
|
|
|
use Incoviba\nuevo\Common\Direccion as D;
|
|
|
|
use Incoviba\old\Inmobiliaria\Inmobiliaria;
|
|
|
|
use Incoviba\old\Proyecto\AvanceConstruccion;
|
|
|
|
use Incoviba\old\Proyecto\EstadoProyecto;
|
|
|
|
use Incoviba\old\Proyecto\Pagare;
|
|
|
|
use Incoviba\old\Proyecto\Proyecto;
|
|
|
|
use Incoviba\old\Proyecto\ProyectoTipoUnidad;
|
|
|
|
use Incoviba\old\Proyecto\TipoEstadoProyecto;
|
|
|
|
use Incoviba\old\Proyecto\TipoMonedaPagare;
|
|
|
|
use Incoviba\old\Venta\TipoUnidad;
|
|
|
|
use Incoviba\old\Venta\Unidad;
|
|
|
|
|
|
|
|
class Proyectos
|
|
|
|
{
|
|
|
|
use Controller;
|
|
|
|
|
|
|
|
protected static function setDefault()
|
|
|
|
{
|
|
|
|
self::$default = self::list();
|
|
|
|
}
|
|
|
|
public static function list()
|
|
|
|
{
|
|
|
|
$id_inmobiliaria = get('inmobiliaria');
|
|
|
|
if ($id_inmobiliaria != null) {
|
|
|
|
$proyectos = model(Proyecto::class)->where('inmobiliaria', $id_inmobiliaria);
|
|
|
|
} else {
|
|
|
|
$proyectos = model(Proyecto::class);
|
|
|
|
}
|
|
|
|
$proyectos = $proyectos->order_by_asc('descripcion')->findMany();
|
|
|
|
return view('proyectos.list', compact('proyectos'));
|
|
|
|
}
|
|
|
|
public static function show()
|
|
|
|
{
|
|
|
|
$id_proyecto = get('proyecto');
|
|
|
|
if ($id_proyecto == null) {
|
|
|
|
header('Location: ' . url('', ['p' => 'proyectos', 'a' => 'list']));
|
|
|
|
}
|
|
|
|
$proyecto = model(Proyecto::class)->findOne($id_proyecto);
|
|
|
|
$estados = model(TipoEstadoProyecto::class)->findMany();
|
|
|
|
foreach ($estados as &$estado) {
|
|
|
|
$estado = $estado->asArray()['orden'] + 1;
|
|
|
|
}
|
|
|
|
$colors = [];
|
|
|
|
|
|
|
|
$ventas_pt = (object) ['fields' => [], 'data' => [], 'totales' => [], 'vendidas' => []];
|
|
|
|
$ventas = $proyecto->ventas('fecha');
|
|
|
|
$months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
|
|
|
|
if (count($ventas) > 0) {
|
|
|
|
$inicio = $ventas[0]->fecha()->format('Y');
|
|
|
|
$fin = $ventas[count($ventas) - 1]->fecha()->format('Y');
|
|
|
|
$end = $ventas[count($ventas) - 1]->fecha()->format('M');
|
|
|
|
for ($y = $inicio; $y <= $fin; $y ++) {
|
|
|
|
foreach ($months as $month) {
|
|
|
|
$ventas_pt->fields []= $y . ' ' . $month;
|
|
|
|
if ($y == $fin and $month == $end) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach ($proyecto->tipologias() as $tipo) {
|
|
|
|
if (!isset($ventas_pt->data[$tipo->tipologia->descripcion])) {
|
|
|
|
$ventas_pt->data[$tipo->tipologia->descripcion] = [];
|
|
|
|
$ventas_pt->data[$tipo->tipologia->descripcion] = array_fill(0, count($ventas_pt->fields), 0);
|
|
|
|
$ventas_pt->totales[$tipo->tipologia->descripcion] = 0;
|
|
|
|
$ventas_pt->vendidas[$tipo->tipologia->descripcion] = 0;
|
|
|
|
}
|
|
|
|
foreach ($tipo->tipos as $pt) {
|
|
|
|
foreach ($pt->ventas('fecha') as $venta) {
|
|
|
|
$ventas_pt->data[$tipo->tipologia->descripcion][array_search($venta->fecha()->format('Y M'), $ventas_pt->fields)] ++;
|
|
|
|
$ventas_pt->vendidas[$tipo->tipologia->descripcion] ++;
|
|
|
|
}
|
|
|
|
$ventas_pt->totales[$tipo->tipologia->descripcion] += count($pt->unidades());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
foreach ($ventas_pt->data as $tipo => $data) {
|
|
|
|
$acum = 0;
|
|
|
|
foreach ($data as $i => $cantidad) {
|
|
|
|
$acum += $cantidad;
|
|
|
|
$ventas_pt->data[$tipo][$i] = round($acum / $ventas_pt->totales[$tipo] * 100, 2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$meses = ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'];
|
|
|
|
array_walk($ventas_pt->fields, function(&$item) use ($meses, $months) {
|
|
|
|
$item = str_replace($months, $meses, $item);
|
|
|
|
});
|
|
|
|
|
|
|
|
for ($i = 0; $i < 10; $i ++) {
|
|
|
|
$colors[$i] = 'rgb(' . mt_rand(0, 255) . ', ' . mt_rand(0, 255) . ', ' . mt_rand(0, 255) . ')';
|
|
|
|
}
|
|
|
|
return view('proyectos.show', compact('proyecto', 'estados', 'colors', 'ventas_pt'));
|
|
|
|
}
|
|
|
|
public static function historial()
|
|
|
|
{
|
|
|
|
$proyecto = model(Proyecto::class)->findOne(get('proyecto'));
|
|
|
|
return view('proyectos.historia', compact('proyecto'));
|
|
|
|
}
|
|
|
|
public static function advance()
|
|
|
|
{
|
|
|
|
$id_proyecto = get('proyecto');
|
|
|
|
$proyecto = model(Proyecto::class)->findOne($id_proyecto);
|
|
|
|
$estados = model(TipoEstadoProyecto::class)->whereGt('orden', $proyecto->estado()->tipo()->orden)->orderByAsc('orden')->findMany();
|
|
|
|
|
|
|
|
return view('proyectos.advance', compact('proyecto', 'estados'));
|
|
|
|
}
|
|
|
|
public static function avanzar()
|
|
|
|
{
|
|
|
|
$id_proyecto = get('proyecto');
|
|
|
|
$proyecto = model(Proyecto::class)->findOne($id_proyecto);
|
|
|
|
$id_tipo = post('estado');
|
|
|
|
$tipo = model(TipoEstadoProyecto::class)->findOne($id_tipo);
|
|
|
|
$f = Carbon::createFromDate(post('year'), post('month'), post('day'), config('app.timezone'));
|
|
|
|
|
|
|
|
$tipos = model(TipoEstadoProyecto::class)
|
|
|
|
->whereGt('orden', $proyecto->estado()->tipo()->orden)
|
|
|
|
->whereLte('orden', $tipo->orden)
|
|
|
|
->orderByAsc('orden')
|
|
|
|
->findMany();
|
|
|
|
|
|
|
|
foreach ($tipos as $t) {
|
|
|
|
$estado = model(EstadoProyecto::class)->create();
|
|
|
|
$estado->proyecto = $proyecto->id;
|
|
|
|
$estado->estado = $t->id;
|
|
|
|
$estado->fecha = $f->format('Y-m-d');
|
|
|
|
$estado->save();
|
|
|
|
}
|
|
|
|
header('Location: ' . url('', ['p' => 'proyectos', 'a' => 'show', 'proyecto' => $proyecto->id]));
|
|
|
|
}
|
|
|
|
public static function avance()
|
|
|
|
{
|
|
|
|
$id = get('proyecto');
|
|
|
|
$proyecto = model(Proyecto::class)->findOne($id);
|
|
|
|
$f = Carbon::createFromDate(post('year'), post('month'), post('day'), config('app.timezone'));
|
|
|
|
$av = post('avance') / 100;
|
|
|
|
$ep = (double) post('estado_pago');
|
|
|
|
$avance = model(AvanceConstruccion::class)
|
|
|
|
->where('proyecto', $proyecto->id)
|
|
|
|
->where('fecha', $f->format('Y-m-d'))
|
|
|
|
->findOne();
|
|
|
|
if (!$avance) {
|
|
|
|
$data = [
|
|
|
|
'proyecto' => $proyecto->id,
|
|
|
|
'fecha' => $f->format('Y-m-d'),
|
|
|
|
'numero' => post('numero'),
|
|
|
|
'avance' => $av,
|
|
|
|
'estado_pago' => $ep
|
|
|
|
];
|
|
|
|
$avance = model(AvanceConstruccion::class)->create($data);
|
|
|
|
}
|
|
|
|
$avance->save();
|
|
|
|
header('Location: ' . url('', ['p' => 'proyectos', 'a' => 'historial', 'proyecto' => $proyecto->id]));
|
|
|
|
}
|
|
|
|
public static function add()
|
|
|
|
{
|
|
|
|
$rut = get('inmobiliaria');
|
|
|
|
|
|
|
|
$inmobiliarias = model(Inmobiliaria::class)->orderByAsc('abreviacion')->findMany();
|
|
|
|
$regiones = model(Region::class)->orderByAsc('numeracion')->findMany();
|
|
|
|
|
|
|
|
return view('proyectos.add', compact('inmobiliarias', 'rut', 'regiones'));
|
|
|
|
}
|
|
|
|
public static function agregar()
|
|
|
|
{
|
|
|
|
$proyecto = model(Proyecto::class)->where('descripcion', post('descripcion'))->where('inmobiliaria', post('inmobiliaria'))->find_one();
|
|
|
|
if ($proyecto) {
|
|
|
|
header('Location: ' . url('', ['p' => 'proyectos', 'a' => 'show', 'proyecto' => $proyecto->id]));
|
|
|
|
die();
|
|
|
|
}
|
|
|
|
$proyecto = model(Proyecto::class)->create();
|
|
|
|
$proyecto->descripcion = post('descripcion');
|
|
|
|
$proyecto->inmobiliaria = post('inmobiliaria');
|
|
|
|
|
|
|
|
$direccion = model(Direccion::class)
|
|
|
|
->where('calle', post('calle'))
|
|
|
|
->where('numero', post('numero'))
|
|
|
|
->where('extra', post('extra'))
|
|
|
|
->where('comuna', post('comuna'))
|
|
|
|
->findOne();
|
|
|
|
if (!$direccion) {
|
|
|
|
$direccion = model(Direccion::class)->create();
|
|
|
|
$direccion->calle = post('calle');
|
|
|
|
$direccion->numero = post('numero');
|
|
|
|
$direccion->extra = post('extra');
|
|
|
|
$direccion->comuna = post('comuna');
|
|
|
|
$direccion->save();
|
|
|
|
}
|
|
|
|
|
|
|
|
$proyecto->direccion = $direccion->id;
|
|
|
|
$proyecto->save();
|
|
|
|
|
|
|
|
$fecha = Carbon::parse(post('year'), post('month'), post('day'), config('app.timezone'));
|
|
|
|
$estado = model(EstadoProyecto::class)->create();
|
|
|
|
$estado->proyecto = $proyecto->id;
|
|
|
|
$estado->estado = 1;
|
|
|
|
$estado->fecha = $fecha->format('Y-m-d');
|
|
|
|
$estado->save();
|
|
|
|
header('Location: ' . url('', ['p' => 'proyectos', 'a' => 'show', 'proyecto' => $proyecto->id]));
|
|
|
|
}
|
|
|
|
public static function disponibles()
|
|
|
|
{
|
|
|
|
$id = get('proyecto');
|
|
|
|
$proyecto = model(Proyecto::class)->findOne($id);
|
|
|
|
|
|
|
|
return view('proyectos.disponibles', compact('proyecto'));
|
|
|
|
}
|
|
|
|
public static function list_unidades()
|
|
|
|
{
|
|
|
|
$id = get('proyecto');
|
|
|
|
$proyecto = model(Proyecto::class)->findOne($id);
|
|
|
|
$libres = model(Unidad::class)->where('proyecto', $proyecto->id)->where('pt', 0)->findMany();
|
|
|
|
|
|
|
|
return view('proyectos.unidades.list', compact('proyecto', 'libres'));
|
|
|
|
}
|
|
|
|
public static function add_tipo_unidad()
|
|
|
|
{
|
|
|
|
$id = get('proyecto');
|
|
|
|
$proyecto = model(Proyecto::class)->findOne($id);
|
|
|
|
$tipos = model(TipoUnidad::class)->findMany();
|
|
|
|
|
|
|
|
return view('proyectos.tipo_unidades.add', compact('proyecto', 'tipos'));
|
|
|
|
}
|
|
|
|
public static function agregar_tipo_unidad()
|
|
|
|
{
|
|
|
|
$id = get('proyecto');
|
|
|
|
$proyecto = model(Proyecto::class)->findOne($id);
|
|
|
|
$data = post();
|
|
|
|
$data['proyecto'] = $proyecto->id;
|
|
|
|
$tipo = model(ProyectoTipoUnidad::class)->where('proyecto', $data['proyecto'])
|
|
|
|
->where('tipo', $data['tipo'])->where('nombre', $data['nombre'])->findOne();
|
|
|
|
if ($tipo === false) {
|
|
|
|
$tipo = model(ProyectoTipoUnidad::class)->create($data);
|
|
|
|
$tipo->save();
|
|
|
|
}
|
|
|
|
header('Location: ' . nUrl('proyectos', 'list_unidades', ['proyecto' => $proyecto->id]));
|
|
|
|
}
|
|
|
|
public static function construccion()
|
|
|
|
{
|
|
|
|
$id = get('proyecto');
|
|
|
|
$proyecto = model(Proyecto::class)->findOne($id);
|
|
|
|
return view('proyectos.construccion', compact('proyecto'));
|
|
|
|
}
|
|
|
|
public static function editar_avance()
|
|
|
|
{
|
|
|
|
$avance = model(AvanceConstruccion::class)->findOne(get('avance'));
|
|
|
|
return view('proyectos.avances.edit', compact('avance'));
|
|
|
|
}
|
|
|
|
public static function edit_avance()
|
|
|
|
{
|
|
|
|
$avance = model(AvanceConstruccion::class)->findOne(get('avance'));
|
|
|
|
$cols = [
|
|
|
|
'day',
|
|
|
|
'month',
|
|
|
|
'year',
|
|
|
|
'avance',
|
|
|
|
'estado_pago',
|
|
|
|
'pagado',
|
|
|
|
'day_pago',
|
|
|
|
'month_pago',
|
|
|
|
'year_pago'
|
|
|
|
];
|
|
|
|
$data = array_filter(post(), function($key) use ($cols) {
|
|
|
|
return (array_search($key, $cols) !== false);
|
|
|
|
}, \ARRAY_FILTER_USE_KEY);
|
|
|
|
$data['fecha'] = implode('-', [$data['year'], $data['month'], $data['day']]);
|
|
|
|
unset($data['year']);
|
|
|
|
unset($data['month']);
|
|
|
|
unset($data['day']);
|
|
|
|
$data['fecha_pagado'] = implode('-', [$data['year_pago'], $data['month_pago'], $data['day_pago']]);
|
|
|
|
unset($data['year_pago']);
|
|
|
|
unset($data['month_pago']);
|
|
|
|
unset($data['day_pago']);
|
|
|
|
$data['avance'] /= 100;
|
|
|
|
$avance->edit($data);
|
|
|
|
|
|
|
|
header('Location: ' . nUrl('proyectos', 'construccion', ['proyecto' => $avance->proyecto]));
|
|
|
|
}
|
|
|
|
public static function reservas()
|
|
|
|
{
|
|
|
|
$proyecto = model(Proyecto::class)->findOne(get('proyecto'));
|
|
|
|
$pisos = [];
|
|
|
|
$totales = [];
|
|
|
|
foreach ($proyecto->unidades('departamento') as $unidad) {
|
|
|
|
if (!isset($pisos[$unidad->piso - 1])) {
|
|
|
|
$piso = (object) ['descripcion' => $unidad->piso, 'unidades' => []];
|
|
|
|
$pisos[$unidad->piso - 1] = $piso;
|
|
|
|
}
|
|
|
|
if (!isset($totales[$unidad->linea()])) {
|
|
|
|
$totales[$unidad->linea()] = (object) ['ventas' => 0, 'reservas' => 0];
|
|
|
|
}
|
|
|
|
$pisos[$unidad->piso - 1]->unidades[$unidad->linea()] = $unidad;
|
|
|
|
if ($unidad->isVendida()) {
|
|
|
|
$totales[$unidad->linea()]->ventas ++;
|
|
|
|
}
|
|
|
|
if ($unidad->isReservada()) {
|
|
|
|
$totales[$unidad->linea()]->reservas ++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ksort($pisos);
|
|
|
|
$max_unidades = 0;
|
|
|
|
foreach ($pisos as $piso) {
|
|
|
|
if (count($piso->unidades) > $max_unidades) {
|
|
|
|
$max_unidades = count($piso->unidades);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return view('proyectos.reservas.base', compact('proyecto', 'pisos', 'max_unidades', 'totales'));
|
|
|
|
}
|
2023-06-22 23:15:17 -04:00
|
|
|
public static function unidades()
|
2021-03-25 21:10:44 -03:00
|
|
|
{
|
|
|
|
if (get('proyecto')) {
|
|
|
|
$proyecto = model(Proyecto::class)->findOne(get('proyecto'));
|
|
|
|
$libres = model(Unidad::class)->where('proyecto', $proyecto->id)->where('pt', 0)->findMany();
|
|
|
|
|
|
|
|
return view('proyectos.unidades.list', compact('proyecto', 'libres'));
|
|
|
|
}
|
|
|
|
$proyectos = model(Proyecto::class)->order_by_asc('descripcion')->findMany();
|
|
|
|
return view('proyectos.unidades.proyectos', compact('proyectos'));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
?>
|