Files
intranet/app/Controller/Proyectos.php
2020-12-01 17:23:13 -03:00

328 lines
11 KiB
PHP

<?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'));
}
public function unidades()
{
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'));
}
}
?>