This commit is contained in:
2021-12-25 23:17:47 -03:00
parent 7e01974ec8
commit d7d671fb51
68 changed files with 2991 additions and 160 deletions

2
.gitignore vendored
View File

@ -1,6 +1,8 @@
**/*.env **/*.env
**/*.key
**/vendor/ **/vendor/
**/composer.lock **/composer.lock
**/cache/ **/cache/
**/temp/
**/logs/ **/logs/
**/.idea/ **/.idea/

12
Dockerfile Normal file
View File

@ -0,0 +1,12 @@
FROM php:8-fpm
RUN apt-get update -y && apt-get install -y zip libzip-dev git
RUN docker-php-ext-install zip
RUN pecl install xdebug-3.1.1 \
&& docker-php-ext-enable xdebug
WORKDIR /code
COPY --from=composer /usr/bin/composer /usr/bin/composer

View File

@ -0,0 +1,35 @@
<?php
namespace Incoviba\UI\Common\Controller;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
use Slim\Views\Blade as View;
use Incoviba\UI\Common\Service\Auth as Service;
class Auth {
public function login(Request $request, Response $response, View $view): Response {
$route = $_SESSION['route'] ?? '/';
return $view->render($response, 'auth.login', compact('route'));
}
public function doLogin(Request $request, Response $response, Service $service): Response {
$post = $request->getParsedBody();
$user = $post['name'];
$password = $post['password'];
$output = [
'login' => $service->login($user, $password)
];
if ($output['login']) {
unset($_SESSION['route']);
}
$response->getBody()->write(json_encode($output, JSON_UNESCAPED_SLASHES));
return $response
->withStatus(200)
->withHeader('content-type', 'application/json');
}
public function logout(Request $request, Response $response, Service $service): Response {
$service->logout();
return $response
->withStatus(302)
->withHeader('Location', '/');
}
}

View File

