This commit is contained in:
Juan Pablo Vial
2023-07-24 20:41:38 -04:00
parent 6ab24c8961
commit be33305cf1
612 changed files with 11436 additions and 107 deletions

View File

@ -0,0 +1,2 @@
ADMINER_DESIGN=dracula
ADMINER_PLUGINS=dump-json

4
app_old/.db.env.sample Normal file
View File

@ -0,0 +1,4 @@
MYSQL_DATABASE=
MYSQL_PASSWORD=
MYSQL_ROOT_PASSWORD=
MYSQL_USER=

2
app_old/.env.sample Normal file
View File

@ -0,0 +1,2 @@
BASE_URL=
MYSQL_HOST=

10
app_old/.gitignore vendored Normal file
View File

@ -0,0 +1,10 @@
**/*.env
**/vendor/
**/composer.lock
**/node_modules/
**/package-lock.json
**/Pipfile.lock
**/logs/
**/cache/
**/modules/
**/.idea/

11
app_old/aldarien/asset/.gitignore vendored Normal file
View File

@ -0,0 +1,11 @@
composer.phar
/vendor/
# Commit your application's lock file http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file
# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
# composer.lock
#Eclipse IDE
.settings
.buildpath
.project

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2017 Aldarien
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,2 @@
# asset
Asset manager module for my apps

View File

@ -0,0 +1,21 @@
<?php
namespace App\Contract;
use App\Definition\Contract;
use App\Service\Asset as AssetService;
class Asset
{
use Contract;
protected static function newInstance()
{
return new AssetService();
}
public static function get($identifier)
{
$instance = self::getInstance();
return $instance->get($identifier);
}
}
?>

View File

@ -0,0 +1,5 @@
<?php
function asset($identifier) {
return \App\Contract\Asset::get($identifier);
}
?>

View File

@ -0,0 +1,88 @@
<?php
namespace App\Service;
class Asset
{
protected $assets;
protected $dir;
public function __construct()
{
$this->dir = config('locations.public');
}
public function get($identifier)
{
$asset = $this->find($identifier);
return $asset->url;
}
protected function find($identifier)
{
$type = $this->getType($identifier);
$asset = null;
if ($type == false) {
foreach (array_keys($this->assets) as $type) {
if (($asset = $this->getAsset($identifier, $type))) {
break;
}
}
} else {
$asset = $this->getAsset($identifier, $type);
}
return $asset;
}
protected function getType($identifier)
{
if (strpos($identifier, '.') !== false) {
list($name, $ext) = explode('.', $identifier);
return $ext;
}
return false;
}
protected function getAsset($identifier, $type)
{
if (!isset($this->assets[$type])) {
$this->loadAssets($type);
}
if (!isset($this->assets[$type])) {
return null;
}
foreach ($this->assets[$type] as $asset) {
if ($this->compareIdentifier($asset, $identifier)) {
return $asset;
}
}
return null;
}
protected function loadAssets($type)
{
$dir = $this->dir . '/' . $type . '/*.' . $type;
$files = glob($dir);
foreach ($files as $file) {
$url = $this->url($file);
$identifier = pathinfo($file)['filename'];
$this->assets[$type] []= (object) ['identifier' => $identifier, 'url' => $url, 'type' => $type];
}
}
protected function url($file)
{
$url = '/' . config('app.project') . '/' . str_replace('\\', '/', str_replace(realpath(config('locations.public')), '', dirname(realpath($file)))) . '/' . basename(realpath($file));
$url = preg_replace('/\/+/', '/', $url);
return $url;
}
protected function compareIdentifier($asset, $identifier)
{
if (strpos($identifier, '.') !== false) {
list($name, $ext) = explode('.', $identifier);
if ($asset->identifier == $name and $asset->type == $ext) {
return true;
}
} else {
if ($asset->identifier == $identifier) {
return true;
}
}
return false;
}
}

View File

@ -0,0 +1,26 @@
{
"name" : "aldarien/asset",
"description" : "Asset manager module for my apps",
"type" : "library",
"require" : {
"aldarien/config" : "*",
"aldarien/contract" : "*"
},
"require-dev" : {
"phpunit/phpunit" : "*"
},
"license" : "MIT",
"authors" : [{
"name" : "Aldarien",
"email" : "aldarien85@gmail.com"
}
],
"autoload" : {
"psr-4" : {
"App\\" : "app"
},
"files": [
"app/Helper/functions.php"
]
}
}

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
colors="true"
verbose="true"
bootstrap="./vendor/autoload.php"
>
<testsuites>
<testsuite name="Application Test Suite">
<directory>./tests/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory>./app</directory>
</whitelist>
</filter>
</phpunit>

View File

@ -0,0 +1,25 @@
<?php
use PHPUnit\Framework\TestCase;
class AssetTest extends TestCase
{
public function setUp()
{
mkdir(root() . '/public');
mkdir(root() . '/public/css');
config('locations.public', root() . '/public');
file_put_contents(root() . '/public/css/style.css', 'body {color: black;}');
}
public function tearDown()
{
unlink(root() . '/public/css/style.css');
rmdir(root() . '/public/css');
rmdir(root() . '/public');
}
public function testAsset()
{
$this->assertEquals(asset('style.css'), '/css/style.css');
}
}
?>

13
app_old/aldarien/config/.gitignore vendored Normal file
View File

@ -0,0 +1,13 @@
composer.phar
/vendor/
# Commit your application's lock file http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file
# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
# composer.lock
config
# Eclipse IDE
.settings
.buildpath
.project

View File

