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 static 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')); } } ?>