@ -0,0 +1,16 @@
<?php
namespace Incoviba\UI\Common\Controller;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
use Slim\Views\Blade as View;
class Base {
public function __invoke(Request $request, Response $response, View $view) {
$hoy = 0;
$pendientes = 0;
$dias = [];
$cierres = [];
return $view->render($response, 'home', compact('hoy', 'pendientes', 'dias', 'cierres'));
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace Incoviba\UI\Common\Middleware;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\RequestHandlerInterface as Handler;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ResponseFactoryInterface as Factory;
use Incoviba\UI\Common\Service\Auth as Service;
class Auth {
protected $service;
protected $factory;
protected $exceptions;
public function __construct(Service $service, Factory $factory, array $exception_routes) {
$this->service = $service;
$this->factory = $factory;
$this->exceptions = $exception_routes;
}
public function __invoke(Request $request, Handler $handler): Response {
$path = $request->getUri()->getPath();
if (in_array($path, $this->exceptions) or str_contains($path, '.') or $this->service->isIn()) {
return $handler->handle($request);
}
$route = $request->getUri();
$_SESSION['route'] = '' . $route;
$response = $this->factory->createResponse(302);
return $response
->withHeader('Location', '/auth/login');
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace Incoviba\UI\Common\Middleware;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\RequestHandlerInterface as Handler;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ResponseFactoryInterface as Factory;
use Slim\Exception\HttpNotFoundException;
use Slim\Views\Blade as View;
class NotFound {
protected Factory $factory;
protected View $view;
public function __construct(Factory $factory, View $view) {
$this->factory = $factory;
$this->view = $view;
}
public function __invoke(Request $request, Handler $handler): Response {
try {
return $handler->handle($request);
} catch (HttpNotFoundException $e) {
$page = $request->getUri()->getPath();
$response = $this->factory->createResponse(404);
return $this->view->render($response, '404', compact('page'));
}
}
}

126
common/Service/Auth.php Normal file
View File

@ -0,0 +1,126 @@
<?php
namespace Incoviba\UI\Common\Service;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
class Auth {
public function __construct(Client $client, string $cookie_name) {
$this->setClient($client);
$this->setCookieName($cookie_name);
}
protected $client;
public function setClient(Client $client) {
$this->client = $client;
return $this;
}
protected $cookie_name;
public function setCookieName(string $cookie_name) {
$this->cookie_name = $cookie_name;
return $this;
}
protected $cookie;
public function getCookie() {
if ($this->cookie === null) {
if (isset($_COOKIE[$this->cookie_name])) {
$this->cookie = $_COOKIE[$this->cookie_name];
}
}
return $this->cookie;
}
public function setCookie($token, $expires) {
return setcookie($this->cookie_name, $token, ['expires' => (int) $expires, 'SameSite' => 'Lax', 'path' => '/']);
}
protected $is_in;
public function isIn() {
if ($this->is_in === null) {
$token = $this->getCookie();
if ($token === null) {
$this->is_in = false;
return false;
}
if ($this->validate($token)) {
$this->is_in = true;
return true;
}
$this->is_in = false;
}
return $this->is_in;
}
protected $authorized;
public function validate(string $token): bool {
if ($this->authorized === null) {
try {
$response = $this->client->request('POST', 'auth/validate', ['json' => ['token' => $token]]);
} catch (RequestException $e) {
error_log('Validate: ' . var_export($e->getResponse()->getBody()->getContents(), true));
error_log($e);
$this->authorized = false;
return false;
}
if ($response->getStatusCode() != 200) {
$this->authorized = false;
return false;
}
$body = json_decode($response->getBody());
if ($body->status !== 'Authorized') {
$this->authorized = false;
return false;
}
$this->authorized = true;
}
return $this->authorized;
}
public function checkAccess($route) {
return true;
}
public function login($user, $password) {
try {
$response = $this->client->request('POST', 'auth/login', ['json' => ['name' => $user, 'password' => $password]]);
} catch (RequestException $e) {
error_log(var_export($e->getResponse()->getBody()->getContents(), true));
error_log($e);
return false;
}
if ($response->getStatusCode() != 200) {
return false;
}
$data = json_decode($response->getBody());
if (!$data->login) {
return false;
}
$this->setCookie($data->token, $data->expires);
return true;
}
public function logout() {
try {
$response = $this->client->request('POST', 'auth/logout', ['json' => ['token' => $this->getCookie()]]);
} catch (\Exception $e) {
error_log(var_export($e->getResponse()->getBody()->getContents(), true));
error_log($e);
return false;
}
$this->setCookie($this->getCookie(), 0);
return true;
}
protected $user_name;
public function user() {
if ($this->user_name === null) {
try {
$response = $this->client->request('POST', 'auth/user', ['json' => ['token' => $this->getCookie()]]);
} catch (\Exception $e) {
error_log(var_export($e->getResponse()->getBody()->getContents(), true));
error_log($e);
return false;
}
if ($response->getStatusCode() != 200) {
return false;
}
$data = json_decode($response->getBody());
$this->user_name = $data->user;
}
return $this->user_name;
}
}

30
composer.json Normal file
View File

@ -0,0 +1,30 @@
{
"name": "incoviba/ui",
"description": "Interfaz de Incoviba",
"type": "project",
"require": {
"slim/slim": "^4.9",
"php-di/slim-bridge": "^3.2",
"zeuxisoo/slim-whoops": "^0.7.3",
"nyholm/psr7": "^1.4",
"nyholm/psr7-server": "^1.0",
"rubellum/slim-blade-view": "^0.1.1",
"nesbot/carbon": "^2.54",
"guzzlehttp/guzzle": "^7.4"
},
"require-dev": {
"phpunit/phpunit": "^9.5",
"kint-php/kint": "^3.3"
},
"authors": [
{
"name": "Aldarien",
"email": "aldarien85@gmail.com"
}
],
"autoload": {
"psr-4": {
"Incoviba\\UI\\Common\\": "common/"
}
}
}

54
docker-compose.yml Normal file
View File

@ -0,0 +1,54 @@
version: '3'
x-restart:
&restart
restart: unless-stopped
x-timezone:
&tz
TZ: America/Santiago
services:
proxy:
image: nginx:alpine
container_name: incoviba_ui_proxy
<<: *restart
environment: *tz
ports:
- "8080:80"
volumes:
- ./:/code
- ./nginx.conf:/etc/nginx/conf.d/default.conf
networks:
- incoviba
ui:
build:
dockerfile: Dockerfile
container_name: incoviba_ui
<<: *restart
environment: *tz
env_file:
- .env
- .api.key
volumes:
- ./:/code
- ./php.ini:/usr/local/etc/php/conf.d/docker.ini
- ./logs/php/:/var/log/php/
networks:
- incoviba
redis:
image: redis:alpine
container_name: incoviba_redis
<<: *restart
command: redis-server
environment: *tz
volumes:
- incoviba_redis:/data
networks:
- incoviba
networks:
incoviba:
external: true
volumes:
incoviba_redis: {}

22
nginx.conf Normal file
View File

@ -0,0 +1,22 @@
server {
listen 80;
server_name api;
index index.php;
error_log /code/logs/error.log;
access_log /code/logs/access.log;
root /code/public;
location / {
try_files $uri /index.php$is_args$args;
}
location ~ \.php {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_index index.php;
fastcgi_pass ui:9000;
}
}

1945
php.ini Normal file

File diff suppressed because it is too large Load Diff

9
public/index.php Normal file
View File

@ -0,0 +1,9 @@
<?php
session_start();
include_once implode(DIRECTORY_SEPARATOR, [
dirname(__FILE__, 2),
'setup',
'app.php'
]);
$app->run();

238
public/js/home.js Normal file
View File

@ -0,0 +1,238 @@
class ProyectoCantidad {
constructor({proyecto = '', cantidad = 0}) {
this.proyecto = proyecto
this.cantidad = cantidad
}
draw() {
return $('<div></div>').attr('class', 'event').append(
$('<div></div>').attr('class', 'content').append(
$('<div></div>').attr('class', 'summary').html(this.proyecto)
)
).append(
$('<div></div>').attr('class', 'meta').html(this.cantidad)
)
}
}
class Dia {
constructor({dia = null, proyectos = []}) {
this.dia = dia
this.proyectos = []
$.each(proyectos, (i, el) => {
const pc = new ProyectoCantidad(el)
this.proyectos.push(pc)
})
this.valor_total = false
}
format() {
return {
dia: () => {
const intl = Intl.DateTimeFormat('es-ES', {day: 'numeric', month: 'long', year: 'numeric', weekday: 'short'})
return intl.format(new Date(this.dia.replaceAll('-', '/')))
}
}
}
total() {
if (!this.valor_total) {
this.valor_total = 0
$.each(this.proyectos, (i, el) => {
this.valor_total += el.cantidad
})
}
return this.valor_total
}
draw() {
const feed = $('<div></div>').attr('class', 'ui feed')
$.each(this.proyectos, (i, el) => {
feed.append(el.draw())
})
return $('<div></div>').attr('class', 'item').append(
$('<div></div>').attr('class', 'date').append(
$('<strong></strong>').html(this.format().dia() + '<br /><small>Total: ' + this.total() + '</small>')
)
).append(feed)
}
}
class Calendario {
constructor({id, token}) {
this.id = id
this.token = token
this.dias = []
}
get() {
return sendGet('/proyectos/cuotas/mes').then((resp) => {
if (resp.dias === null || resp.dias.length === 0) {
return
}
$.each(resp.dias, (i, el) => {
const dia = new Dia(el)
this.dias.push(dia)
})
}).then(() => {
this.draw()
})
}
build(parent_elem) {
let parent = parent_elem.find('.ui.list')
if (parent.length === 0) {
parent_elem.append(
$('<div></div>').attr('class', 'ui dividing header').html('Cuotas del próximo mes móvil')
)
parent = $('<div></div>').attr('class', 'ui divided list')
parent_elem.append(parent)
}
return parent
}
draw() {
const div = $(this.id)
const parent = this.build(div)
parent.html('')
$.each(this.dias, (i, el) => {
parent.append(el.draw())
})
}
}
class CierresProyecto {
constructor({proyecto, total, promesados, pendientes, rechazados, ultimo_pendiente}) {
this.proyecto = proyecto
this.total = total
this.promesados = promesados
this.pendientes = pendientes
this.rechazados = rechazados
this.ultimo_pendiente = ultimo_pendiente
}
draw() {
function event({title, meta, date = ''}) {
const event = $('<div></div>').attr('class', 'event')
const content = $('<div></div>').attr('class', 'content').append(
$('<div></div>').attr('class', 'summary').html(title)
)
if (date !== '') {
content.append(
$('<div></div>').attr('class', 'meta').html(date)
)
}
event.append(content).append(
$('<div></div>').attr('class', 'meta').html(meta)
)
return event
}
return $('<div></div>').attr('class', 'item').append(
$('<div></div>').attr('class', 'date').append(
$('<strong></strong>').html(this.proyecto)
).append(' [' + this.total + ']')
).append(
$('<div></div>').attr('class', 'ui feed').append(
event({
title: 'Promesados',
meta: this.promesados
})
).append(
event({
title: 'Pendientes',
meta: this.pendientes,
date: (this.pendientes > 0) ? 'Desde ' + this.ultimo_pendiente + ' días atrás' : ''
})
).append(
event({
title: 'Rechazados',
meta: this.rechazados
})
)
)
}
}
class Cierres {
constructor({id}) {
this.id = id
this.proyectos = []
}
get() {
return sendGet('/proyectos/cierres').then((resp) => {
if (resp.cierres === null || resp.cierres.length === 0) {
return
}
$.each(resp.cierres, (i, el) => {
const p = new CierresProyecto(el)
this.proyectos.push(p)
})
}).then(() => {
this.draw()
})
}
draw() {
const parent = $(this.id)
parent.append(
$('<div></div>').attr('class', 'ui dividing header').html('Cierres Vigentes')
)
const list = $('<div></div>').attr('class', 'ui divided list')
$.each(this.proyectos, (i, el) => {
list.append(el.draw())
})
parent.append(list)
}
}
const home = {
calendario: null,
cierres: null,
token: 0,
hoy: 0,
pendientes: 0,
get: function() {
return {
hoy: () => {
return sendGet('/proyectos/cuotas/hoy').then((resp) => {
this.hoy = resp.hoy
}).then(() => {
this.draw().hoy()
})
},
pendientes: () => {
return sendGet('/proyectos/cuotas/pendientes').then((resp) => {
this.pendientes = resp.pendientes
}).then(() => {
this.draw().pendientes()
})
}
}
},
draw: function() {
return {
hoy: () => {
if (this.hoy === 0) {
return
}
const parent = $('#hoy')
parent.append(
$('<div></div>').attr('class', 'row').append(
$('<div></div>').attr('class', 'col-md-12').html('Hay ' + this.hoy + ' deposito' + ((this.hoy > 1) ? 's' : '') + ' para hoy.')
)
)
},
pendientes: () => {
const parent = $('#pendientes')
parent.append(
$('<div></div>').attr('class', 'row').append(
$('<div></div>').attr('class', 'col-md-12').append(
$('<a></a>').attr('href', _urls.base + '/cuotas/pendientes')
.html('Existe' + ((this.pendientes > 1) ? 'n' : '') + ' ' + this.pendientes + ' cuota' + ((this.pendientes > 1) ? 's' : '') + ' pendiente' + ((this.pendientes > 1) ? 's' : '') + '.').append(
$('<span></span>').attr('class', 'glyphicon glyphicon-arrow-right')
)
)
)
)
}
}
},
build: function() {
this.calendario = new Calendario({id: '#calendario', token: this.token})
this.calendario.get()
this.cierres = new Cierres({id: '#cierres'})
this.cierres.get()
},
setup: function() {
this.get().hoy()
this.get().pendientes()
this.build()
}
}

View File

@ -0,0 +1,4 @@
<?php
use Incoviba\UI\Common\Controller\Base;
$app->get('[/]', Base::class);

View File

@ -0,0 +1,10 @@
<?php
use Incoviba\UI\Common\Controller\Auth;
$app->group('/auth', function($app) {
$app->group('/login', function ($app) {
$app->get('[/]', [Auth::class, 'login']);
$app->post('[/]', [Auth::class, 'doLogin']);
});
$app->get('/logout', [Auth::class, 'logout']);
});

View File

@ -0,0 +1,6 @@
<?php
$app->group('/inmobiliarias', function ($app) {
$app->get('[/]', function ($request, $response) {
return $response;
});
});

View File

@ -0,0 +1,12 @@
@extends('layout.base')
@section('page_title')
No Encontrada
@endsection
@section('content')
<div class="ui warning message">
<i class="big exclamation triangle icon"></i>
P&aacute;gina {{$page}} no encontrada.
</div>
@endsection

View File

@ -1,7 +1,7 @@
<nav class="navbar navbar-default"> <nav class="navbar navbar-default">
<ul class="nav navbar-nav"> <ul class="nav navbar-nav">
<li><a href=".">Inicio</a></li> <li><a href=".">Inicio</a></li>
<li><a href="{{url('', ['p' => 'admin'])}}">Administraci&oacute;n</a> <li><a href="{{$urls->base}}/admin">Administraci&oacute;n</a>
<li role="presentation" class="dropdown"> <li role="presentation" class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false"> <a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">
Modelos <span class="caret"></span> Modelos <span class="caret"></span>
@ -20,7 +20,7 @@
</a> </a>
@include('admin.menu.users') @include('admin.menu.users')
</li> </li>
<li><a href="{{url('admin/registros')}}">Registros</a></li> <li><a href="{{$urls->base}}/admin/registros">Registros</a></li>
<?php <?php
/* /*
<li role="presentation" class="dropdown"> <li role="presentation" class="dropdown">
@ -32,7 +32,7 @@
*/ ?> */ ?>
<li role="presentation" class="dropdown"> <li role="presentation" class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false"> <a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">
{{\App\Contract\Auth::User()->name}} <span class="caret"></span> {{$user->name}} <span class="caret"></span>
</a> </a>
@include('layout.menu.login') @include('layout.menu.login')
</li> </li>

View File

@ -1,3 +1,3 @@
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a href="{{url('', ['p' => 'admin', 'a' => 'listModels'])}}">Listar Modelos</a></li> <li><a href="{{$urls->base}}/admin/models">Listar Modelos</a></li>
</ul> </ul>

View File

@ -1,3 +1,3 @@
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a href="{{nUrl('registros', 'list')}}">Listar Registros</a></li> <li><a href="{{$urls->base}}/registros">Listar Registros</a></li>
</ul> </ul>

View File

@ -1,4 +1,4 @@
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a href="{{nUrl('admin', 'list_roles')}}">Listar Roles</a></li> <li><a href="{{$urls->base}}/admin/roles">Listar Roles</a></li>
<li><a href="{{nUrl('admin', 'add_role')}}">Agregar Rol</a></li> <li><a href="{{$urls->base}}/admin/roles/add">Agregar Rol</a></li>
</ul> </ul>

View File

@ -1,4 +1,4 @@
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a href="{{url('', ['p' => 'admin', 'a' => 'list_users'])}}">Listar Usuarios</a></li> <li><a href="{{$urls->base}}/admin/users">Listar Usuarios</a></li>
<li><a href="{{url('', ['p' => 'admin', 'a' => 'add_user'])}}">Agregar Usuario</a></li> <li><a href="{{$urls->base}}/admin/users/add">Agregar Usuario</a></li>
</ul> </ul>

View File

@ -4,7 +4,7 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading">DB to Models</div> <div class="panel-heading">DB to Models</div>
<div class="panel-body"> <div class="panel-body">
<form action="{{url('', ['p' => 'admin', 'a' => 'models'])}}" method="post" class="form-horizontal" id="databases"> <form action="{{$urls->base}}/admin/models" method="post" class="form-horizontal" id="databases">
<div class="row form-group"> <div class="row form-group">
<div class="col-md-3">DB</div> <div class="col-md-3">DB</div>
<div class="col-md-4"> <div class="col-md-4">
@ -28,4 +28,4 @@
@push('scripts') @push('scripts')
<script type="text/javascript" src="js/admin.js"></script> <script type="text/javascript" src="js/admin.js"></script>
@endpush @endpush

View File

@ -1,14 +1,14 @@
<div class="row"> <div class="row">
<div class="col-md-1"> <div class="col-md-1">
@if ($start > 0) @if ($start > 0)
<a href="{{url('admin/registros')}}"> <a href="{{$urls->base}}/admin/registros">
<span class="glyphicon glyphicon-fast-backward"></span> <span class="glyphicon glyphicon-fast-backward"></span>
</a> </a>
@endif @endif
</div> </div>
<div class="col-md-1"> <div class="col-md-1">
@if ($start > 0) @if ($start > 0)
<a href="{{url('admin/registros/') . ($start - $step + 1) . '/' . (($end > 0) ? $end - $step : $step * 2)}}"> <a href="{{$urls->base}}/admin/registros/{{$start - $step + 1}}/{{(($end > 0) ? $end - $step : $step * 2)}}">
<span class="glyphicon glyphicon-chevron-left"></span> <span class="glyphicon glyphicon-chevron-left"></span>
</a> </a>
@endif @endif
@ -16,14 +16,14 @@
<div class="col-md-offset-3 col-md-2 text-center">{{$start + 1}} - {{$end}}</div> <div class="col-md-offset-3 col-md-2 text-center">{{$start + 1}} - {{$end}}</div>
<div class="col-md-offset-3 col-md-1 text-right"> <div class="col-md-offset-3 col-md-1 text-right">
@if ($end < $total) @if ($end < $total)
<a href="{{url('admin/registros/') . (($end > 0) ? $end + 1 : $step) . '/' . (($end > 0) ? $end + $step : $step * 2)}}"> <a href="{{$urls->base}}/admin/registros/{{(($end > 0) ? $end + 1 : $step)}}/{{(($end > 0) ? $end + $step : $step * 2)}}">
<span class="glyphicon glyphicon-chevron-right"></span> <span class="glyphicon glyphicon-chevron-right"></span>
</a> </a>
@endif @endif
</div> </div>
<div class="col-md-1 text-right"> <div class="col-md-1 text-right">
@if ($end < $total) @if ($end < $total)
<a href="{{url('admin/registros/') . (round($total / $step, 0) * $step + 1) . '/' . (round($total / $step, 0) *$step + $step)}}"> <a href="{{$urls->base}}/admin/registros/{{(round($total / $step, 0) * $step + 1)}}/{{(round($total / $step, 0) *$step + $step)}}">
<span class="glyphicon glyphicon-fast-forward"></span> <span class="glyphicon glyphicon-fast-forward"></span>
</a> </a>
@endif @endif

View File

@ -28,7 +28,7 @@
">{{ucwords($rol->description)}}</span> ">{{ucwords($rol->description)}}</span>
@endforeach @endforeach
</td> </td>
<td><a href="{{url('admin/registro/' . $registro->id)}}">{{$registro->time()->format('d-m-Y - H:i:s')}} hrs.</a></td> <td><a href="{{$urls->base}}/admin/registro/{{$registro->id}}">{{$registro->time()->format('d-m-Y - H:i:s')}} hrs.</a></td>
<td>{{$registro->model()}}</td> <td>{{$registro->model()}}</td>
<td>{{count($registro->actions())}}</td> <td>{{count($registro->actions())}}</td>
</tr> </tr>

View File

@ -55,7 +55,7 @@
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<a href="{{nUrl('registros', 'list')}}"><span class="glyphicon glyphicon-chevron-left"></span> Volver</a> <a href="{{$urls->base}}/registros"><span class="glyphicon glyphicon-chevron-left"></span> Volver</a>
</div> </div>
</div> </div>
</div> </div>

View File

@ -5,7 +5,7 @@
<div class="col-md-12 h3">Agregar Rol</div> <div class="col-md-12 h3">Agregar Rol</div>
</div> </div>
<br /> <br />
<form action="{{url('', ['p' => 'admin', 'a' => 'do_add_role'])}}" method="post" class="form-horizontal"> <form action="{{$urls->base}}/admin/roles/add" method="post" class="form-horizontal">
<div class="form-group"> <div class="form-group">
<div class="col-md-2">Descripci&oacute;n</div> <div class="col-md-2">Descripci&oacute;n</div>
<div class="col-md-3"><input type="text" name="description" class="form-control" /></div> <div class="col-md-3"><input type="text" name="description" class="form-control" /></div>

View File

@ -5,7 +5,7 @@
<div class="col-md-12 h3">Agregar Permisos - {{$role->description}}</div> <div class="col-md-12 h3">Agregar Permisos - {{$role->description}}</div>
</div> </div>
<br /> <br />
<form class="form-horizontal" method="post" action="{{nUrl('admin', 'do_add_role_permissions', ['role' => $role->id])}}"> <form class="form-horizontal" method="post" action="{{$urls->base}}/admin/role/{{$role->id}}/permissions/add">
<div class="form-group"> <div class="form-group">
<div class="col-md-2">Permitidos</div> <div class="col-md-2">Permitidos</div>
<div class="col-md-3"><select name="allowed[]" class="form-control" multiple="multiple"> <div class="col-md-3"><select name="allowed[]" class="form-control" multiple="multiple">

View File

@ -5,7 +5,7 @@
<div class="col-md-12 h3">Agregar Usuario - {{$role->description}}</div> <div class="col-md-12 h3">Agregar Usuario - {{$role->description}}</div>
</div> </div>
<br /> <br />
<form class="form-horizontal" method="post" action="{{url('', ['p' => 'admin', 'a' => 'do_add_user_role', 'role' => $role->id])}}"> <form class="form-horizontal" method="post" action="{{$urls->base}}/admin/role/{{$role->id}}/users/add">
<div class="form-group"> <div class="form-group">
<div class="col-md-2">Ususarios</div> <div class="col-md-2">Ususarios</div>
<div class="col-md-3"><select name="users[]" class="form-control" multiple="multiple"> <div class="col-md-3"><select name="users[]" class="form-control" multiple="multiple">

View File

@ -3,7 +3,7 @@
@section('content') @section('content')
<div class="page-heading row"> <div class="page-heading row">
<div class="col-md-6 h3">Roles</div> <div class="col-md-6 h3">Roles</div>
<div class="col-md-6 text-right h3"><a href="{{url('', ['p' => 'admin', 'a' => 'add_role'])}}"><span class="glyphicon glyphicon-plus"></span></a></div> <div class="col-md-6 text-right h3"><a href="{{$urls->base}}/admin/roles/add"><span class="glyphicon glyphicon-plus"></span></a></div>
</div> </div>
<table class="table"> <table class="table">
<thead> <thead>
@ -17,14 +17,14 @@
<tbody> <tbody>
@foreach ($roles as $role) @foreach ($roles as $role)
<tr> <tr>
<td><a href="{{nUrl('admin', 'role', ['role' => $role->id])}}">{{$role->description}}</a></td> <td><a href="{{$urls->base}}/admin/role/{{$role->id}}">{{$role->description}}</a></td>
<td>{{$role->level}}</td> <td>{{$role->level}}</td>
<td> <td>
@foreach ($role->users() as $user) @foreach ($role->users() as $user)
{{$user->name}} {{$user->name}}
@endforeach @endforeach
</td> </td>
<td><a href="{{url('', ['p' => 'admin', 'a' => 'delete_role'])}}"><span class="glyphicon glyphicon-minus"></span></a></td> <td><a href="{{$urls->base}}/admin/role/{{$role->id}}/delete"><span class="glyphicon glyphicon-minus"></span></a></td>
</tr> </tr>
@endforeach @endforeach
</tbody> </tbody>

View File

@ -6,19 +6,19 @@
</div> </div>
<div class="section-heading row"> <div class="section-heading row">
<div class="col-md-6 h4">Usuarios</div> <div class="col-md-6 h4">Usuarios</div>
<div class="col-md-6 h4 text-right"><a href="{{url('', ['p' => 'admin', 'a' => 'add_user_role', 'role' => $role->id])}}"><span class="glyphicon glyphicon-plus"></span></a></div> <div class="col-md-6 h4 text-right"><a href="{{$urls->base}}/admin/role/{{$role->id}}/users/add"><span class="glyphicon glyphicon-plus"></span></a></div>
</div> </div>
<table class="table"> <table class="table">
@foreach ($role->users() as $user) @foreach ($role->users() as $user)
<tr> <tr>
<td><a href="{{nUrl('admin', 'user', ['user' => $user->id])}}">{{$user->name}}</a></td> <td><a href="{{$urls->base}}/admin/user/{{$user->id}}">{{$user->name}}</a></td>
<td><a href="{{url('', ['p' => 'admin', 'a' => 'remove_user_role', 'user' => $user->id, 'role' => $role->id])}}"><span class="glyphicon glyphicon-minus"></span></a></td> <td><a href="{{$urls->base}}/admin/role/{{$role->id}}/user/{{$user->id}}/remove"><span class="glyphicon glyphicon-minus"></span></a></td>
</tr> </tr>
@endforeach @endforeach
</table> </table>
<div class="row section-heading"> <div class="row section-heading">
<div class="col-md-6 h4">Permisos</div> <div class="col-md-6 h4">Permisos</div>
<div class="col-md-6 h4 text-right"><a href="{{nUrl('admin', 'add_role_permissions', ['role' => $role->id])}}"><span class="glyphicon glyphicon-plus"></span></a></div> <div class="col-md-6 h4 text-right"><a href="{{$urls->base}}/admin/role/{{$role->id}}/permissions"><span class="glyphicon glyphicon-plus"></span></a></div>
</div> </div>
@if ($role->permissions()) @if ($role->permissions())
<table class="table table-striped"> <table class="table table-striped">

View File

@ -5,7 +5,7 @@
<div class="col-md-12 h3">Agregar Ususario</div> <div class="col-md-12 h3">Agregar Ususario</div>
</div> </div>
<br /> <br />
<form action="{{url('', ['p' => 'admin', 'a' => 'do_add_user'])}}" method="post" class="form-horizontal"> <form action="{{$urls->base}}/admin/users/add" method="post" class="form-horizontal">
<div class="form-group"> <div class="form-group">
<div class="col-md-2">Usuario</div> <div class="col-md-2">Usuario</div>
<div class="col-md-3"><input type="text" name="name" class="form-control" /></div> <div class="col-md-3"><input type="text" name="name" class="form-control" /></div>

View File

@ -5,7 +5,7 @@
<div class="col-md-12 h3">Agregar Rol - {{$user->name}}</div> <div class="col-md-12 h3">Agregar Rol - {{$user->name}}</div>
</div> </div>
<br /> <br />
<form class="form-horizontal" method="post" action="{{url('', ['p' => 'admin', 'a' => 'do_add_user_role', 'user' => $user->id])}}"> <form class="form-horizontal" method="post" action="{{$urls->base}}/admin/user/{{$user->id}}/roles/add">
<div class="form-group"> <div class="form-group">
<div class="col-md-2">Rol</div> <div class="col-md-2">Rol</div>
<div class="col-md-3"><select name="role[]" class="form-control" multiple="multiple"> <div class="col-md-3"><select name="role[]" class="form-control" multiple="multiple">

View File

@ -3,7 +3,7 @@
@section('content') @section('content')
<div class="page-heading row"> <div class="page-heading row">
<div class="col-md-6 h3">Usuarios</div> <div class="col-md-6 h3">Usuarios</div>
<div class="col-md-6 text-right h3"><a href="{{url('', ['p' => 'admin', 'a' => 'add_user'])}}"><span class="glyphicon glyphicon-plus"></span></a></div> <div class="col-md-6 text-right h3"><a href="{{$urls->base}}/admin/users/add"><span class="glyphicon glyphicon-plus"></span></a></div>
</div> </div>
<table class="table"> <table class="table">
<thead> <thead>
@ -15,13 +15,13 @@
<tbody> <tbody>
@foreach ($users as $user) @foreach ($users as $user)
<tr> <tr>
<td><a href="{{url('', ['p' => 'admin', 'a' => 'user', 'user' => $user->id])}}">{{$user->name}}</a></td> <td><a href="{{$urls->base}}/admin/user/{{$user->id}}">{{$user->name}}</a></td>
<td> <td>
@foreach ($user->roles() as $role) @foreach ($user->roles() as $role)
{{$role->description}} {{$role->description}}
@endforeach @endforeach
</td> </td>
<td><a href="{{url('', ['p' => 'admin', 'a' => 'delete_user', 'user' => $user->id])}}"><span class="glyphicon glyphicon-minus"></span></a></td> <td><a href="{{$urls->base}}/admin/user/{{$user->id}}/delete"><span class="glyphicon glyphicon-minus"></span></a></td>
</tr> </tr>
@endforeach @endforeach
</tbody> </tbody>

View File

@ -4,24 +4,24 @@
<div class="row page-heading"> <div class="row page-heading">
<div class="col-md-12 h3">{{$user->name}}</div> <div class="col-md-12 h3">{{$user->name}}</div>
</div> </div>
<a href="{{nUrl('admin', 'reset_user', ['user' => $user->id])}}"> <a href="{{$urls->base}}/admin/user/{{$user->id}}/reset">
Resetear Clave Resetear Clave
</a> </a>
<div class="section-heading row"> <div class="section-heading row">
<div class="col-md-6 h4">Roles</div> <div class="col-md-6 h4">Roles</div>
<div class="col-md-6 h4 text-right"><a href="{{url('', ['p' => 'admin', 'a' => 'add_user_role', 'user' => $user->id])}}"><span class="glyphicon glyphicon-plus"></span></a></div> <div class="col-md-6 h4 text-right"><a href="{{$url->base}}/admin/user/{{$user->id}}/roles/add"><span class="glyphicon glyphicon-plus"></span></a></div>
</div> </div>
<table class="table"> <table class="table">
@foreach ($user->roles() as $role) @foreach ($user->roles() as $role)
<tr> <tr>
<td><a href="{{nUrl('admin', 'role', ['role' => $role->id])}}">{{$role->description}}</a></td> <td><a href="{{$urls->base}}/admin/role/{{$role->id}}">{{$role->description}}</a></td>
<td><a href="{{url('', ['p' => 'admin', 'a' => 'remove_user_role', 'user' => $user->id, 'role' => $role->id])}}"><span class="glyphicon glyphicon-minus"></span></a></td> <td><a href="{{$urls->base}}/admin/user/{{$user->id}}/role/{{$role->id}}/remove"><span class="glyphicon glyphicon-minus"></span></a></td>
</tr> </tr>
@endforeach @endforeach
</table> </table>
<div class="row section-heading"> <div class="row section-heading">
<div class="col-md-6 h4">Permisos</div> <div class="col-md-6 h4">Permisos</div>
<div class="col-md-6 h4 text-right"><a href="{{nUrl('admin', 'add_user_permissions', ['user' => $user->id])}}"><span class="glyphicon glyphicon-plus"></span></a></div> <div class="col-md-6 h4 text-right"><a href="{{$urls->base}}/admin/user/{{$user->id}}/permissions/add"><span class="glyphicon glyphicon-plus"></span></a></div>
</div> </div>
@if ($user->permissions()) @if ($user->permissions())
<table class="table"> <table class="table">

View File

@ -7,9 +7,9 @@
{{$titulo}} - {{$titulo}} -
@endif @endif
Incoviba S. A.</title> Incoviba S. A.</title>
<link rel="stylesheet" type="text/css" href="css/app.css" /> <link rel="stylesheet" type="text/css" href="{{$urls->styles}}/app.css" />
<link rel="icon" type="image/png" href="images/Isotipo 32.png" /> <link rel="icon" type="image/png" href="{{$urls->images}}/Isotipo 32.png" />
<script type="text/javascript" src="js/app.js"></script> <script type="text/javascript" src="{{$urls->scripts}}/app.js"></script>
@stack('styles') @stack('styles')
</head> </head>
@ -19,7 +19,7 @@
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div class="logo_cabezal"> <div class="logo_cabezal">
<a href="."><img src="images/logo_cabezal.png" /></a> <a href="."><img src="{{$urls->images}}/logo_cabezal.png" /></a>
</div> </div>
</div> </div>
</div> </div>
@ -28,15 +28,15 @@
<nav class="navbar navbar-default"> <nav class="navbar navbar-default">
<ul class="nav navbar-nav"> <ul class="nav navbar-nav">
<li><a href=".">Inicio</a></li> <li><a href=".">Inicio</a></li>
@if (\App\Contract\Auth::isIn()) @if ($auth->isIn())
<li role="presentation" class="dropdown"> <li role="presentation" class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false"> <a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">
{{\App\Contract\Auth::User()->name}} <span class="caret"></span> {{$auth->user()}} <span class="caret"></span>
</a> </a>
@include('layout.menu.login') @include('layout.menu.login')
</li> </li>
@else @else
<li><a href="{{url('', ['p' => 'auth', 'a' => 'login'])}}">Ingresar</a></li> <li><a href="{{$urls->base}}/auth/login">Ingresar</a></li>
@endif @endif
</ul> </ul>
</nav> </nav>

View File

@ -5,7 +5,7 @@
<div class="col-md-12 h3">Cambio de Cl&aacute;ve</div> <div class="col-md-12 h3">Cambio de Cl&aacute;ve</div>
</div> </div>
<br /> <br />
<form class="form-horizontal" method="post" action="{{url('', ['p' => 'auth', 'a' => 'do_change_pass'])}}"> <form class="form-horizontal" method="post" action="{{$urls->base}}/auth/password/change">
<div class="form-group"> <div class="form-group">
<div class="col-md-2">Cl&aacute;ve anterior</div> <div class="col-md-2">Cl&aacute;ve anterior</div>
<div class="col-md-3"><input type="password" name="old" class="form-control" /></div> <div class="col-md-3"><input type="password" name="old" class="form-control" /></div>
@ -32,7 +32,7 @@
$(document).ready(function() { $(document).ready(function() {
var status = [0, 0, 0, 0]; var status = [0, 0, 0, 0];
$("input[name='old']").blur(function(e) { $("input[name='old']").blur(function(e) {
$.post('{!!nUrl('auth', 'check_pass', ['ajax' => 'true'])!!}', {"password": $(this).val()}, function(data) { $.post('{!!$urls->base!!}}/auth/password/check', {"password": $(this).val()}, function(data) {
if (data == 'KO') { if (data == 'KO') {
$('#msg1').html('<span class="label label-danger"><span class="glyphicon glyphicon-warning-sign"></span> Cl&aacute;ve anterior inv&aacute;lida.</span>'); $('#msg1').html('<span class="label label-danger"><span class="glyphicon glyphicon-warning-sign"></span> Cl&aacute;ve anterior inv&aacute;lida.</span>');
status[1] = 0; status[1] = 0;
@ -43,7 +43,7 @@ $(document).ready(function() {
}); });
}) })
$("input[name='new']").blur(function(e) { $("input[name='new']").blur(function(e) {
var result = zxcvbn($(this).val(), user_inputs=[$("input[name='old']").val(), '{{\App\Contract\Auth::User()->name}}']); var result = zxcvbn($(this).val(), user_inputs=[$("input[name='old']").val(), '{{$user->name}}']);
if (result.score < 3) { if (result.score < 3) {
$('#msg2').html('<span class="label label-danger"><span class="glyphicon glyphicon-warning-sign"></span> Nivel ' + result.score + '</span>'); $('#msg2').html('<span class="label label-danger"><span class="glyphicon glyphicon-warning-sign"></span> Nivel ' + result.score + '</span>');
status[2] = 0; status[2] = 0;

View File

@ -1,7 +1,7 @@
@extends('auth.base') @extends('auth.base')
@section('content') @section('content')
<form class="form-horizontal" action="{{url('', ['p' => 'auth', 'a' => 'do_login'])}}" method="post"> <form class="form-horizontal" id="login_form" method="post">
<div class="form-group"> <div class="form-group">
<div class="col-md-2">Usuario</div> <div class="col-md-2">Usuario</div>
<div class="col-md-3"><input type="text" name="name" class="form-control" /></div> <div class="col-md-3"><input type="text" name="name" class="form-control" /></div>
@ -15,3 +15,28 @@
</div> </div>
</form> </form>
@endsection @endsection
@push('scripts')
<script type="text/javascript">
function doLogin(e) {
e.preventDefault()
const form = $(e.currentTarget)
const url = '{{$urls->base}}/auth/login'
const data = {
name: form.find("[name='name']").val(),
password: form.find("[name='password']").val()
}
$.post(url, data).then((data) => {
if (data.login) {
window.location = '{{$route}}'
return
}
console.debug(data)
})
return false
}
$(document).ready(() => {
$('#login_form').submit(doLogin)
})
</script>
@endpush

View File

@ -4,7 +4,7 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading">Buscar</div> <div class="panel-heading">Buscar</div>
<div class="panel-body"> <div class="panel-body">
<form action="{{url('', ['p' => 'buscar'])}}" method="get" class="form form-horizontal"> <form action="{{$urls->base}}/buscar" method="get" class="form form-horizontal">
<input type="hidden" name="p" value="buscar" /> <input type="hidden" name="p" value="buscar" />
<div class="form-group"> <div class="form-group">
<div class="col-md-6"><input type="text" name="q" class="form-control" <div class="col-md-6"><input type="text" name="q" class="form-control"

View File

@ -1,12 +1,12 @@
<tr> <tr>
<td> <td>
<a href="{{url('', ['p' => 'buscar', 'q' => urlencode('"' . $resultado->proyecto()->descripcion . '"'), 't' => 'proyecto'])}}"> <a href="{{$urls->base}}/buscar/{{urlencode('"' . $resultado->proyecto()->descripcion . '"')}}/proyecto">
{{$resultado->proyecto()->descripcion}} <span class="small glyphicon glyphicon-search"></span> {{$resultado->proyecto()->descripcion}} <span class="small glyphicon glyphicon-search"></span>
</a> </a>
</td> </td>
@if (method_exists($resultado, 'unidad')) @if (method_exists($resultado, 'unidad'))
<td> <td>
<a href="{{url('', ['p' => 'ventas', 'a' => 'show', 'venta' => $resultado->id])}}"> <a href="{{$urls->base}}/ventas/{{$resultado->id}}">
{{$resultado->unidad()->descripcion}} {{$resultado->unidad()->descripcion}}
@if ($resultado->estado == 0) @if ($resultado->estado == 0)
(r) (r)
@ -17,17 +17,17 @@
</a> </a>
</td> </td>
<td> <td>
<a href="{{url('', ['p' => 'buscar', 'q' => urlencode('"' . $resultado->propietario()->nombreCompleto() . '"'), 't' => 'propietario'])}}"> <a href="{{$urls->base}}/buscar/{{urlencode('"' . $resultado->propietario()->nombreCompleto() . '"')}}/propietario">
{{$resultado->propietario()->nombreCompleto()}} <span class="small glyphicon glyphicon-search"></span> {{$resultado->propietario()->nombreCompleto()}} <span class="small glyphicon glyphicon-search"></span>
</a> </a>
</td> </td>
<td>{{ucwords($resultado->unidad()->tipo()->descripcion)}}</td> <td>{{ucwords($resultado->unidad()->tipo()->descripcion)}}</td>
<td>{{\App\Helper\Format::m2($resultado->unidad()->m2())}}</td> <td>{{$format->m2($resultado->unidad()->m2())}}</td>
<td>{{\App\Helper\Format::ufs($resultado->valor_uf)}}</td> <td>{{$format->ufs($resultado->valor_uf)}}</td>
<td>{{\App\Helper\Format::shortDate($resultado->fecha)}}</td> <td>{{$format->shortDate($resultado->fecha)}}</td>
<td> <td>
@if ($resultado->entrega != 0) @if ($resultado->entrega != 0)
{{\App\Helper\Format::shortDate($resultado->entrega()->fecha)}} {{$format->shortDate($resultado->entrega()->fecha)}}
@endif @endif
</td> </td>
@else @else
@ -35,7 +35,7 @@
{{$resultado->descripcion}} <span class="glyphicon glyphicon-ban-circle"></span> {{$resultado->descripcion}} <span class="glyphicon glyphicon-ban-circle"></span>
</td><td> </td><td>
<td>{{ucwords($resultado->tipo()->descripcion)}}</td> <td>{{ucwords($resultado->tipo()->descripcion)}}</td>
<td>{{\App\Helper\Format::m2($resultado->m2())}}</td> <td>{{$format->m2($resultado->m2())}}</td>
@if ($resultado->valor) @if ($resultado->valor)
<td>{{format('ufs', $resultado->valor)}}</td> <td>{{format('ufs', $resultado->valor)}}</td>
@else @else
@ -43,4 +43,4 @@
@endif @endif
<td></td> <td></td>
@endif @endif
</tr> </tr>

View File

@ -28,15 +28,15 @@
<nav class="navbar navbar-default"> <nav class="navbar navbar-default">
<ul class="nav navbar-nav"> <ul class="nav navbar-nav">
<li><a href=".">Inicio</a></li> <li><a href=".">Inicio</a></li>
@if (\App\Contract\Auth::isIn()) @if ($auth->isIn)
<li role="presentation" class="dropdown"> <li role="presentation" class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false"> <a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">
{{Auth::User()}} <span class="caret"></span> {{$user->name}} <span class="caret"></span>
</a> </a>
@include('layout.menu.login') @include('layout.menu.login')
</li> </li>
@else @else
<li><a href="{{url('', ['p' => 'auth', 'a' => 'login'])}}">Ingresar</a></li> <li><a href="{{$urls->base}}/auth/login">Ingresar</a></li>
@endif @endif
</ul> </ul>
</nav> </nav>
@ -54,4 +54,4 @@
@include('layout.footer') @include('layout.footer')
@stack('scripts') @stack('scripts')
</body> </body>
</html> </html>

View File

@ -1,28 +1,27 @@
@extends('layout.base') @extends('layout.base')
@section('content') @section('content')
@if ($hoy > 0) <div id="hoy"></div>
<div clasS="row"> <div id="pendientes"></div>
<div class="col-md-12">Hay {{$hoy}} deposito{{($hoy > 1) ? 's' : ''}} para hoy.</div> <table class="ui basic table">
</div> <tr>
@endif <td>
@if ($pendientes > 0) <div id="calendario"></div>
<div class="row"> </td>
<div class="col-md-12"><a href="{{url('', ['p' => 'cuotas', 'a' => 'pendientes'])}}">Existe{{($pendientes > 1) ? 'n' : ''}} {{$pendientes}} cuota{{($pendientes > 1) ? 's' : ''}} pendiente{{($pendientes > 1) ? 's' : ''}}. <span class="glyphicon glyphicon-arrow-right"></span></a></div> <td>
</div> <div id="cierres"></div>
@endif </td>
<table class="ui table"> </tr>
<tr> </table>
@if (count($dias) > 0)
<td>
@include('calendario')
</td>
@endif
@if (count($cierres) > 0)
<td>
@include('cierres')
</td>
@endif
</tr>
</table>
@endsection @endsection
@push('scripts')
<script type="text/javascript" src="{{$urls->scripts}}/home.js"></script>
<script type="text/javascript">
$(document).ready(() => {
home.token = '{{$_COOKIE['rememberMe']}}'
home.setup()
})
</script>
@endpush

View File

@ -3,15 +3,18 @@
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<title> <title>
@hasSection('page_title')
@yield('page_title') -
@endif
@if (isset($titulo)) @if (isset($titulo))
{{$titulo}} - {{$titulo}} -
@endif @endif
Incoviba S. A.</title> Incoviba S. A.</title>
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.7.8/semantic.min.css" /> <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.7.8/semantic.min.css" />
<link rel="stylesheet" type="text/css" href="css/app.css" /> <link rel="stylesheet" type="text/css" href="{{$urls->styles}}/app.css" />
<link rel="stylesheet" type="text/css" href="css/custom.css" /> <link rel="stylesheet" type="text/css" href="{{$urls->styles}}/custom.css" />
<link rel="icon" type="image/png" href="images/Isotipo 32.png" /> <link rel="icon" type="image/png" href="{{$urls->images}}/Isotipo 32.png" />
<script type="text/javascript" src="js/app.js"></script> <script type="text/javascript" src="{{$urls->scripts}}/app.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.7.8/semantic.min.js"></script> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.7.8/semantic.min.js"></script>
@stack('styles') @stack('styles')
@ -26,6 +29,53 @@
</div> </div>
</div> </div>
@include('layout.footer') @include('layout.footer')
<script type="text/javascript">
const API_KEY = '{{$api_key}}'
const _urls = {
base: '{{$urls->base}}',
api: 'http://localhost:8081'
}
function buildAjax(uri, method, files=false) {
const url = _urls.api + uri
if (files) {
return {
url,
headers: {
'Authorization': 'Bearer ' + API_KEY
},
method,
processData: false,
contentType: false
}
}
return {
url,
headers: {
'Authorization': 'Bearer ' + API_KEY
},
method,
dataType: 'json'
}
}
function sendGet(uri) {
let ajax_obj = buildAjax(uri, 'GET')
return $.ajax(ajax_obj)
}
function sendPost(uri, data, files=false) {
let ajax_obj = buildAjax(uri, 'POST', files)
ajax_obj['data'] = data
return $.ajax(ajax_obj)
}
function sendPut(uri, data) {
let ajax_obj = buildAjax(uri, 'PUT')
ajax_obj['data'] = data
return $.ajax(ajax_obj)
}
function sendDelete(uri) {
let ajax_obj = buildAjax(uri, 'DELETE')
return $.ajax(ajax_obj)
}
</script>
@stack('scripts') @stack('scripts')
</body> </body>
</html> </html>

View File

@ -3,7 +3,7 @@
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<div class="logo_cabezal"> <div class="logo_cabezal">
<a href="."><img src="images/logo_cabezal.png" /></a> <a href="."><img src="{{$urls->images}}/logo_cabezal.png" /></a>
</div> </div>
</div> </div>
</div> </div>
@ -13,4 +13,4 @@
</div> </div>
</div> </div>
</div> </div>
</header> </header>

View File

@ -1,8 +1,8 @@
<nav class="navbar navbar-default"> <nav class="navbar navbar-default">
<ul class="nav navbar-nav"> <ul class="nav navbar-nav">
<li><a href=".">Inicio</a></li> <li><a href="{{$urls->base}}">Inicio</a></li>
@if (\App\Contract\Auth::isIn()) @if ($auth->isIn())
@if (\App\Contract\Auth::checkAccess('ventas')) @if ($auth->checkAccess('ventas'))
<li role="presentation" class="dropdown"> <li role="presentation" class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false"> <a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">
Ventas <span class="caret"></span> Ventas <span class="caret"></span>
@ -11,7 +11,7 @@
</li> </li>
@endif @endif
@if (\App\Contract\Auth::checkAccess('proyectos')) @if ($auth->checkAccess('proyectos'))
<li role="presentation" class="dropdown"> <li role="presentation" class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false"> <a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">
Proyectos <span class="caret"></span> Proyectos <span class="caret"></span>
@ -20,11 +20,11 @@
</li> </li>
@endif @endif
@if (\App\Contract\Auth::checkAccess('inmobiliarias')) @if ($auth->checkAccess('inmobiliarias'))
<li><a href="{{url('', ['p' => 'inmobiliarias', 'a' => 'list'])}}">Inmobiliarias</a></li> <li><a href="{{$urls->base}}/inmobiliarias">Inmobiliarias</a></li>
@endif @endif
@if (\App\Contract\Auth::checkAccess('viewInformesContabilidad')) @if ($auth->checkAccess('viewInformesContabilidad'))
<li role="presentation" class="dropdown"> <li role="presentation" class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false"> <a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">
Contabilidad <span class="caret"></span> Contabilidad <span class="caret"></span>
@ -40,7 +40,7 @@
@include('layout.menu.operadores') @include('layout.menu.operadores')
</li> </li>
@if (\App\Contract\Auth::checkAccess('viewHerramientas')) @if ($auth->checkAccess('viewHerramientas'))
<li role="presentation" class="dropdown"> <li role="presentation" class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false"> <a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">
Herramientas <span class="caret"></span> Herramientas <span class="caret"></span>
@ -49,19 +49,19 @@
</li> </li>
@endif @endif
@else @else
<li><a href="{{url('', ['p' => 'auth', 'a' => 'login'])}}">Ingresar</a></li> <li><a href="{{$urls->base}}/auth/login">Ingresar</a></li>
@endif @endif
</ul> </ul>
@if (\App\Contract\Auth::isIn()) @if ($auth->isIn())
<ul class="nav navbar-nav navbar-right"> <ul class="nav navbar-nav navbar-right">
<li role="presentation" class="dropdown"> <li role="presentation" class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false"> <a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">
{{\App\Contract\Auth::User()->name}} <span class="caret"></span> {{$auth->user()}} <span class="caret"></span>
</a> </a>
@include('layout.menu.login') @include('layout.menu.login')
</li> </li>
@if (\App\Contract\Auth::checkAccess('buscar')) @if ($auth->checkAccess('buscar'))
<li style="font-size: large; border-left: 1px solid #e7e7e7;"><a href="{{url('', ['p' => 'buscar'])}}"><span class="glyphicon glyphicon-search"></span></a></li> <li style="font-size: large; border-left: 1px solid #e7e7e7;"><a href="{{$urls->base}}/buscar"><span class="glyphicon glyphicon-search"></span></a></li>
<li style="margin-right: 15px;">&nbsp;</li> <li style="margin-right: 15px;">&nbsp;</li>
@endif @endif
</ul> </ul>

View File

@ -1,8 +1,8 @@
<nav class="navbar navbar-default"> <nav class="navbar navbar-default">
<ul class="nav navbar-nav"> <ul class="nav navbar-nav">
<li><a href=".">Inicio</a></li> <li><a href=".">Inicio</a></li>
@if (\App\Contract\Auth::isIn()) @if ($auth->isIn())
@if (\App\Contract\Auth::checkAccess('ventas')) @if ($auth->checkAccess('ventas'))
<li role="presentation" class="dropdown"> <li role="presentation" class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false"> <a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">
Ventas <span class="caret"></span> Ventas <span class="caret"></span>
@ -11,7 +11,7 @@
</li> </li>
@endif @endif
@if (\App\Contract\Auth::checkAccess('proyectos')) @if ($auth->checkAccess('proyectos'))
<li role="presentation" class="dropdown"> <li role="presentation" class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false"> <a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">
Proyectos <span class="caret"></span> Proyectos <span class="caret"></span>
@ -20,11 +20,11 @@
@endif @endif
@if (\App\Contract\Auth::checkAccess('inmobiliarias')) @if ($auth->checkAccess('inmobiliarias'))
<li><a href="{{url('', ['p' => 'inmobiliarias', 'a' => 'list'])}}">Inmobiliarias</a></li> <li><a href="{{url('', ['p' => 'inmobiliarias', 'a' => 'list'])}}">Inmobiliarias</a></li>
@endif @endif
@if (\App\Contract\Auth::checkAccess('viewInformesContabilidad')) @if ($auth->checkAccess('viewInformesContabilidad'))
<li role="presentation" class="dropdown"> <li role="presentation" class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false"> <a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">
Contabilidad <span class="caret"></span> Contabilidad <span class="caret"></span>
@ -33,7 +33,7 @@
</li> </li>
@endif @endif
@if (\App\Contract\Auth::checkAccess('viewHerramientas')) @if ($auth->checkAccess('viewHerramientas'))
<li role="presentation" class="dropdown"> <li role="presentation" class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false"> <a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">
Herramientas <span class="caret"></span> Herramientas <span class="caret"></span>
@ -45,15 +45,15 @@
<li><a href="{{url('', ['p' => 'auth', 'a' => 'login'])}}">Ingresar</a></li> <li><a href="{{url('', ['p' => 'auth', 'a' => 'login'])}}">Ingresar</a></li>
@endif @endif
</ul> </ul>
@if (\App\Contract\Auth::isIn()) @if ($auth->isIn())
<ul class="nav navbar-nav navbar-right"> <ul class="nav navbar-nav navbar-right">
<li role="presentation" class="dropdown"> <li role="presentation" class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false"> <a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">
{{\App\Contract\Auth::User()->name}} <span class="caret"></span> {{$auth->User()->name}} <span class="caret"></span>
</a> </a>
@include('layout.menu.login') @include('layout.menu.login')
</li> </li>
@if (\App\Contract\Auth::checkAccess('buscar')) @if ($auth->checkAccess('buscar'))
<li style="font-size: large; border-left: 1px solid #e7e7e7;"><a href="{{url('', ['p' => 'buscar'])}}"><span class="glyphicon glyphicon-search"></span></a></li> <li style="font-size: large; border-left: 1px solid #e7e7e7;"><a href="{{url('', ['p' => 'buscar'])}}"><span class="glyphicon glyphicon-search"></span></a></li>
<li style="margin-right: 15px;">&nbsp;</li> <li style="margin-right: 15px;">&nbsp;</li>
@endif @endif

View File

@ -1,3 +1,3 @@
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a href="http://{{config('locations.money')}}">Valores Monetarios</a></li> <li><a href="http://{{$urls->money}}">Valores Monetarios</a></li>
</ul> </ul>

View File

@ -1,4 +1,4 @@
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a href="{{url('', ['p' => 'informes', 'a' => 'contabilidad'])}}">Pagos Mes</a></li> <li><a href="{{$urls->base}}/informes/contabilidad">Pagos Mes</a></li>
<li><a href="{{url('', ['p' => 'informes', 'a' => 'resumen_contabilidad'])}}">Resumen</a></li> <li><a href="{{$urls->base}}/informes/contabilidad/resumen">Resumen</a></li>
</ul> </ul>

View File

@ -1,8 +1,8 @@
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a href="{{url('', ['p' => 'auth', 'a' => 'change_pass'])}}">Cambiar Cl&aacute;ve</a></li> <li><a href="{{$urls->base}}/auth/password">Cambiar Cl&aacute;ve</a></li>
@if (\App\Contract\Auth::checkAccess('admin')) @if ($auth->checkAccess('admin'))
<li><a href="{{url('', ['p' => 'admin'])}}">Administraci&oacute;n</a></li> <li><a href="{{$urls->base}}/admin">Administraci&oacute;n</a></li>
@endif @endif
<li><a href="{{url('', ['p' => 'auth', 'a' => 'logout'])}}">Salir</a></li> <li><a href="{{$urls->base}}/auth/logout">Salir</a></li>
</ul> </ul>

View File

@ -1,4 +1,4 @@
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a href="{{url('', ['p' => 'proyectos', 'a' => 'list'])}}">Listado</a></li> <li><a href="{{$urls->base}}/proyectos">Listado</a></li>
<li><a href="{{url('', ['p' => 'proyectos', 'a' => 'unidades'])}}">Unidades</a></li> <li><a href="{{$urls->base}}/proyectos/unidades">Unidades</a></li>
</ul> </ul>

View File

@ -1,24 +1,24 @@
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li class="dropdown-submenu"><a>Listado</a> <li class="dropdown-submenu"><a>Listado</a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a href="{{nUrl('precios', 'listProyectos')}}">Precios</a></li> <li><a href="{{$urls->base}}/precios">Precios</a></li>
<li><a href="{{url('', ['p' => 'cierres', 'a' => 'list'])}}">Cierres</a></li> <li><a href="{{$urls->base}}/cierres">Cierres</a></li>
<li><a href="{{url('', ['p' => 'ventas', 'a' => 'list'])}}">Ventas</a></li> <li><a href="{{$urls->base}}/ventas">Ventas</a></li>
<li><a href="{{url('', ['p' => 'cuotas', 'a' => 'pendientes'])}}">Cuotas Pendientes</a></li> <li><a href="{{$urls->base}}/cuotas/pendientes">Cuotas Pendientes</a></li>
<li><a href="{{url('', ['p' => 'cuotas', 'a' => 'para_abonar'])}}">Abonar Cuotas</a></li> <li><a href="{{$urls->base}}/cuotas/abonar">Abonar Cuotas</a></li>
<li><a href="{{url('', ['p' => 'pagos', 'a' => 'pendientes'])}}">Pagos Pendientes</a></li> <li><a href="{{$urls->base}}/pagos/pendientes">Pagos Pendientes</a></li>
<li><a href="{{url('', ['p' => 'ventas', 'a' => 'consolidacion'])}}">Consolidado Ventas</a> <li><a href="{{$urls->base}}/ventas/consolidado">Consolidado Ventas</a>
</ul> </ul>
</li> </li>
<li class="dropdown-submenu"><a>Informes</a> <li class="dropdown-submenu"><a>Informes</a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a href="{{url('', ['p' => 'informes', 'a' => 'ventas'])}}">Ventas</a></li> <li><a href="{{$urls->base}}/informes/ventas">Ventas</a></li>
<li><a href="{{url('', ['p' => 'informes', 'a' => 'escrituras'])}}">Escrituras</a></li> <li><a href="{{$urls->base}}/informes/escrituras">Escrituras</a></li>
<li><a href="{{url('', ['p' => 'informes', 'a' => 'gantt_entregas'])}}">Gantt de Entregas</a></li> <li><a href="{{$urls->base}}/informes/entregas/gantt">Gantt de Entregas</a></li>
<li><a href="{{nUrl('informes', 'resciliaciones')}}">Resciliaciones</a></li> <li><a href="{{$urls->base}}/informes/resciliaciones">Resciliaciones</a></li>
</ul> </ul>
</li> </li>
<li><a href="{{nUrl('precios', 'import')}}">Importar Precios</a></li> <li><a href="{{$urls->base}}/precios/import">Importar Precios</a></li>
<li><a href="{{nUrl('cierres', 'evalue')}}">Evaluar Cierre</a></li> <li><a href="{{$urls->base}}/cierres/evaluar">Evaluar Cierre</a></li>
<li><a href="{{url('', ['p' => 'ventas', 'a' => 'new'])}}">Nueva Venta <span class="glyphicon glyphicon-plus"></span></a></li> <li><a href="{{$urls->base}}/ventas/add">Nueva Venta <span class="glyphicon glyphicon-plus"></span></a></li>
</ul> </ul>

View File

@ -13,7 +13,7 @@
<tbody> <tbody>
<tr> <tr>
<td>{{$proyecto->valores()->estimados->departamentos->cantidad}}</td> <td>{{$proyecto->valores()->estimados->departamentos->cantidad}}</td>
<td>{{\App\Helper\Format::number($proyecto->valores()->estimados->departamentos->cantidad / count($proyecto->unidades(1)) * 100, 2)}} %</td> <td>{{$format->number($proyecto->valores()->estimados->departamentos->cantidad / count($proyecto->unidades(1)) * 100, 2)}} %</td>
<td>{!!format('m2', $proyecto->valores()->estimados->departamentos->mts->vendibles->promedio, null, true)!!}</td> <td>{!!format('m2', $proyecto->valores()->estimados->departamentos->mts->vendibles->promedio, null, true)!!}</td>
</tr> </tr>
</tbody> </tbody>

View File

@ -21,8 +21,8 @@
<tbody> <tbody>
<tr> <tr>
<td>{{count($proyecto->ventas())}}</td> <td>{{count($proyecto->ventas())}}</td>
<td>{{\App\Helper\Format::number(count($proyecto->ventas())/count($proyecto->unidades(1)) * 100, 2)}} %</td> <td>{{$format->number(count($proyecto->ventas())/count($proyecto->unidades(1)) * 100, 2)}} %</td>
<td>{{\App\Helper\Format::number($proyecto->valores()->vendidos->departamentos->mts->vendibles->promedio, 2)}}</td> <td>{{$format->number($proyecto->valores()->vendidos->departamentos->mts->vendibles->promedio, 2)}}</td>
</tr> </tr>
</tbody> </tbody>
<thead> <thead>
@ -38,12 +38,12 @@
<tbody> <tbody>
<tr> <tr>
<td> <td>
{{format('ufs', $proyecto->valores()->vendidos->ingreso->bruto, null, true)}} - {{\App\Helper\Format::ufs($proyecto->valores()->vendidos->ingreso->neto, true)}} {{format('ufs', $proyecto->valores()->vendidos->ingreso->bruto, null, true)}} - {{$format->ufs($proyecto->valores()->vendidos->ingreso->neto, true)}}
<br /> <br />
{{format('ufs', $proyecto->valores()->vendidos->ingreso->abonado, null, true)}} ({{format('ufs', $proyecto->valores()->vendidos->ingreso->pagado, null, true)}}) {{format('ufs', $proyecto->valores()->vendidos->ingreso->abonado, null, true)}} ({{format('ufs', $proyecto->valores()->vendidos->ingreso->pagado, null, true)}})
</td> </td>
<td>{{\App\Helper\Format::ufs($proyecto->valores()->vendidos->departamentos->uf_m2->promedio, true)}}</td> <td>{{$format->ufs($proyecto->valores()->vendidos->departamentos->uf_m2->promedio, true)}}</td>
<td>{{\App\Helper\Format::ufs($proyecto->valores()->vendidos->departamentos->precio->promedio, true)}}</td> <td>{{$format->ufs($proyecto->valores()->vendidos->departamentos->precio->promedio, true)}}</td>
</tr> </tr>
</tbody> </tbody>
<thead> <thead>

View File

@ -88,8 +88,8 @@
@if ($venta->saldo() > 0.0001) @if ($venta->saldo() > 0.0001)
<br /> <br />
<br /> <br />
Diferencia {{format('ufs', $venta->saldo())}} UF ({{\App\Helper\Format::number(($venta->saldo()) / $venta->valor_uf * 100, 2)}}%). Diferencia {{format('ufs', $venta->saldo())}} UF ({{$format->number(($venta->saldo()) / $venta->valor_uf * 100, 2)}}%).
@endif @endif
</div> </div>
</div> </div>
@endsection @endsection

View File

@ -30,9 +30,9 @@
</a> </a>
</td> </td>
<td><a href="?p=search&q={{urlencode('"' . $venta->propietario()->nombreCompleto() . '"')}}">{{$venta->propietario()->nombreCompleto()}} <span class="glyphicon glyphicon-search small"></span></a></td> <td><a href="?p=search&q={{urlencode('"' . $venta->propietario()->nombreCompleto() . '"')}}">{{$venta->propietario()->nombreCompleto()}} <span class="glyphicon glyphicon-search small"></span></a></td>
<td>{{\App\Helper\Format::ufs($venta->valor_uf)}}</td> <td>{{$format->ufs($venta->valor_uf)}}</td>
<td>{{$venta->propiedad()->unidad()->tipologia()->tipologia()->descripcion}} ({{format('m2', $venta->propiedad()->unidad()->tipologia()->m2())}} m&#0178;)</td> <td>{{$venta->propiedad()->unidad()->tipologia()->tipologia()->descripcion}} ({{format('m2', $venta->propiedad()->unidad()->tipologia()->m2())}} m&#0178;)</td>
<td>{{\App\Helper\Format::ufs($venta->uf_m2())}}</td> <td>{{$format->ufs($venta->uf_m2())}}</td>
<td>{{$venta->fecha()->format('d-m-Y')}}</td> <td>{{$venta->fecha()->format('d-m-Y')}}</td>
<td>{{ucwords($venta->estado()->tipo()->descripcion)}}</td> <td>{{ucwords($venta->estado()->tipo()->descripcion)}}</td>
</tr> </tr>

View File

@ -32,10 +32,10 @@
<tbody> <tbody>
<tr> <tr>
<td>Fecha</td> <td>Fecha</td>
<td>{{\App\Helper\Format::shortDate($venta->pie()->fecha)}}</td> <td>{{$format->shortDate($venta->pie()->fecha)}}</td>
<td>Valor</td> <td>Valor</td>
<td>{{\App\Helper\Format::ufs($venta->pie()->valor)}} UF</td> <td>{{$format->ufs($venta->pie()->valor)}} UF</td>
<td>$ {{\App\Helper\Format::pesos($venta->pie()->valorPesos())}}</td> <td>$ {{$format->pesos($venta->pie()->valorPesos())}}</td>
<td>Cuotas</td> <td>Cuotas</td>
<td>({{count($venta->pie()->abonadas())}}) {{count($venta->pie()->pagadas())}} / {{$venta->pie()->cuotas}} <td>({{count($venta->pie()->abonadas())}}) {{count($venta->pie()->pagadas())}} / {{$venta->pie()->cuotas}}
</tr> </tr>
@ -85,7 +85,7 @@
<td class="@include('ventas.pies.cuotas.estado')"> <td class="@include('ventas.pies.cuotas.estado')">
<a href="{{url('', ['p' => 'cuotas', 'a' => 'show', 'cuota' => $cuota->id])}}">{{++$cnt}} <span class="glyphicon glyphicon-edit small"></span></a> <a href="{{url('', ['p' => 'cuotas', 'a' => 'show', 'cuota' => $cuota->id])}}">{{++$cnt}} <span class="glyphicon glyphicon-edit small"></span></a>
</td> </td>
<td>{{\App\Helper\Format::shortDate($cuota->pago()->fecha)}}</td> <td>{{$format->shortDate($cuota->pago()->fecha)}}</td>
<td>{{($cuota->pago()->banco()) ? $cuota->pago()->banco()->nombre : ''}}</td> <td>{{($cuota->pago()->banco()) ? $cuota->pago()->banco()->nombre : ''}}</td>
<td> <td>
@if ($cuota->pago()->identificador == '') @if ($cuota->pago()->identificador == '')
@ -94,10 +94,10 @@
{{$cuota->pago()->identificador}} {{$cuota->pago()->identificador}}
@endif @endif
</td> </td>
<td class="text-right">$ {{\App\Helper\Format::pesos($cuota->valor())}}</td> <td class="text-right">$ {{$format->pesos($cuota->valor())}}</td>
<td class="text-right">{{\App\Helper\Format::ufs($cuota->valor('ufs'))}} UF</td> <td class="text-right">{{$format->ufs($cuota->valor('ufs'))}} UF</td>
<td class="text-center @include('ventas.pies.cuotas.estado')"> <td class="text-center @include('ventas.pies.cuotas.estado')">
{{\App\Helper\Format::shortDate($cuota->pago()->estado()->fecha)}} {{$format->shortDate($cuota->pago()->estado()->fecha)}}
<a href="{{url('', ['p' => 'pagos', 'a' => 'edit', 'pago' => $cuota->pago()->id, 'asociado' => 'venta', 'venta' => $venta->id])}}"><span class="glyphicon glyphicon-edit small"></span></a> <a href="{{url('', ['p' => 'pagos', 'a' => 'edit', 'pago' => $cuota->pago()->id, 'asociado' => 'venta', 'venta' => $venta->id])}}"><span class="glyphicon glyphicon-edit small"></span></a>
</td> </td>
<td> <td>

View File

@ -8,7 +8,7 @@
<form method="post" class="form-horizontal" action="{{url('', ['p' => 'propietarios', 'a' => 'editar', 'venta' => $venta->id])}}"> <form method="post" class="form-horizontal" action="{{url('', ['p' => 'propietarios', 'a' => 'editar', 'venta' => $venta->id])}}">
<div class="form-group"> <div class="form-group">
<div class="col-md-2">RUT</div> <div class="col-md-2">RUT</div>
<div class="col-md-2"><input type="text" name="rut" value="{{\App\Helper\Format::number($propietario->rut, 0)}}-{{$propietario->dv}}" class="form-control" /></div> <div class="col-md-2"><input type="text" name="rut" value="{{$format->number($propietario->rut, 0)}}-{{$propietario->dv}}" class="form-control" /></div>
<div class="col-md-2 checkbox"><label><input type="checkbox" name="empresa" /> Empresa?</label></div> <div class="col-md-2 checkbox"><label><input type="checkbox" name="empresa" /> Empresa?</label></div>
</div> </div>
<div class="form-group"> <div class="form-group">
@ -243,4 +243,4 @@ function removeRepresentante() {
$("input[name='rep_rut']").parent().parent().remove(); $("input[name='rep_rut']").parent().parent().remove();
} }
</script> </script>
@endpush @endpush

View File

@ -26,7 +26,7 @@
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td>{{\App\Helper\Format::number($venta->propietario()->rut, 0)}}-{{$venta->propietario()->dv}}</td> <td>{{$format->number($venta->propietario()->rut, 0)}}-{{$venta->propietario()->dv}}</td>
<td>{{($venta->propietario()->direccion()) ? $venta->propietario()->direccion()->completa() : ''}}</td> <td>{{($venta->propietario()->direccion()) ? $venta->propietario()->direccion()->completa() : ''}}</td>
</tr> </tr>
<tr> <tr>
@ -79,7 +79,7 @@
<td>{{ucwords($venta->unidad()->tipo()->descripcion)}} {{$venta->unidad()->tipologia()->tipologia()->descripcion}}</td> <td>{{ucwords($venta->unidad()->tipo()->descripcion)}} {{$venta->unidad()->tipologia()->tipologia()->descripcion}}</td>
<td>{{$venta->unidad()->descripcion}}</td> <td>{{$venta->unidad()->descripcion}}</td>
<td>{{$venta->unidad()->piso}}</td> <td>{{$venta->unidad()->piso}}</td>
<td>{{\App\Helper\Format::number($venta->unidad()->m2(), 2)}} m&#0178;</td> <td>{{$format->number($venta->unidad()->m2(), 2)}} m&#0178;</td>
<td class="text-right"> <td class="text-right">
@if ($venta->unidad()->precio($venta->fecha())) @if ($venta->unidad()->precio($venta->fecha()))
{{format('ufs', $venta->unidad()->precio($venta->fecha())->valor)}} UF {{format('ufs', $venta->unidad()->precio($venta->fecha())->valor)}} UF
@ -111,7 +111,7 @@
<td>{{$unidad->unidad()->piso}}</td> <td>{{$unidad->unidad()->piso}}</td>
<td> <td>
@if ($unidad->unidad()->tipo()->descripcion == 'departamento') @if ($unidad->unidad()->tipo()->descripcion == 'departamento')
{{\App\Helper\Format::number($unidad->unidad()->m2(), 2)}} m&#0178; {{$format->number($unidad->unidad()->m2(), 2)}} m&#0178;
@endif @endif
</td> </td>
<td class="text-right"> <td class="text-right">
@ -171,7 +171,7 @@
<td>{{format('ufs', $venta->valor_uf)}} UF</td> <td>{{format('ufs', $venta->valor_uf)}} UF</td>
<td>{{format('ufs', $venta->valorFinal())}} UF</td> <td>{{format('ufs', $venta->valorFinal())}} UF</td>
<td>{{format('ufs', $venta->uf_m2(), null, true)}}/m&#0178;</td> <td>{{format('ufs', $venta->uf_m2(), null, true)}}/m&#0178;</td>
<td>{{format('ufs', $venta->valorComision())}} UF ({{\App\Helper\Format::number($venta->comision() * 100, 2)}}%) <td>{{format('ufs', $venta->valorComision())}} UF ({{$format->number($venta->comision() * 100, 2)}}%)
@if ($venta->agente != 0) @if ($venta->agente != 0)
<br /> <br />
{{$venta->agente()->agente()->agente()->descripcion}} {{$venta->agente()->agente()->agente()->descripcion}}

51
setup/app.php Normal file
View File

@ -0,0 +1,51 @@
<?php
use DI\ContainerBuilder as Builder;
use DI\Bridge\Slim\Bridge;
include_once 'composer.php';
$builder = new Builder();
$folders = [
'settings',
'setups'
];
foreach ($folders as $f) {
$folder = implode(DIRECTORY_SEPARATOR, [
__DIR__,
$f
]);
if (!file_exists($folder)) {
continue;
}
$files = new DirectoryIterator($folder);
foreach ($files as $file) {
if ($file->isDir()) {
continue;
}
$builder->addDefinitions($file->getRealPath());
}
}
$container = $builder->build();
$app = Bridge::create($container);
if ($app->getContainer()->has('base_url')) {
$app->setBasePath($app->getContainer()->get('base_url'));
}
$app->addRoutingMiddleware();
$folder = implode(DIRECTORY_SEPARATOR, [
__DIR__,
'middlewares'
]);
if (file_exists($folder)) {
$files = new DirectoryIterator($folder);
foreach ($files as $file) {
if ($file->isDir() and $file->getExtension() != 'php') {
continue;
}
include_once $file->getRealPath();
}
}
include_once 'router.php';

6
setup/composer.php Normal file
View File

@ -0,0 +1,6 @@
<?php
include_once implode(DIRECTORY_SEPARATOR, [
dirname(__FILE__, 2),
'vendor',
'autoload.php'
]);

View File

@ -0,0 +1,3 @@
<?php
$app->add($app->getContainer()->get(Zeuxisoo\Whoops\Slim\WhoopsMiddleware::class));
$app->add($app->getContainer()->get(Incoviba\UI\Common\Middleware\NotFound::class));

View File

@ -0,0 +1,2 @@
<?php
$app->add($app->getContainer()->get(Incoviba\UI\Common\Middleware\Auth::class));

9
setup/router.php Normal file
View File

@ -0,0 +1,9 @@
<?php
$folder = $app->getContainer()->get('folders')->routes;
$files = new DirectoryIterator($folder);
foreach ($files as $file) {
if ($file->isDir() or $file->getExtension() != 'php') {
continue;
}
include_once $file->getRealPath();
}

View File

@ -0,0 +1,6 @@
<?php
return [
'debug' => $_ENV['DEBUG'] ?? false,
'base_url' => $_ENV['BASE_URL'] ?? false,
'API_KEY' => $_ENV['API_KEY']
];

View File

@ -0,0 +1,15 @@
<?php
return [
'folders' => function () {
$arr = ['base' => dirname(__FILE__, 3)];
$arr['resources'] = implode(DIRECTORY_SEPARATOR, [
$arr['base'],
'resources'
]);
$arr['routes'] = implode(DIRECTORY_SEPARATOR, [
$arr['resources'],
'routes'
]);
return (object)$arr;
}
];

34
setup/settings/03_web.php Normal file
View File

@ -0,0 +1,34 @@
<?php
use Psr\Container\ContainerInterface as Container;
return [
'cookie_name' => 'rememberMe',
'folders' => DI\decorate(function ($prev, Container $c) {
$arr = (array) $prev;
$arr['templates'] = implode(DIRECTORY_SEPARATOR, [
$prev->resources,
'views'
]);
$arr['cache'] = implode(DIRECTORY_SEPARATOR, [
$prev->base,
'cache'
]);
return (object) $arr;
}),
'urls' => function(Container $c) {
$arr = [];
$base = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'];
if ($c->has('base_url')) {
if ($c->get('base_url') != '') {
$base = $c->get('base_url');
}
}
$arr['base'] = $base;
$arr['images'] = implode('/', [$arr['base'], 'images']);
$arr['scripts'] = implode('/', [$arr['base'], 'js']);
$arr['styles'] = implode('/', [$arr['base'], 'css']);
$arr['api'] = $_ENV['API_URL'] ?? 'http://localhost:8081';
$arr['money'] = 'http://provm.cl/money';
return (object) $arr;
}
];

11
setup/setups/01_env.php Normal file
View File

@ -0,0 +1,11 @@
<?php
use Psr\Container\ContainerInterface as Container;
return [
Zeuxisoo\Whoops\Slim\WhoopsMiddleware::class => function(Container $c) {
return new Zeuxisoo\Whoops\Slim\WhoopsMiddleware([
'enable' => $c->get('debug'),
'editor' => 'vscode'
]);
}
];

42
setup/setups/02_web.php Normal file
View File

@ -0,0 +1,42 @@
<?php
use Psr\Container\ContainerInterface as Container;
return [
Slim\Views\Blade::class => function(Container $c) {
return new Slim\Views\Blade(
$c->get('folders')->templates,
$c->get('folders')->cache,
null,
[
'urls' => $c->get('urls'),
'auth' => $c->get(Incoviba\UI\Common\Service\Auth::class),
'api_key' => $c->get('API_KEY')
]
);
},
Psr\Http\Client\ClientInterface::class => function(Container $c) {
return new GuzzleHttp\Client([
'base_uri' => $c->get('urls')->api,
'headers' => ['Authorization' => 'Bearer ' . $c->get('API_KEY')]
]);
},
Incoviba\UI\Common\Service\Auth::class => function(Container $c) {
return new Incoviba\UI\Common\Service\Auth(
$c->get(Psr\Http\Client\ClientInterface::class),
$c->get('cookie_name')
);
},
Incoviba\UI\Common\Middleware\Auth::class => function(Container $c) {
return new Incoviba\UI\Common\Middleware\Auth(
$c->get(Incoviba\UI\Common\Service\Auth::class),
$c->get(Nyholm\Psr7\Factory\Psr17Factory::class),
['/', '/auth/login']
);
},
Incoviba\UI\Common\Middleware\NotFound::class => function(Container $c) {
return new Incoviba\UI\Common\Middleware\NotFound(
$c->get(Nyholm\Psr7\Factory\Psr17Factory::class),
$c->get(Slim\Views\Blade::class)
);
}
];