@ -0,0 +1,3 @@
language: php
php: '7.1'
install: composer update

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2017 Aldarien
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,4 @@
# config
Config module that recovers configuration files
[![Build Status](https://travis-ci.org/Aldarien/config.svg?branch=1.0.1)](https://travis-ci.org/Aldarien/config)

View File

@ -0,0 +1,31 @@
<?php
namespace App\Contract;
use App\Definition\Contract;
use App\Service\Config AS ConfigService;
class Config
{
use Contract;
protected static function newInstance()
{
return new ConfigService();
}
public static function get($name = null)
{
$instance = self::getInstance();
return $instance->get($name);
}
public static function set($name, $value)
{
$instance = self::getInstance();
return $instance->set($name, $value);
}
public static function addFile($filename)
{
$instance = self::getInstance();
return $instance->loadFile($filename);
}
}
?>

View File

@ -0,0 +1,21 @@
<?php
namespace App\Contract;
use Symfony\Component\Yaml\Yaml;
class YamlWrapper
{
public static function load($filename, $flags = 0)
{
return self::parse(file_get_contents($filename), $flags);
}
public static function parse($input, $flags = 0)
{
return Yaml::parse($input, $flags);
}
public static function dump($array, $inline = 2, $indent = 4, $flags = 0)
{
return Yaml::dump($array, $inline, $indent, $flags);
}
}
?>

View File

@ -0,0 +1,9 @@
<?php
function config($name = null, $value = null) {
if ($value == null) {
return App\Contract\Config::get($name);
} else {
return App\Contract\Config::set($name, $value);
}
}
?>

View File

@ -0,0 +1,150 @@
<?php
namespace App\Service;
use App\Contract\YamlWrapper;
class Config
{
protected $dir;
protected $data;
public function __construct($dir = null)
{
if ($dir == null) {
$dir = realpath(root() . '/config');
}
$this->dir = $dir;
$this->load();
}
protected function load()
{
$files = glob($this->dir . '/*.{php,json,yml}', GLOB_BRACE);
foreach ($files as $file) {
$info = pathinfo($file);
$name = $info['filename'];
$d = $this->getData($file);
$data[$name] = $d;
$data = array_merge($data, $this->translateArray($d, $name));
foreach ($data as $key => $value) {
$this->add($key, $value);
}
}
}
public function loadFile(string $filename)
{
if (!file_exists(realpath($filename))) {
return false;
}
$info = pathinfo($filename);
$name = $info['filename'];
$d = $this->getData($filename);
$data[$name] = $d;
$data = array_merge($data, $this->translateArray($d, $name));
foreach ($data as $key => $value) {
$this->add($key, $value);
}
return true;
}
protected function getData($filename)
{
$info = pathinfo($filename);
switch ($info['extension']) {
case 'php':
return include_once $filename;
case 'json':
return json_decode(file_get_contents($filename), true);
case 'yml':
return YamlWrapper::load($filename);
default:
throw new \DomainException('Invalid file extension for ' . $filename);
}
}
protected function translateArray($array, $level)
{
$output = [];
foreach ($array as $k1 => $l1) {
$key = $level . '.' . $k1;
if (is_array($l1)) {
$output[$key] = $l1;
$output = array_merge($output, $this->translateArray($l1, $key));
} else {
$output[$key] = $l1;
}
}
return $output;
}
protected function add($field, $value)
{
if (isset($this->data[$field])) {
if ($this->data[$field] == $value) {
return;
}
if (is_array($this->data[$field])) {
$this->data[$field] = $this->merge($this->data[$field], $this->replace($value));
} else {
$this->data[$field] = $this->replace($value);
}
} else {
$this->data[$field] = $this->replace($value);
}
}
protected function merge($arr1, $arr2)
{
$output = $arr1;
foreach ($arr2 as $k => $value) {
if (isset($arr1[$k])) {
if ($arr1[$k] == $value) {
continue;
}
if (is_array($arr1[$k])) {
$output[$k] = $this->merge($arr1[$k], $value);
} else {
$output[$k] = array_merge([$arr1[$k]], $value);
}
} else {
$output[$k] = $value;
}
}
return $output;
}
protected function replace($value)
{
if (is_array($value)) {
foreach ($value as $k => $v) {
$value[$k] = $this->replace($v);
}
return $value;
}
if (strpos($value, '{') !== false) {
while(strpos($value, '{') !== false) {
$ini = strpos($value, '{') + 1;
$end = strpos($value, '}', $ini);
$rep = substr($value, $ini, $end - $ini);
$new = $this->get($rep);
if ($new === null) {
$new = '';
}
$value = str_replace('{' . $rep . '}', $new, $value);
}
}
return $value;
}
public function get($name = null)
{
if ($name == null) {
return $this->data;
}
if (isset($this->data[$name])) {
return $this->data[$name];
}
return null;
}
public function set($name, $value)
{
$this->add($name, $value);
}
}
?>

View File

@ -0,0 +1,3 @@
<?php
include_once dirname(__DIR__) . '/vendor/autoload.php';
?>

View File

@ -0,0 +1,28 @@
{
"name": "aldarien/config",
"description": "Config module for my apps",
"type": "library",
"license": "MIT",
"authors": [
{
"name": "Aldarien",
"email": "aldarien85@gmail.com"
}
],
"require": {
"aldarien/contract": "*",
"aldarien/root": "*",
"symfony/yaml": "*"
},
"autoload": {
"psr-4": {
"App\\": "app"
},
"files": [
"app/Helper/functions.php"
]
},
"require-dev": {
"phpunit/phpunit": "^6.3"
}
}

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
colors="true"
verbose="true"
bootstrap="./bootstrap/autoload.php"
>
<testsuites>
<testsuite name="Application Test Suite">
<directory>./tests/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory>./app</directory>
</whitelist>
</filter>
</phpunit>

View File

@ -0,0 +1,90 @@
<?php
use PHPUnit\Framework\TestCase;
use App\Contract\YamlWrapper;
class ConfigTest extends TestCase
{
public function setUp()
{
mkdir(dirname(__DIR__) . '/config');
$str = "<?php return ['name' => 'Config', 'test_array' => ['data1' => 1, 'data2' => 2]]; ?>";
file_put_contents(dirname(__DIR__) . '/config/app.php', $str);
$data = ['name' => 'Config', 'test_array' => ['data1' => 1, 'data2' => 2]];
file_put_contents(dirname(__DIR__) . '/config/json.json', json_encode($data));
file_put_contents(dirname(__DIR__) . '/config/yaml.yml', YamlWrapper::dump($data));
$data = ['last_name' => 'Config'];
file_put_contents(dirname(__DIR__) . '/config/yaml.json', json_encode($data));
}
public function testGetNamePhp()
{
$name = 'Config';
$this->assertEquals($name, config('app.name'));
}
public function testGetNameJson()
{
$name = 'Config';
$this->assertEquals($name, config('json.name'));
}
public function testGetNameYaml()
{
$name = 'Config';
$this->assertEquals($name, config('yaml.name'));
}
public function testSetNamehp()
{
$new_name = 'Config_Test';
config('app.name', $new_name);
$this->assertEquals($new_name, config('app.name'));
}
public function testSetNameJson()
{
$new_name = 'Config_Test';
config('json.name', $new_name);
$this->assertEquals($new_name, config('json.name'));
}
public function testSetNameYaml()
{
$new_name = 'Config_Test';
config('yaml.name', $new_name);
$this->assertEquals($new_name, config('yaml.name'));
}
public function testArrayGetPhp()
{
$this->assertArrayHasKey('data1', config('app.test_array'));
}
public function testArrayGetJson()
{
$this->assertArrayHasKey('data1', config('json.test_array'));
}
public function testArrayGetYaml()
{
$this->assertArrayHasKey('data1', config('yaml.test_array'));
}
public function testSameSectionName()
{
$this->assertEquals('Config', config('yaml.last_name'));
}
public function testDuplicateValue()
{
config('json.name', 'Config2');
$this->assertEquals('Config2', config('json.name'));
}
public function testAddFile()
{
$filename = dirname(__DIR__) . '/composer.json';
App\Contract\Config::addFile($filename);
$this->assertEquals('aldarien/config', config('composer.name'));
}
public function tearDown()
{
unlink(dirname(__DIR__) . '/config/app.php');
unlink(dirname(__DIR__) . '/config/json.json');
unlink(dirname(__DIR__) . '/config/yaml.yml');
unlink(dirname(__DIR__) . '/config/yaml.json');
rmdir(dirname(__DIR__) . '/config');
}
}
?>

6
app_old/aldarien/contract/.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
composer.phar
/vendor/
# Commit your application's lock file http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file
# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
# composer.lock

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2017 Aldarien
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,20 @@
<?php
namespace App\Definition;
trait Contract
{
protected static $instance = null;
private function __construct() {}
protected static function getInstance()
{
if (self::$instance == null) {
self::$instance = static::newInstance();
}
return self::$instance;
}
abstract protected static function newInstance();
}
?>

View File

@ -0,0 +1,18 @@
{
"name": "aldarien/contract",
"description": "Contract trait for my apps",
"type": "library",
"license": "MIT",
"authors": [
{
"name": "Aldarien",
"email": "aldarien85@gmail.com"
}
],
"require": {},
"autoload": {
"psr-4": {
"App\\": "app"
}
}
}

11
app_old/aldarien/format/.gitignore vendored Normal file
View File

@ -0,0 +1,11 @@
composer.phar
/vendor/
# Commit your application's lock file http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file
# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
# composer.lock
# Eclipse IDE
.settings
.buildpath
.project

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2017 Aldarien
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,2 @@
# format
Module for formatting data, mostly numbers

View File

@ -0,0 +1,43 @@
<?php
namespace App\Helper;
class Format
{
public static function number(float $number, $decimals)
{
return number_format($number, $decimals, ',', '.');
}
public static function pesos(float $number, bool $print = false)
{
return (($print) ? '$ ' : '') . self::number($number, 0);
}
public static function ufs(float $number, bool $print = false)
{
return self::number($number, 2) . (($print) ? ' UF' : '');
}
public static function date(string $date)
{
$d = \Carbon\Carbon::parse($date, config('app.timezone'));
return $d->format("d \d\\e F Y");
}
public static function shortDate(string $date)
{
$d = \Carbon\Carbon::parse($date, config('app.timezone'));
return $d->format('d-m-Y');
}
public static function localDate(string $date)
{
$d = \Carbon\Carbon::parse($date, config('app.timezone'));
setlocale(LC_TIME, 'es');
return $d->formatLocalized('%d de %B de %Y');
}
public static function m2(float $number, bool $print = false)
{
return self::number($number, 2) . (($print) ? ' m&#0178;' : '');
}
public static function percent(float $number, bool $print = false)
{
return self::number($number, 2) . (($print) ? '%' : '');
}
}
?>

View File

@ -0,0 +1,23 @@
{
"name" : "aldarien/format",
"description" : "Module for formatting data, mostly numbers",
"type" : "library",
"require-dev" : {
"phpunit/phpunit" : "*",
"aldarien/config": "*"
},
"license" : "MIT",
"authors" : [{
"name" : "Aldarien",
"email" : "aldarien85@gmail.com"
}
],
"autoload" : {
"psr-4" : {
"App\\" : "app"
}
},
"require": {
"nesbot/carbon": "^2"
}
}

View File

@ -0,0 +1,5 @@
<?php
return [
'timezone' => 'America/Santiago'
];
?>

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
colors="true"
verbose="true"
bootstrap="./vendor/autoload.php"
>
<testsuites>
<testsuite name="Application Test Suite">
<directory>./tests/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory>./app</directory>
</whitelist>
</filter>
</phpunit>

View File

@ -0,0 +1,59 @@
<?php
use PHPUnit\Framework\TestCase;
use App\Helper\Format;
class FormatTest extends TestCase
{
protected $number = 5049872.31567;
protected $date = '2016-03-25';
public function testFormat()
{
$output = '5.049.872,316';
$result = Format::number($this->number, 3);
$this->assertEquals($output, $result);
}
public function testPesosPrint()
{
$output = '$ 5.049.872';
$result = Format::pesos($this->number, true);
$this->assertEquals($output, $result);
}
public function testUFPrint()
{
$output = '5.049.872,32 UF';
$result = Format::ufs($this->number, true);
$this->assertEquals($output, $result);
}
public function testDate()
{
$output = '25 de March 2016';
$result = Format::date($this->date);
$this->assertEquals($output, $result);
}
public function testShortDate()
{
$output = '25-03-2016';
$result = Format::shortDate($this->date);
$this->assertEquals($output, $result);
}
public function testLocalDate()
{
$output = '25 de marzo de 2016';
$result = Format::localDate($this->date);
$this->assertEquals($output, $result);
}
public function testM2Print()
{
$output = '5.049.872,32 m&#0178;';
$result = Format::m2($this->number, true);
$this->assertEquals($output, $result);
}
public function testPercentPrint()
{
$output = '5.049.872,32%';
$result = Format::percent($this->number, true);
$this->assertEquals($output, $result);
}
}
?>

7
app_old/aldarien/response/.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
#Eclipse IDE
.settings
.buildpath
.project
#Composer
vendor

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2017 Aldarien
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,2 @@
# response
Response handler module for my apps

View File

@ -0,0 +1,27 @@
<?php
namespace App\Contract;
use App\Definition\Contract;
use App\Service\Response as ResponseService;
class Response
{
use Contract;
protected static function newInstance()
{
return new ResponseService();
}
public static function __callStatic($name, $params)
{
if (!method_exists(Response::class, $name)) {
$instance = self::getInstance();
if (method_exists($instance, $name)) {
return call_user_func_array([$instance, $name], $params);
}
return null;
}
return call_user_func_array([self, $name], $params);
}
}
?>

View File

@ -0,0 +1,11 @@
<?php
function sanitize() {
App\Contract\Response::sanitize();
}
function get($query = null) {
return App\Contract\Response::get($query);
}
function post($query = null) {
return App\Contract\Response::post($query);
}
?>

View File

@ -0,0 +1,62 @@
<?php
namespace App\Service;
class Response
{
protected $post;
protected $get;
protected $gump;
public function __construct()
{
$this->gump = new \GUMP();
}
public function sanitize()
{
if ($_POST) {
$this->post = $this->correctNumbers($this->gump->sanitize($_POST));
}
if ($_GET) {
$this->get = $this->correctNumbers($this->gump->sanitize($_GET));
}
}
public function correctNumbers(array $data)
{
$output = [];
foreach ($data as $key => $value) {
if (is_float(str_replace(',', '.', $value))) {
$output[$key] = str_replace(',', '.', $value);
} else {
$output[$key] = $value;
}
}
return $output;
}
public function get($query = null)
{
if ($this->get == null) {
$this->sanitize();
}
if ($query == null) {
return $this->get;
}
if (isset($this->get[$query])) {
return $this->get[$query];
}
return false;
}
public function post($query = null)
{
if ($this->post == null) {
$this->sanitize();
}
if ($query == null) {
return $this->post;
}
if (isset($this->post[$query])) {
return $this->post[$query];
}
return false;
}
}
?>

View File

@ -0,0 +1,3 @@
<?php
include_once dirname(__DIR__) . '/vendor/autoload.php';
?>

View File

@ -0,0 +1,26 @@
{
"name" : "aldarien/response",
"description" : "Response handler module for my apps",
"type" : "library",
"require" : {
"wixel/gump" : "^2.0.0",
"aldarien/contract" : "*"
},
"require-dev" : {
"phpunit/phpunit" : "*"
},
"license" : "MIT",
"authors" : [{
"name" : "Aldarien",
"email" : "jpvial@gmail.com"
}
],
"autoload" : {
"psr-4" : {
"App\\" : "app"
},
"files": [
"app/Helper/functions.php"
]
}
}

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
colors="true"
verbose="true"
bootstrap="./bootstrap/autoload.php"
>
<testsuites>
<testsuite name="Application Test Suite">
<directory>./tests/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory>./app</directory>
</whitelist>
</filter>
</phpunit>

View File

@ -0,0 +1,22 @@
<?php
use PHPUnit\Framework\TestCase;
class ResponseTest extends TestCase
{
protected $value = 'Test';
public function setUp()
{
$_GET['test'] = $this->value;
$_POST['test'] = $this->value;
}
public function testGet()
{
$this->assertEquals($this->value, get('test'));
}
public function testPost()
{
$this->assertEquals($this->value, post('test'));
}
}
?>

5
app_old/aldarien/root/.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
.buildpath
.project
.settings
*.lock
vendor

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2017 Aldarien
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,22 @@
# root
get root directory path for your project
## Usage
add `Root::root('project')` or `root('project')` or `Root::root()` or `root()` where you need the root directory of your proyect.
## Example
For the structure:
~~~
/usr/share/www/projects
- myProject
-- src
-- tests
~~~
using `Root::root('myProject')`
outputs:
`/usr/share/www/projects/myProject`

View File

@ -0,0 +1,5 @@
<?php
function root(string $proyect_name = '') {
return \Proyect\Root\Root::root($proyect_name);
}
?>

View File

@ -0,0 +1,21 @@
{
"name" : "aldarien/root",
"description" : "Find the root path for your proyect",
"authors" : [{
"name" : "Aldarien"
}
],
"license": "MIT",
"require-dev" : {
"phpunit/phpunit" : "*",
"kint-php/kint" : "*"
},
"autoload" : {
"psr-4" : {
"Proyect\\Root\\" : "src"
},
"files": [
"app/Helper/functions.php"
]
}
}

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/6.2/phpunit.xsd"
bootstrap="vendor/autoload.php"
forceCoversAnnotation="true"
beStrictAboutCoversAnnotation="true"
beStrictAboutOutputDuringTests="true"
beStrictAboutTodoAnnotatedTests="true"
verbose="true">
<testsuite>
<directory suffix="Test.php">tests</directory>
</testsuite>
<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">src</directory>
</whitelist>
</filter>
</phpunit>

View File

@ -0,0 +1,48 @@
<?php
namespace Proyect\Root;
class Root
{
/**
* gives base path for your proyect.
* eg. <code>$proyect_name/public/index.php</code> calls for <code>$proyect_name/bootstrap/autoload.php</code>,
* you just need to
*
* <code>include root() . '/bootstrap/autoload.php'</code>
*
* @param string $proyect_name
* @return string
*/
public static function root(string $proyect_name = '')
{
$dir = realpath(__DIR__);
if ($proyect_name == '') {
return self::findComposerFile($dir);
} else {
$ini = strpos($dir, $proyect_name) + strlen($proyect_name);
}
$path = substr($dir, $ini);
$cnt = substr_count($path, DIRECTORY_SEPARATOR);
$root = DIRECTORY_SEPARATOR;
for ($i = 0; $i < $cnt; $i ++) {
$root .= '..' . DIRECTORY_SEPARATOR;
}
return realpath($dir . $root);
}
protected static function findComposerFile($dir)
{
if (file_exists($dir . '/vendor/')) {
return $dir;
}
$root = realpath('/');
if (realpath($dir) == $root) {
return null;
}
$dir = dirname($dir);
return self::findComposerFile($dir);
}
}
?>

View File

@ -0,0 +1,61 @@
<?php
use PHPUnit\Framework\TestCase;
use Proyect\Root\Root;
class RootTest extends TestCase
{
private $proyect_name = 'root';
private $current_dir;
public function testBaseRoot()
{
$this->getCurrentDir();
$this->assertEquals($this->getRoot(), $this->current_dir);
$this->assertEquals($this->getBaseRoot(), $this->current_dir);
}
public function testBaseRootFunction()
{
$this->getCurrentDir();
$this->assertEquals($this->getFRoot(), $this->current_dir);
$this->assertEquals($this->getFBaseRoot(), $this->current_dir);
}
public function testSrcRoot()
{
$this->changeDir('src');
$this->assertEquals(realpath($this->getRoot() . '/src'), $this->current_dir);
$this->assertEquals(realpath($this->getBaseRoot() . '/src'), $this->current_dir);
}
public function testSrcRootFunction()
{
$this->changeDir('src');
$this->assertEquals(realpath($this->getFRoot() . '/src'), $this->current_dir);
$this->assertEquals(realpath($this->getFBaseRoot() . '/src'), $this->current_dir);
}
private function getCurrentDir()
{
$this->current_dir = getcwd();
}
private function changeDir($dir)
{
chdir($dir);
$this->getCurrentDir();
}
private function getRoot()
{
return Root::root($this->proyect_name);
}
private function getBaseRoot()
{
return Root::root();
}
private function getFRoot()
{
return root($this->proyect_name);
}
private function getFBaseRoot()
{
return root();
}
}
?>

11
app_old/aldarien/session/.gitignore vendored Normal file
View File

@ -0,0 +1,11 @@
composer.phar
/vendor/
# Commit your application's lock file http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file
# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
# composer.lock
# Eclipse IDE
.settings
.buildpath
.project

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2017 Aldarien
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,2 @@
# session
Session wrapper for aura/session

View File

@ -0,0 +1,29 @@
<?php
namespace App\Contract;
use Aura\Session\SessionFactory;
use App\Definition\Contract;
class Session
{
use Contract;
protected static function newInstance()
{
$session_factory = new SessionFactory();
return $session_factory->newInstance($_COOKIE);
}
public static function get($segment, $name)
{
$instance = self::getInstance();
$segment = $instance->getSegment($segment);
return $segment->get($name);
}
public static function set($segment, $name, $value)
{
$instance = self::getInstance();
$segment = $instance->getSegment($segment);
$segment->set($name, $value);
}
}
?>

View File

@ -0,0 +1,24 @@
{
"name": "aldarien/session",
"description": "Session wrapper for aura/session",
"type": "library",
"require": {
"aura/session": "*",
"aldarien/contract": "*"
},
"require-dev": {
"phpunit/phpunit": "*"
},
"license": "MIT",
"authors": [
{
"name": "Aldarien",
"email": "aldarien85@gmail.com"
}
],
"autoload": {
"psr-4": {
"App\\": "app"
}
}
}

12
app_old/aldarien/url/.gitignore vendored Normal file
View File

@ -0,0 +1,12 @@
composer.phar
/vendor/
# Commit your application's lock file http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file
# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
# composer.lock
.settings
.buildpath
.project
# Eclipse IDE

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2017 Aldarien
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,2 @@
# url
Get relative path url

View File

@ -0,0 +1,21 @@
<?php
namespace App\Contract;
use App\Definition\Contract;
use App\Service\URL as URLService;
class URL
{
use Contract;
protected static function newInstance()
{
return new URLService();
}
public static function url($path = '', $variables = null)
{
$instance = self::getInstance();
return $instance->url($path, $variables);
}
}
?>

View File

@ -0,0 +1,8 @@
<?php
function url($path = '', $variables = null) {
return App\Contract\URL::url($path, $variables);
}
function baseUrl() {
return url();
}
?>

View File

@ -0,0 +1,83 @@
<?php
namespace App\Service;
use League\Uri\Uri as Http;
use League\Uri\Components\Domain as Host;
use League\Uri\Components\HierarchicalPath;
class URL
{
protected $root;
protected $relative;
public function __construct()
{
$this->root = $this->findRoot();
$this->relative = $this->findRelative();
}
protected function findRoot()
{
$base = $_SERVER['HTTP_HOST'] . ((isset($_SERVER['HTTP_PORT'])) ? ':' . $_SERVER['HTTP_PORT'] : '');
$scheme = 'http';
if (isset($_SERVER['REQUEST_SCHEME'])) {
$scheme = $_SERVER['REQUEST_SCHEME'];
}
if (isset($_SERVER['HTTPS'])) {
$scheme = 'https';
}
$uri = Http::createFromString(\Sabre\Uri\resolve($scheme . '://' . $base, $_SERVER['SCRIPT_NAME']));
$host = new Host($uri->getHost());
if ($host->isAbsolute()) {
return $host->getRegistrableDomain();
}
$base = $host . (($uri->getPort()) ? ':' . $uri->getPort() : '');
return ($uri->getScheme() ?: 'http') . '://' . $base;
}
protected function findRelative()
{
$uri = Http::createFromString($_SERVER['SCRIPT_NAME']);
$normalized = (new HierarchicalPath($uri->getPath()))->withoutLeadingSlash()->withoutTrailingSlash()->withoutDotSegments()->withoutEmptySegments();
if ($normalized->getDirname() == '.') {
return '';
}
return $normalized->getDirname();
}
public function url($path = '', $variables = null)
{
$uri = Http::createFromString($path);
if ($uri->getHost() != $this->root and $uri->getHost() != '') {
return $path;
}
$uri = \Sabre\Uri\resolve($this->getBaseUrl(), $path);
try {
$host = new Host(Http::createFromString($uri)->getHost());
} catch (\League\Uri\Exception $e) {
$uri = \Sabre\Uri\resolve($this->getBaseUrl(), '../../') . '/' . basename($path);
$host = new Host(Http::createFromString($uri)->getHost());
}
$base = new Host(Http::createFromString($this->root)->getHost());
if ($host . '' != $base . '') {
$host = new Host(Http::createFromString($this->root)->getHost());
$page = str_replace($this->root, '', $uri);
$uri = \Sabre\Uri\resolve(Http::createFromString($this->root)->getScheme() . '://' . $host->getRegistrableDomain(). '/', $page);
}
if ($variables != null) {
$uri = \Sabre\Uri\resolve($uri, '?' . http_build_query($variables));
}
$uri = \Sabre\Uri\normalize($uri);
return $uri;
}
protected function getBaseUrl()
{
$url = \Sabre\Uri\normalize(trim($this->root . '/' . $this->relative, '/') . '/');
return $url;
}
}
?>

View File

@ -0,0 +1,29 @@
{
"name" : "aldarien/url",
"description" : "Get relative path uri",
"type" : "library",
"require" : {
"aldarien/contract" : "*",
"aldarien/root" : "*",
"league/uri": "*",
"league/uri-components": "*",
"sabre/uri": "*"
},
"require-dev" : {
"phpunit/phpunit" : "*"
},
"license" : "MIT",
"authors" : [{
"name" : "Aldarien",
"email" : "jpvial@gmail.com"
}
],
"autoload" : {
"psr-4" : {
"App\\" : "app"
},
"files": [
"app/Helper/functions.php"
]
}
}

10
app_old/aldarien/view/.gitignore vendored Normal file
View File

@ -0,0 +1,10 @@
composer.phar
/vendor/
# Commit your application's lock file http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file
# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
# composer.lock
.settings
.buildpath
.project

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2017 Aldarien
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,2 @@
# view
View module for my apps

View File

@ -0,0 +1,30 @@
<?php
namespace App\Contract;
use App\Alias\RemoteConnection;
use App\Definition\Contract;
use App\Service\Money;
use App\Service\Remote;
use App\Service\View as ViewService;
use GuzzleHttp\Client;
class View
{
use Contract;
protected static function newInstance()
{
$remote = new Remote(new RemoteConnection());
$money = (new Money(new Client([
'base_uri' => "http://{$remote->getIP()}:8008",
'headers' => ['Accept' => 'application/json']
])));
return new ViewService(['money' => $money]);
}
public static function show($template, $variables = null)
{
$instance = self::getInstance();
return $instance->show($template, $variables);
}
}
?>

View File

@ -0,0 +1,5 @@
<?php
function view($template, $variables = null) {
return \App\Contract\View::show($template, $variables);
}
?>

View File

@ -0,0 +1,27 @@
<?php
namespace App\Service;
use eftec\bladeone\BladeOne;
class View
{
protected $views;
protected $cache;
protected $blade;
public function __construct(array $variables = [])
{
$this->views = config('locations.views');
$this->cache = config('locations.cache');
$this->blade = new BladeOne($this->views, $this->cache, null, $variables);
}
public function show($template, $vars = null)
{
if ($vars) {
return $this->blade->run($template, $vars);
}
return $this->blade->run($template);
}
}
?>

View File

@ -0,0 +1,28 @@
{
"name": "aldarien/view",
"description": "View module for my apps",
"type": "library",
"require": {
"eftec/bladeone": "*",
"aldarien/contract": "*",
"aldarien/config": "*"
},
"license": "MIT",
"authors": [
{
"name": "Aldarien",
"email": "aldarien85@gmail.com"
}
],
"autoload": {
"psr-4": {
"App\\": "app"
},
"files": [
"app/Helper/functions.php"
]
},
"require-dev": {
"phpunit/phpunit": "*"
}
}

View File

@ -0,0 +1,8 @@
<?php
return [
'base' => root(),
'cache' => '{locations.base}/cache',
'resources' => '{locations.base}/resources',
'views' => '{locations.resources}/views'
];
?>

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
colors="true"
verbose="true"
bootstrap="./vendor/autoload.php"
>
<testsuites>
<testsuite name="Application Test Suite">
<directory>./tests/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory>./app</directory>
</whitelist>
</filter>
</phpunit>

View File

@ -0,0 +1,5 @@
<?php
include_once dirname(__DIR__) . '/vendor/autoload.php';
echo view('base');
?>

View File

@ -0,0 +1,9 @@
<!DOCTYPE html>
<html>
<head>
<title>View</title>
</head>
<body>
View test
</body>
</html>

View File

@ -0,0 +1,22 @@
<?php
use PHPUnit\Framework\TestCase;
class ViewTest extends TestCase
{
public function testView()
{
$output = <<<DATA
<!DOCTYPE html>
<html>
<head>
<title>View</title>
</head>
<body>
View test
</body>
</html>
DATA;
$this->assertEquals($output, view('base'));
}
}
?>

View File

@ -0,0 +1,50 @@
<?php
namespace App\Alias;
use PDO;
use PDOException;
class Connection
{
public function __construct(
protected string $host,
protected string $database,
protected string $username,
protected string $password,
protected ?int $port = null,
protected int $retries = 5
) {}
protected PDO $connection;
public function connect(): PDO
{
if (!isset($this->connection)) {
$r = 0;
$exception = null;
while ($r < $this->retries) {
try {
$dsn = $this->getDsn();
$this->connection = new PDO($dsn, $this->username, $this->password);
return $this->connection;
} catch (PDOException $e) {
if ($exception !== null) {
$e = new PDOException($e->getMessage(), $e->getCode(), $exception);
}
$exception = $e;
usleep(500);
}
$r ++;
}
throw $exception;
}
return $this->connection;
}
protected function getDsn(): string
{
$dsn = "mysql:host={$this->host};dbname={$this->database}";
if (isset($this->port)) {
$dsn .= ";port={$this->port}";
}
return $dsn;
}
}

View File

@ -0,0 +1,18 @@
<?php
namespace App\Alias\Excel\Style;
use Slam\Excel\Helper\CellStyleInterface;
use Slam\Excel\Pear\Writer\Format;
class Mes implements CellStyleInterface
{
public function decorateValue($value)
{
return $value;
}
public function styleCell(Format $format): void
{
$format->setNumFormat('mmm-YY');
$format->setAlign('center');
}
}

View File

@ -0,0 +1,17 @@
<?php
namespace App\Alias;
use App\Helper\Format as F;
class Format
{
public static function __callstatic($name, $params)
{
if (method_exists(F, $name)) {
return F::$name($params);
}
}
}
?>

View File

@ -0,0 +1,87 @@
<?php
namespace App\Alias;
use App\Contract\Auth;
use Stringy\Stringy;
class Model extends \Model
{
public function getTable()
{
return parent::_get_table_name(static::class);
}
protected function log()
{
if (strpos(get_called_class(), 'Incoviba\\common\\') !== false) {
return;
}
$user = Auth::User()->id;
$orm = $this->orm;
$ref = new \ReflectionObject($orm);
if (!$ref->hasProperty('_dirty_fields')) {
return;
}
$dirty = $ref->getProperty('_dirty_fields');
$dirty->setAccessible(true);
$new_values = $dirty->getValue($orm);
$changes = array_combine(array_keys($new_values), array_fill(0, count($new_values), ['old' => '', 'new' => '']));
if ($this->isNew()) {
$old = (object) array_combine(array_keys($new_values), array_fill(0, count($new_values), ''));
} else {
$old = model(get_called_class())->findOne($this->{$this->getId()});
}
foreach ($new_values as $column => $value) {
$changes[$column] = ['column' => $column, 'old' => $old->$column, 'new' => $value];
}
$action = '[' . get_called_class() . ']';
doLog($user, $action, $changes);
}
public function getId()
{
if (property_exists(get_called_class(), '_id_column')) {
return static::$_id_column;
}
return $this->id;
}
public function save()
{
$ref = new \ReflectionObject($this);
if ($ref->hasProperty('_timestamps')) {
$ref = $ref->getProperty('_timestamps');
$ref->setAccessible(true);
if ($ref->getValue()) {
if ($this->is_new()) {
$this->setExpr('created_at', 'NOW()');
}
$this->setExpr('updated_at', 'NOW()');
}
}
if (!\ORM::getDb()->inTransaction()) {
\ORM::getDb()->beginTransaction();
}
try {
parent::save();
if (\ORM::getDb()->inTransaction()) {
\ORM::getDb()->commit();
}
} catch (\Exception $e) {
if (\ORM::getDb()->inTransaction()) {
\ORM::getDb()->rollBack();
}
throw $e;
}
$this->log();
}
public function __call($method, $args)
{
if (!method_exists($this, $method)) {
$str = '' . Stringy::create($method)->underscored();
if (method_exists($this, $str)) {
return call_user_func_array([$this, $str], $args);
}
throw new \BadMethodCallException($method . ' not found in ' . get_class($this));
}
return call_user_func_array([$this, $str], $args);
}
}
?>

View File

@ -0,0 +1,21 @@
<?php
namespace App\Alias;
use App\Alias\Date;
use Carbon\Carbon;
/**
*
* @author Aldarien
* @property int id
* @property Date fecha
*
*/
class NewEstado extends NewModel
{
public function fecha()
{
return Carbon::parse($this->fecha, config('app.timezone'));
}
}
?>

View File

@ -0,0 +1,9 @@
<?php
namespace App\Alias;
class NewModel extends Model
{
protected static $_connection_name = 'mysql_copy';
protected static $_timestamps = true;
}
?>

View File

@ -0,0 +1,15 @@
<?php
namespace App\Alias;
/**
*
* @author Aldarien
* @property int id
* @property string descripcion
*
*/
class NewTipo extends NewModel
{
protected static $_timestamps = true;
}
?>

View File

@ -0,0 +1,8 @@
<?php
namespace App\Alias;
class OldModel extends Model
{
protected static $_connection_name = 'mysql';
}
?>

View File

@ -0,0 +1,155 @@
<?php
namespace App\Alias;
use Slam\Excel\Helper as ExcelHelper;
class PHPExcel
{
protected $name;
protected $filename;
protected $columns;
protected $data;
public function __construct($name, $filename)
{
$this->name = $name;
$this->filename = $filename;
}
public function addColumns($fields)
{
$columns = [];
foreach ($fields as $i => $field) {
if (is_object($field)) {
if (isset($field->style)) {
$style = $this->getExcelStyle($field->style);
} else {
$style = $this->getExcelStyle();
}
$column = new ExcelHelper\Column($field->name, $field->name, 10, $style);
} elseif (is_array($field)) {
if (isset($field['style'])) {
$style = $this->getExcelStyle($field['style']);
} else {
$style = $this->getExcelStyle();
}
$column = new ExcelHelper\Column($field['name'], $field['name'], 10, $style);
} else {
$style = $this->getExcelStyle();
$column = new ExcelHelper\Column($field, $field, 10, $style);
}
$columns []= $column;
}
$collection = new ExcelHelper\ColumnCollection($columns);
$this->columns = $collection;
}
protected function getExcelStyle($style = 'text')
{
switch (strtolower($style)) {
case 'date':
return new ExcelHelper\CellStyle\Date();
case 'mes':
return new \App\Alias\Excel\Style\Mes();
case 'currency':
case 'amount':
return new ExcelHelper\CellStyle\Amount();
case 'number':
case 'integer':
return new ExcelHelper\CellStyle\Integer();
case 'percent':
case 'percentage':
return new ExcelHelper\CellStyle\Percentage();
case 'text':
case 'string':
default:
return new ExcelHelper\CellStyle\Text();
}
}
public function addData($data)
{
if ($this->data == null) {
$this->data = [];
}
$this->data = array_merge($data);
}
public function addRow($rowData)
{
if ($this->data == null) {
$this->data = [];
}
$this->data []= $rowData;
}
public function addTotals($totals)
{
$columns = (array) $this->columns;
$columns = array_pop($columns);
$ts = [];
foreach ($columns as $column) {
$col = $column->getHeading();
if (isset($totals[$col])) {
$ts[$col] = $this->getTotal($col, $totals[$col]);
continue;
}
$ts[$col] = '';
}
$this->data []= $ts;
}
protected function getTotal($col, $aggr)
{
$col_num = $this->getColNumber($col);
$col = $this->getColName($col_num);
switch(strtolower($aggr)) {
case 'sum':
$num = 109;
break;
case 'count':
$num = 102;
break;
case 'counta':
$num = 103;
break;
default:
$num = 0;
}
if ($num > 0) {
$end = count($this->data) + 2;
$str = "=SUBTOTAL({$num};{$col}3:{$col}{$end})";
return $str;
}
return $aggr;
}
protected function getColNumber($col)
{
$columns = (array) $this->columns;
$columns = array_keys(array_pop($columns));
return array_search($col, $columns);
}
protected function getColName($col_num)
{
$cols = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$N = strlen($cols);
$name = '';
if ($col_num > $N) {
$name .= $cols[floor($col_num / $N)];
$col_num = $N * ($col_num / $N - floor($col_num / $N));
}
$name .= $cols[$col_num];
return $name;
}
public function informe()
{
header("Content-Type: application/octet-stream; charset=utf-8");
header('Content-Transfer-Encoding: binary');
header('Content-Disposition: attachment; filename="' . $this->filename . '"');
header('Cache-Control: max-age=0');
$pE = new ExcelHelper\TableWorkbook('php://output');
$ws = $pE->addWorksheet($this->name);
$table = new ExcelHelper\Table($ws, 0, 0, $this->name, new \ArrayIterator($this->data));
$table->setColumnCollection($this->columns);
$pE->writeTable($table);
$pE->close();
}
}

View File

@ -0,0 +1,17 @@
<?php
namespace App\Alias;
class RemoteConnection extends Connection
{
public function __construct(protected int $retries = 5)
{
parent::__construct(
$_ENV['REMOTE_HOST'],
$_ENV['REMOTE_DATABASE'],
$_ENV['REMOTE_USER'],
$_ENV['REMOTE_PASSWORD'],
$_ENV['REMOTE_PORT'] ?? null,
$this->retries
);
}
}

View File

@ -0,0 +1,87 @@
<?php
namespace App\Command\Money;
use App\Alias\Connection;
use App\Service\Money;
use DateTimeImmutable;
use DateTimeInterface;
use PDO;
use PDOException;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
#[AsCommand(
name: 'money:uf:get',
hidden: false
)]
class Get extends Command
{
public function __construct(protected Money $service, protected Connection $connection, string $name = null)
{
parent::__construct($name);
}
public function execute(InputInterface $input, OutputInterface $output)
{
$io = new SymfonyStyle($input, $output);
$io->title('Get Money');
$dates = $this->getDates();
foreach ($dates as $date_string => $ids) {
$date = $this->parseDate($date_string);
$response = $this->service->getUF($date);
if ($response->total === 0) {
continue;
}
foreach ($ids as $id) {
$this->queueUpdate($id, $response->uf->value);
}
}
$this->updateUF();
return Command::SUCCESS;
}
protected function getDates(): array
{
$query = "SELECT id, fecha FROM pago WHERE uf IS NULL AND fecha BETWEEN 0 AND DATE_ADD(CURDATE(), INTERVAL 9 DAY) ORDER BY fecha";
$statement = $this->connection->connect()->query($query);
$rows = $statement->fetchAll(PDO::FETCH_ASSOC);
if (count($rows) === 0) {
return [];
}
$dates = [];
foreach ($rows as $row) {
if (!isset($dates[$row['fecha']])) {
$dates[$row['fecha']] = [];
}
$dates[$row['fecha']] []= (int) $row['id'];
}
return $dates;
}
protected function parseDate(string $date_string): DateTimeInterface
{
return new DateTimeImmutable($date_string);
}
protected array $rows;
protected function queueUpdate(int $id, float $value): void
{
$this->rows []= [$value, $id];
}
protected function updateUF(): void
{
$query = "UPDATE pago SET uf = ? WHERE id = ?";
$statement = $this->connection->connect()->prepare($query);
foreach ($this->rows as $row) {
$this->connection->connect()->beginTransaction();
try {
$statement->execute($row);
$this->connection->connect()->commit();
} catch (PDOException $e) {
$this->connection->connect()->rollBack();
}
}
}
}

View File

@ -0,0 +1,52 @@
<?php
namespace App\Command\Money;
use App\Alias\Connection;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
#[AsCommand(
name: 'money:lookup',
hidden: false
)]
class Lookup extends Command
{
public function __construct(protected Connection $connection, string $name = null)
{
parent::__construct($name);
}
public function execute(InputInterface $input, OutputInterface $output)
{
$io = new SymfonyStyle($input, $output);
$io->title('Lookup Money');
while (true) {
$io->info('Checking pending');
if ($this->hasPendingMoney()) {
$io->success('Running money get UF');
$io->note($this->runGetUF());
}
}
return Command::SUCCESS;
}
protected function hasPendingMoney(): bool
{
$query = "SELECT 1 FROM pago WHERE uf IS NULL AND fecha BETWEEN 0 AND DATE_ADD(CURDATE(), INTERVAL 9 DAY)";
$statement = $this->connection->connect()->query($query);
return $statement->rowCount() > 0;
}
protected function runGetUF(): string
{
$command = "/code/bin/console money:uf:get";
$result = shell_exec($command);
if (!$result or $result === null) {
throw new \Exception();
}
return $result;
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace App\Contract;
use App\Definition\Contract;
use App\Service\Auth as AuthService;
class Auth
{
use Contract;
protected static function newInstance()
{
return new AuthService();
}
public static function __callStatic($name, $params)
{
if (!method_exists(Response::class, $name)) {
$instance = self::getInstance();
if (method_exists($instance, $name)) {
return call_user_func_array([$instance, $name], $params);
}
return null;
}
return call_user_func_array([self, $name], $params);
}
}
?>

View File

@ -0,0 +1,27 @@
<?php
namespace App\Contract;
use App\Definition\Contract;
use App\Service\Route as RouteService;
class Route
{
use Contract;
protected static function newInstance()
{
return new RouteService();
}
public static function __callStatic($name, $params)
{
if (!method_exists(Response::class, $name)) {
$instance = self::getInstance();
if (method_exists($instance, $name)) {
return call_user_func_array([$instance, $name], $params);
}
return null;
}
return call_user_func_array([self, $name], $params);
}
}
?>

View File

@ -0,0 +1,41 @@
<?php
namespace App\Controller\API;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
use Incoviba\old\Proyecto\Proyecto;
class Unidades {
public function no_reservadas(Request $request, Response $response, $id_proyecto, $id_tipo) {
$proyecto = model(Proyecto::class)->findOne($id_proyecto);
if (!$proyecto) {
throw new \InvalidArgumentException('Proyecto identificado por ' . $id_proyecto . ' no existe.');
}
$unidades = $proyecto->unidades($id_tipo);
$unidades = array_filter($unidades, function($item) {
return !$item->isVendida() and !$item->isReservada();
});
$unidades = array_map(function($item) {
return $item->asArray();
}, $unidades);
usort($unidades, function($a, $b) {
$ap = strpos($a['descripcion'], ' ');
$ad = $a['descripcion'];
if ($ap != false) {
$ad = substr($ad, 0, $ap);
}
$bd = $b['descripcion'];
$bp = strpos($b['descripcion'], ' ');
if ($bp != false) {
$bd = substr($bd, 0, $bp);
}
return strcmp(
str_pad($ad, 4, '0', \STR_PAD_LEFT),
str_pad($bd, 4, '0', \STR_PAD_LEFT)
);
});
$output = array_values($unidades);
$response->getBody()->write(\json_encode($output));
return $response->withHeader('Content-Type', 'application/json');
}
}

View File

@ -0,0 +1,59 @@
<?php
namespace App\Controller;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Slim\Views\Blade as View;
use App\Contract\Auth as sAuth;
class Auth
{
public function login(ServerRequestInterface $request, ResponseInterface $response, View $view): ResponseInterface
{
return $view->render($response, 'auth.login');
}
public function do_login(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface
{
$post = $request->getParsedBody();
$name = $post['name'];
$password = $post['password'];
$bool = sAuth::login($name, $password);
if ($bool) {
return $response->withStatus(301)->withHeader('Location', '/');
}
return $response->withStatus(301)->withHeader('Location', '/auth/login');
}
public function logout(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface
{
sAuth::logout();
return $response
->withStatus(301)
->withHeader('Location', '/');
}
public function check_pass(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface
{
if (\password_verify(post('password'), sAuth::User()->password)) {
$response->getBody()->write('OK');
} else {
$response->getBody()->write('KO');
}
return $response;
}
public function change_pass(ServerRequestInterface $request, ResponseInterface $response, View $view): ResponseInterface
{
return $view->render($response, 'auth.change_pass');
}
public function do_change_pass(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface
{
$post = $request->getParsedBody();
if (\password_verify($post['old'], sAuth::User()->password)) {
if ($post['new'] == $post['new2']) {
$user = sAuth::User();
$user->password($post['new']);
$user->save();
return $response->withStatus(301)->withHeader('Location', '/');
}
}
return $response->withStatus(301)->withHeader('Location', '/auth/change_pass');
}
}

View File

@ -0,0 +1,67 @@
<?php
namespace App\Controller;
use App\Definition\Controller;
use Incoviba\old\Venta\Venta;
use Incoviba\old\Venta\BonoPie;
use Incoviba\old\Venta\Pago;
class Bonos
{
use Controller;
public static function add()
{
$id_venta = get('venta');
$venta = model(Venta::class)->findOne($id_venta);
return view('ventas.bonos.add', compact('venta'));
}
public static function do_add()
{
$id_venta = get('venta');
$venta = model(Venta::class)->findOne($id_venta);
if ($venta->bono_pie != 0) {
header('Location: ' . nUrl('ventas', 'show', ['venta' => $venta->id]));
return;
}
$uf = uf($venta->fecha());
$valor = post('valor');
$data = [
'fecha' => $venta->fecha,
'valor' => $valor * $uf->uf->value,
'tipo' => 8,
'uf' => $uf->uf->value
];
$pago = model(Pago::class)->create($data);
$pago->save();
$data = [
'valor' => $valor,
'pago' => $pago->id
];
$bono = model(BonoPie::class)->create($data);
$bono->save();
$venta->bono_pie = $bono->id;
$venta->save();
header('Location: ' . nUrl('ventas', 'show', ['venta' => $venta->id]));
}
public static function edit()
{
$id_venta = get('venta');
$venta = model(Venta::class)->findOne($id_venta);
return view('ventas.bonos.edit', compact('venta'));
}
public static function do_edit()
{
$id_venta = get('venta');
$venta = model(Venta::class)->findOne($id_venta);
$bono = $venta->bonoPie();
$valor = post('valor') * $bono->pago()->uf();
$pago = $bono->pago();
if ($valor != $bono->pago()->valor()) {
$pago->valor = $valor;
$pago->save();
}
header('Location: ' . nUrl('ventas', 'show', ['venta' => $venta->id]));
exit();
}
}

View File

@ -0,0 +1,428 @@
<?php
namespace App\Controller;
use Carbon\Carbon;
use App\Definition\Controller;
use App\Service\Borrador;
use App\Service\Factory;
use Incoviba\old\Common\Direccion;
use Incoviba\old\Common\Region;
use Incoviba\old\Proyecto\Agente;
use Incoviba\old\Proyecto\Proyecto;
use Incoviba\old\Venta\Propietario;
use Incoviba\old\Venta\Unidad;
use Incoviba\old\Venta\Cierre;
use Incoviba\old\Venta\EstadoCierre;
use Incoviba\nuevo\Venta\Precio;
use Incoviba\nuevo\Venta\Reserva;
use Incoviba\old\Venta\TipoEstadoCierre;
use Incoviba\old\Venta\TipoValorCierre;
use Incoviba\nuevo\Venta\UnidadReserva;
use Incoviba\old\Venta\Unidad as U;
class Cierres
{
use Controller;
public static function add()
{
$proyectos = model(Proyecto::class)
->select('proyecto.*')
->join('estado_proyecto', ['estado.proyecto', '=', 'proyecto.id'], 'estado')
->join('tipo_estado_proyecto', ['tipo.id', '=', 'estado.estado'], 'tipo')
->join('etapa_proyecto', ['etapa.id', '=', 'tipo.etapa'], 'etapa')
->whereGte('etapa.orden', 3)
->orderByAsc('proyecto.descripcion')
->groupBy('proyecto.id')
->findMany();
$regiones = model(Region::class)->order_by_asc('numeracion')->findMany();
return view('ventas.cierres.add', compact('proyectos', 'regiones'));
}
public static function agregar()
{
$f = Carbon::createFromDate(post('year'), post('month'), post('day'), config('app.timezone'));
$id_proyecto = post('proyecto');
$proyecto = model(Proyecto::class)->findOne($id_proyecto);
$id_agente = post('agente');
$agente = model(Agente::class)->findOne($id_agente);
$direccion = model(Direccion::class)
->where('calle', post('calle'))
->where('numero', post('numero'))
->where('extra', post('extra'))
->where('comuna', post('comuna'))
->findOne();
if (!$direccion) {
$data = [
'calle' => post('calle'),
'numero' => post('numero'),
'extra' => post('extra'),
'comuna' => post('comuna')
];
$direccion = model(Direccion::class)->create($data);
$direccion->save();
}
list($rut, $dv) = explode('-', str_replace('.', '', post('rut')));
$propietario = model(Propietario::class)->findOne($rut);
if (!$propietario) {
$data = [
'rut' => $rut,
'dv' => $dv,
'nombres' => trim(post('nombres')),
'apellido_paterno' => post('paterno'),
'apellido_materno' => post('materno'),
'sexo' => post('sexo'),
'estado_civil' => post('estado_civil'),
'profesion' => post('profesion'),
'direccion' => $direccion->id,
'telefono' => post('codigo_telefono') . post('telefono'),
'email' => post('email') . '@' . post('email_domain'),
'representante' => 0,
'otro' => 0
];
$propietario = model(Propietario::class)->create($data);
$propietario->save();
}
$unis = json_decode(post('unidades'));
$id_principal = array_shift($unis);
$unidad = model(Unidad::class)->findOne(post('unidad' . $id_principal));
$u = model(U::class)->findOne($unidad->id);
if (!$u) {
$unidad->save();
}
$data = [
'unidad_id' => $unidad->id
];
$reserva = model(Reserva::class)->create($data);
$reserva->save();
foreach ($unis as $id_unidad) {
$unidad = model(Unidad::class)->findOne(post('unidad' . $id_unidad));
$data = [
'reserva_id' => $reserva->id,
'unidad_id' => $unidad->id
];
$ur = model(UnidadReserva::class)->create($data);
$ur->save();
}
$data = [
'proyecto_id' => $proyecto->id,
'agente_id' => $agente->id,
'propietario_rut' => $propietario->rut,
'reserva_id' => $reserva->id,
'fecha' => $f->format('Y-m-d'),
'valor' => correctNumber(post('valor')),
'pie' => correctNumber(post('pie')),
'credito' => correctNumber(post('credito')),
'estado' => 1
];
$cierre = model(Cierre::class)->create($data);
$cierre->save();
header('Location: ' . url('', ['p' => 'cierres', 'a' => 'list']));
}
public static function list()
{
$proyectos = Cierre::proyectos();
return view('ventas.cierres.list', compact('proyectos'));
}
public static function show()
{
$id = get('cierre');
$cierre = model(Cierre::class)->findOne($id);
return view('ventas.cierres.show', compact('cierre'));
}
public static function guardar()
{
$proyecto = \model(Proyecto::class)->findOne(post('proyecto'));
$fecha = Carbon::createFromDate(post('year'), post('month'), post('day'), config('app.timezone'));
$unidad = \model(Unidad::class)->findOne(post('departamento'));
$relacionado = (post('relacionado') === true) ? true : false;
$subrelacionado = (post('subrelacionado') === true) ? true : false;
$precio = (float) post('precio') ?: 0;
$input = [
'proyecto' => $proyecto,
'fecha' => $fecha,
'departamento' => $unidad,
'precio' => $precio,
'relacionado' => $relacionado,
'subrelacionado' => $subrelacionado,
'unidades' => [],
'pie' => (float) post('pie')
];
$ebs = 0;
if (post('unidades') != '') {
$unidades = json_decode(html_entity_decode(post('unidades')), true);
foreach ($unidades as $un) {
$u = \model(Unidad::class)->findOne($un);
$input['unidades'] []= $u;
if ($u->precio($fecha) !== false) {
$ebs += $u->precio($fecha)->valor;
}
}
}
$promo = 0;
if (post('promocion') != null) {
$promo = (float) post('promocion');
$input['promocion'] = $promo;
}
$bono = 0;
if (post('bono') != null) {
$bono = (float) post('bono');
$input['bono'] = $bono;
}
$operador = 0;
if (post('operador') != null) {
$operador = ($precio - $bono - $promo) * (float) post('operador') / 100;
$input['operador'] = $operador;
}
$cierre = Cierre::find($proyecto, $unidad, $precio)->findOne();
if ($cierre === false) {
$cierre = model(Cierre::class)->create();
$cierre->guardar((object) $input);
}
$output = ['status' => 'ok', 'cierre' => $cierre->asArray()];
return json_encode($output);
}
public static function aprobar()
{
$fecha = Carbon::today(config('app.timezone'));
$cierre = model(Cierre::class)->findOne(post('cierre'));
if ($cierre->estado()->tipo()->descripcion == "revisado" or $cierre->estado()->tipo()->descripcion == "rechazado") {
$cierre->aprobar($fecha);
return json_encode(['estado' => 'aprobado']);
}
return json_encode(['estado' => 'no vigente']);
}
public static function rechazar()
{
$fecha = Carbon::today(config('app.timezone'));
$cierre = model(Cierre::class)->findOne(post('cierre'));
if ($cierre->estado()->tipo()->vigente == 1) {
$cierre->rechazar($fecha);
return json_encode(['estado' => 'rechazado']);
}
return json_encode(['estado' => 'no vigente']);
}
public static function abandonar()
{
$id = get('cierre');
$cierre = model(Cierre::class)->findOne($id);
$tipo = model(TipoEstadoCierre::class)->where('descripcion', 'abandonado')->findOne();
$today = Carbon::today(config('app.timezone'));
$data = [
'cierre' => $cierre->id,
'tipo' => $tipo->id,
'fecha' => $today->format('Y-m-d')
];
$estado = model(EstadoCierre::class)->create($data);
$estado->save();
header('Location: ' . url('', ['p' => 'cierres', 'a' => 'list']));
}
public static function promesar()
{
$id = get('cierre');
$cierre = model(Cierre::class)->findOne($id);
$tipo = model(TipoEstadoCierre::class)->where('descripcion', 'promesado')->findOne();
$today = Carbon::today(config('app.timezone'));
$data = [
'cierre' => $cierre->id,
'tipo' => $tipo->id,
'fecha' => $today->format('Y-m-d')
];
$estado = model(EstadoCierre::class)->create($data);
$estado->save();
header('Location: ' . url('', ['p' => 'cierres', 'a' => 'show', 'cierre' => $cierre->id]));
}
public static function borrador()
{
$id = get('cierre');
$cierre = model(Cierre::class)->findOne($id);
$borrador = new Borrador($cierre);
d($borrador->show());
$borrador->create();
}
public static function evalue()
{
$proyectos = \model(Proyecto::class)->orderByAsc('descripcion')->findMany();
return view('ventas.cierres.evaluar', ['proyectos' => $proyectos, 'locations' => config('locations')]);
}
public static function evaluar()
{
$proyecto = \model(Proyecto::class)->findOne(post('proyecto'));
$fecha = Carbon::createFromDate(post('year'), post('month'), post('day'), config('app.timezone'));
$unidad = \model(Unidad::class)->findOne(post('departamento'));
$relacionado = (post('relacionado') === 'true') ? true : false;
$subrelacionado = (post('subrelacionado') === 'true') ? true : false;
$precio = (float) post('precio') ?: 0;
$neto = $precio;
$ebs = 0;
if (post('unidades') != '') {
$unidades = json_decode(html_entity_decode(post('unidades')), true);
foreach ($unidades as $un) {
$u = \model(Unidad::class)->findOne($un);
if ($u->precio($fecha) !== false) {
$ebs += $u->precio($fecha)->valor;
}
}
}
$promocion = 0;
if (post('promocion') != null) {
$promocion = (float) post('promocion');
}
$bono = 0;
if (post('bono') != null) {
$bono = (float) post('bono');
}
$operador = 0;
if (post('operador') != null) {
$operador = ($precio - $bono - $promocion) * (float) post('operador') / 100;
}
$rel = 0;
if ($relacionado) {
$rel = ($unidad->precio($fecha)->valor) * 6 / 100;
}
if ($subrelacionado) {
$rel = ($unidad->precio($fecha)->valor) * 3 / 100;
}
$neto = $precio - $bono - $promocion - $operador - $ebs;
$output = [
'unidad' => [
'tipo' => [
'nombre' => $unidad->tipologia()->nombre,
'tipologia' => $unidad->tipologia()->tipologia()->descripcion
],
'superficie' => format('m2', $unidad->m2()) . ' m&#0178;'
],
'oferta' => [
'bruto' => format('ufs', $precio, null, true),
'neto' => format('ufs', $neto, null, true),
'uf_m2' => format('ufs', $neto / $unidad->m2('vendible'), null, true) . '/m&#0178;',
'fecha' => format('shortDate', $unidad->precio($fecha)->inicio()->fecha())
],
'lista' => [
'precio' => format('ufs', $unidad->precio($fecha)->valor, null, true),
'uf_m2' => format('ufs', $unidad->precio($fecha)->valor / $unidad->m2('vendible'), null, true) . '/m&#0178;'
],
'precios' => [
'bruto' => format('ufs', $precio, null, true),
'neto' => format('ufs', $neto, null, true),
'departamento' => format('ufs', $unidad->precio($fecha)->valor, null, true),
'relacionado' => format('ufs', $unidad->precio($fecha)->valor - $rel, null, true),
'fecha' => format('shortDate', $unidad->precio($fecha)->inicio()->fecha())
],
'uf_m2' => [
'neto' => format('ufs', $neto / $unidad->m2('vendible'), null, true) . '/m&#0178;',
'departamento' => format('ufs', $unidad->precio($fecha)->valor / $unidad->m2('vendible'), null, true) . '/m&#0178;',
'relacionado' => format('ufs', ($unidad->precio($fecha)->valor - $rel) / $unidad->m2('vendible'), null, true) . '/&#0178;'
],
'evaluacion' => Cierre::evaluar($neto, $unidad, $fecha, $rel),
'estado' => ['id' => 0, 'descripcion' => 'no existe']
];
if ($rel > 0) {
$output ['relacionado'] = [
'precio' => format('ufs', $unidad->precio($fecha)->valor - $rel, null, true),
'uf_m2' => format('ufs', ($unidad->precio($fecha)->valor - $rel) / $unidad->m2('vendible'), null, true) . '/&#0178;'
];
}
$estado = Cierre::find($proyecto, $unidad, $precio)->findOne();
if ($estado) {
$output['estado'] = [
'id' => $estado->estado()->tipo()->id,
'cierre' => $estado->id,
'descripcion' => $estado->estado()->tipo()->descripcion,
'fecha' => format('shortDate', $estado->estado()->fecha)
];
}
return json_encode($output);
}
public static function edit()
{
$cierre = model(Cierre::class)->findOne(get('cierre'));
$proyectos = model(Proyecto::class)->findMany();
$regiones = model(Region::class)->findMany();
$valores = model(TipoValorCierre::class)->findMany();
return view('ventas.cierres.edit', compact('cierre', 'proyectos', 'regiones', 'valores'));
}
public static function do_edit()
{
$cierre = model(Cierre::class)->findOne(get('cierre'));
$data = [
'calle' => post('calle'),
'numero' => post('numero'),
'extra' => post('extra'),
'comuna' => post('comuna')
];
$direccion = (new Factory(Direccion::class))->where($data)->find();
if (!$direccion) {
$direccion = model(Direccion::class)->create($data);
$direccion->save();
}
if (post('rut') != '') {
$data = [
'rut' => explode('-', str_replace('.', '', post('rut')))[0],
];
$propietario = (new Factory(Propietario::class))->where($data)->find();
if (!$propietario) {
$data = array_merge($data, [
'nombres' => post('nombres'),
'apellido_paterno' => post('paterno'),
'apellido_materno' => post('materno'),
'dv' => (post('rut')) ? explode('-', str_replace('.', '', post('rut')))[1] : '',
'sexo' => post('sexo'),
'estado_civil' => post('estado_civil'),
'profesion' => post('profesion'),
'telefono' => post('codigo_telefono') . post('telefono'),
'email' => post('email') . '@' . post('email_domain'),
'direccion' => $direccion->id
]);
$propietario = model(Propietario::class)->create($data);
$propietario->save();
}
}
$f = Carbon::createFromDate(post('year'), post('month'), post('day'), config('app.timezone'));
$data = [
'proyecto' => post('proyecto'),
'precio' => post('precio'),
'fecha' => $f->format('Y-m-d'),
'relacionado' => (post('relacionado')) ? 1 : 0,
'propietario' => (isset($propietario) and $propietario) ? $propietario->rut : 0
];
foreach ($data as $field => $value) {
if ($value != $cierre->$field) {
$cierre->$field = $value;
}
}
$cierre->save();
$valores = model(TipoValorCierre::class)->findMany();
foreach ($valores as $valor) {
if (post($valor->descripcion) == '') {
continue;
}
if ($cierre->valor($valor->descripcion)) {
if ($cierre->valor($valor->descripcion)->valor != post($valor->descripcion)) {
$v = $cierre->valor($valor->descripcion);
$v->valor = post($valor->descripcion);
$v->save();
}
continue;
}
$data = [
'tipo' => $valor->descripcion,
'valor' => post($valor->descripcion)
];
$cierre->addValor($data);
}
header('Location: ' . nUrl('cierres', 'show', ['cierre' => $cierre->id]));
}
}
?>

Some files were not shown because too many files have changed in this diff Show More