Compare commits
309 Commits
2.2.0
...
feature/ma
Author | SHA1 | Date | |
---|---|---|---|
47679cd4e4 | |||
0f8db5a3f8 | |||
c38e89d3f1 | |||
307f2ac7d7 | |||
ba57cad514 | |||
86d030bb71 | |||
3b38b5d349 | |||
28fb96db6a | |||
af4dec77d1 | |||
df7f462ead | |||
68e436cd67 | |||
6d1782cac6 | |||
74a2cf7303 | |||
4d6a1827a3 | |||
fd6577c984 | |||
62ccdc9518 | |||
e7da0d5d00 | |||
e445298159 | |||
5740c0e47f | |||
61244f783a | |||
621da92b68 | |||
5914176b8f | |||
5054d8f19b | |||
e4e952e842 | |||
8f16f33a1e | |||
d165440483 | |||
1720f6854b | |||
3e6452a44d | |||
d02732b0dd | |||
ecec1dd8df | |||
c1528d667a | |||
894d09ea6f | |||
ab3c8da4f6 | |||
760e1782d0 | |||
b8af053c43 | |||
fd6d61ec21 | |||
0c0fbab585 | |||
2c3f2d3f92 | |||
15e0ff80f3 | |||
8116e012e7 | |||
38e1b00971 | |||
7b63cbc757 | |||
8b386b8b44 | |||
9f56604917 | |||
4073b96796 | |||
59a28a353b | |||
71615050f3 | |||
5f31b6857e | |||
ef46558040 | |||
079fd3bc74 | |||
a5572e7c6a | |||
e031fd22d3 | |||
d74beb5518 | |||
055bf6ab20 | |||
45e9487b5c | |||
bf054c22c2 | |||
16100f622e | |||
5f31bff6e5 | |||
7578775fed | |||
2579b0aa06 | |||
3262ef9a62 | |||
44ea8acd39 | |||
0870623236 | |||
87bd89d223 | |||
728207d63d | |||
604c49c99d | |||
ce9078328a | |||
713fcc6ab8 | |||
dfbfbd2908 | |||
8b8aa79b6d | |||
e2d670a38c | |||
4d85b39cab | |||
33c90f06dd | |||
3771af0282 | |||
574918f1cc | |||
e128152b5f | |||
fc1371f0ed | |||
ec36c4a7a3 | |||
2c1be63257 | |||
6aca90c02f | |||
a8bab175a2 | |||
95f9f4ef05 | |||
2d868cb119 | |||
d3df35daff | |||
fdb9dcf9be | |||
2ab3c25e96 | |||
46cdf74c52 | |||
d6b735f2aa | |||
70710b24c5 | |||
57fc6fa46e | |||
dafabdbbdb | |||
34cb8bf0be | |||
0e049adc98 | |||
e2284314bd | |||
c4b9ca5ab7 | |||
e1b6fc7394 | |||
fe74619482 | |||
0766cf7e94 | |||
fc575c3078 | |||
187b6f6f05 | |||
42e1dcdff7 | |||
5b44260245 | |||
b2c55c08ce | |||
1f0f25bbde | |||
9f302e712c | |||
2b1190202a | |||
acb1081190 | |||
606b99a0f9 | |||
44f32d9e5f | |||
f5add0b4c5 | |||
1d20d63294 | |||
39da754d8b | |||
02fc372610 | |||
8aa1c787f4 | |||
8028b673fb | |||
52de72b507 | |||
f4b8634cb4 | |||
4f0a56c711 | |||
3ff5f3f1a6 | |||
151d1d0209 | |||
b13f8a5b20 | |||
1d268f9a94 | |||
a844589d7f | |||
83ea955d89 | |||
4392f61db9 | |||
a2352d79f9 | |||
56d3a26cff | |||
cc5c90e2c0 | |||
f9e079cc42 | |||
3f65a5dbd9 | |||
28036fdd05 | |||
54f3b95b88 | |||
1e2bd617fa | |||
62e7001fba | |||
bc8aa02236 | |||
5b30c0e36c | |||
da1fb26647 | |||
b1609465a9 | |||
cb2edb1543 | |||
1e1994264e | |||
f2cc0a8c47 | |||
e474123699 | |||
c3a99d5939 | |||
0212b3e405 | |||
e4ffcb52d8 | |||
37c28c3080 | |||
d154212732 | |||
be410daa8b | |||
38202d1382 | |||
1b99358597 | |||
6107861381 | |||
3d5799ae58 | |||
d649e03684 | |||
fc3d25dd18 | |||
532e0ec601 | |||
3e9f9a3fef | |||
d1b255aa8b | |||
93a0832800 | |||
4894809105 | |||
389e60980e | |||
fe6a01b2fb | |||
2b6a8b35a5 | |||
30a4d66be5 | |||
089579f39f | |||
63ea21f105 | |||
33409a18e3 | |||
2592794a49 | |||
196c5b947f | |||
b9c2972fe9 | |||
37015f7e95 | |||
c3b36dcdf7 | |||
c68b773cbb | |||
933e652dac | |||
ff1e9ebb53 | |||
599880ae27 | |||
a4da8d8624 | |||
87dfb0ae6e | |||
afbac7259a | |||
e2573f35d1 | |||
b8d4b260b6 | |||
ff06e70869 | |||
5e7326a4b6 | |||
26a227c8ae | |||
5defd2b564 | |||
74b15add36 | |||
d8d2cba308 | |||
5983a4b20f | |||
6e4dd8180e | |||
7447579ef0 | |||
ccd5b296f3 | |||
095c33e8aa | |||
4604a9af48 | |||
55d879274c | |||
85b529c22d | |||
3ba45c48f5 | |||
552a4c7aca | |||
2070987403 | |||
d9dab9c88d | |||
f9f133d3a9 | |||
f85af642d2 | |||
f3d9b58ffb | |||
8f682f7f13 | |||
26e626074a | |||
478b407646 | |||
7d210601da | |||
9563876b36 | |||
d9e27d5af7 | |||
936830ae64 | |||
e93149456a | |||
93a15ef1e4 | |||
6950413eec | |||
9162ed240e | |||
84861b5e57 | |||
43bb7a83c8 | |||
081187e3d3 | |||
b2f1bd5ba0 | |||
a471a1083e | |||
8e7f43e487 | |||
390e79ad6d | |||
6169089475 | |||
a7ce78a3fb | |||
6f023928e8 | |||
a4b7183de1 | |||
a428aeebe1 | |||
fc543729d2 | |||
8cec046d66 | |||
1f730fb7f3 | |||
964d8d4237 | |||
0d5c9efd68 | |||
d68eba5697 | |||
d5b9be0196 | |||
d0d99eaa81 | |||
15e9a54c7e | |||
b7e9a17586 | |||
61533b5a4c | |||
5864e7ee94 | |||
3fc7aa88dc | |||
1caa62500a | |||
27e88761e0 | |||
b27a6fab33 | |||
fa978728ce | |||
256a3d2459 | |||
f8f5796a66 | |||
0e0b783a80 | |||
a5125aff74 | |||
71bbe7f2d7 | |||
e2c68a14d1 | |||
5e51562aec | |||
7719a5c614 | |||
05b9a3ad8a | |||
665bed8553 | |||
9c024d1ef7 | |||
94d618b2a1 | |||
4786ee2552 | |||
39d8d4943e | |||
e63a3d0077 | |||
d580cc1a11 | |||
86034a6349 | |||
97ab5acf3e | |||
435180ebaf | |||
d2511901ec | |||
9388dc17fc | |||
a33dd341cd | |||
8e4b5eaaf8 | |||
91679b164f | |||
3c7e4b9ef4 | |||
20045c9a64 | |||
47d43f504d | |||
0502b8e735 | |||
905e8263bc | |||
8710c8a111 | |||
5d9ac2bc51 | |||
062e0543e4 | |||
b97916cfc4 | |||
7af9cafdb6 | |||
84a2fbd119 | |||
bc9c71870c | |||
912e8624b2 | |||
86406bf027 | |||
7b8d44e8c8 | |||
c10f2e5912 | |||
bef0a22758 | |||
092eb95f06 | |||
5f56022109 | |||
4b3397dd63 | |||
529f9e32a1 | |||
939adf126f | |||
63400af1db | |||
019974614c | |||
735c341729 | |||
444ff687fc | |||
f3a5fa2cdc | |||
2ed265dcf1 | |||
dbae630fdd | |||
d69976d015 | |||
2ccbc31ae0 | |||
e50d80560c | |||
7cc0333876 | |||
eb38236926 | |||
85ef4dd60e | |||
f1e29e3b0b | |||
6617a92f5f | |||
ca958b8a88 | |||
dc2e2c7f71 | |||
936fd2d1e1 | |||
7c6a397e31 | |||
7385225a2e | |||
9c335fd350 | |||
57f9169cc7 |
2
.gitignore
vendored
2
.gitignore
vendored
@ -10,3 +10,5 @@
|
||||
**/.idea/
|
||||
**/upload?/
|
||||
**/informe?/
|
||||
**/.phpunit.cache/
|
||||
**/coverage/
|
||||
|
@ -1,19 +1,22 @@
|
||||
FROM php:8.2-cli
|
||||
FROM php:8.4-cli
|
||||
|
||||
ENV TZ "${TZ}"
|
||||
ENV APP_NAME "${APP_NAME}"
|
||||
ENV API_URL "${API_URL}"
|
||||
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends cron rsyslog nano && rm -r /var/lib/apt/lists/*
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends cron rsyslog nano beanstalkd \
|
||||
&& rm -r /var/lib/apt/lists/*
|
||||
|
||||
RUN pecl install xdebug-3.2.2 \
|
||||
RUN pecl install xdebug-3.4.2 \
|
||||
&& docker-php-ext-enable xdebug \
|
||||
&& echo "#/bin/bash\nprintenv >> /etc/environment\ncron -f -L 11" > /root/entrypoint && chmod a+x /root/entrypoint
|
||||
&& echo $TZ > /etc/timezone
|
||||
|
||||
COPY --chmod=550 ./cli/start_command /root/start_command
|
||||
|
||||
COPY ./php-errors.ini /usr/local/etc/php/conf.d/docker-php-errors.ini
|
||||
COPY ./php-timezone.ini /usr/local/etc/php/conf.d/docker-php-timezone.ini
|
||||
|
||||
WORKDIR /code/bin
|
||||
|
||||
COPY --chmod=644 ./cli/crontab /var/spool/cron/crontabs/root
|
||||
|
||||
CMD [ "/root/entrypoint" ]
|
||||
CMD [ "/root/start_command" ]
|
||||
|
19
Dockerfile
19
Dockerfile
@ -1,14 +1,19 @@
|
||||
FROM php:8.1-fpm
|
||||
FROM php:8.4-fpm
|
||||
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends libzip-dev libicu-dev git libpng-dev unzip tzdata \
|
||||
&& rm -r /var/lib/apt/lists/*
|
||||
ENV TZ=America/Santiago
|
||||
|
||||
RUN docker-php-ext-install pdo pdo_mysql zip intl gd bcmath
|
||||
|
||||
RUN pecl install xdebug-3.1.3 \
|
||||
&& docker-php-ext-enable xdebug
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends libzip-dev libicu-dev git \
|
||||
libpng-dev unzip tzdata libxml2-dev beanstalkd \
|
||||
&& rm -r /var/lib/apt/lists/* \
|
||||
&& docker-php-ext-install pdo pdo_mysql zip intl gd bcmath dom \
|
||||
&& pecl install xdebug-3.4.2 \
|
||||
&& docker-php-ext-enable xdebug \
|
||||
&& echo $TZ > /etc/timezone
|
||||
|
||||
COPY ./php-errors.ini /usr/local/etc/php/conf.d/docker-php-errors.ini
|
||||
COPY ./php-xdebug.ini /usr/local/etc/php/conf.d/docker-php-xdebug.ini
|
||||
COPY ./php-memory.ini /usr/local/etc/php/conf.d/docker-php-memory.ini
|
||||
COPY ./php-timezone.ini /usr/local/etc/php/conf.d/docker-php-timezone.ini
|
||||
|
||||
COPY --from=composer /usr/bin/composer /usr/bin/composer
|
||||
|
||||
|
9
api.compose.yml
Normal file
9
api.compose.yml
Normal file
@ -0,0 +1,9 @@
|
||||
services:
|
||||
httpclient:
|
||||
profiles:
|
||||
- testing
|
||||
container_name: incoviba_client
|
||||
image: flawiddsouza/restfox
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "${HTTPCLIENT_PORT:-4004}:4004"
|
@ -1,11 +1,19 @@
|
||||
APP_URL=
|
||||
#ENVIRONMENT=
|
||||
|
||||
MYSQL_HOST=db
|
||||
APP_URL=
|
||||
|
||||
COOKIE_NAME=
|
||||
COOKIE_DOMAIN=
|
||||
COOKIE_PATH=/
|
||||
MAX_LOGIN_HOURS=120
|
||||
|
||||
REDIS_HOST=redis
|
||||
REDIS_PORT=6379
|
||||
#REDIS_HOST=redis
|
||||
#REDIS_PORT=6379
|
||||
|
||||
DB_HOST=db
|
||||
DB_DATABASE=incoviba
|
||||
DB_USER=incoviba
|
||||
DB_PASSWORD=
|
||||
|
||||
TOKU_URL=
|
||||
TOKU_TOKEN=
|
||||
|
2
app/.gitignore
vendored
Normal file
2
app/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
**/bin
|
||||
**/public/tests
|
14
app/.phpunit-watcher.yml
Normal file
14
app/.phpunit-watcher.yml
Normal file
@ -0,0 +1,14 @@
|
||||
watch:
|
||||
directories:
|
||||
- src
|
||||
- tests
|
||||
- common
|
||||
- resources
|
||||
fileMask: '*.php'
|
||||
notifications:
|
||||
passingTests: false
|
||||
failingTests: false
|
||||
hideManual: true
|
||||
phpunit:
|
||||
arguments: '--testsuite unit --log-events-text /logs/output.txt --stop-on-failure'
|
||||
timeout: 180
|
3
app/bin/console
Executable file
3
app/bin/console
Executable file
@ -0,0 +1,3 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
php -d auto_prepend_file=test.bootstrap.php -a
|
3
app/bin/integration_tests
Executable file
3
app/bin/integration_tests
Executable file
@ -0,0 +1,3 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
bin/phpunit --testsuite acceptance $@
|
3
app/bin/performance_tests
Executable file
3
app/bin/performance_tests
Executable file
@ -0,0 +1,3 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
bin/phpunit --testsuite performance $@
|
3
app/bin/unit_tests
Executable file
3
app/bin/unit_tests
Executable file
@ -0,0 +1,3 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
./bin/phpunit --testsuite unit $@
|
@ -1,9 +1,6 @@
|
||||
<?php
|
||||
namespace Incoviba\Common\Alias;
|
||||
|
||||
use Illuminate\Events\Dispatcher;
|
||||
use Slim\Views\Blade;
|
||||
|
||||
class View extends Blade
|
||||
{
|
||||
}
|
||||
class View extends Blade {}
|
||||
|
@ -5,6 +5,11 @@ use Psr\Http\Message\UploadedFileInterface;
|
||||
|
||||
interface Banco
|
||||
{
|
||||
/**
|
||||
* Process bank movements for database inserts
|
||||
* @param UploadedFileInterface $file
|
||||
* @return array
|
||||
*/
|
||||
public function process(UploadedFileInterface $file): array;
|
||||
|
||||
}
|
||||
|
@ -3,13 +3,42 @@ namespace Incoviba\Common\Define;
|
||||
|
||||
use PDO;
|
||||
use PDOStatement;
|
||||
use PDOException;
|
||||
|
||||
interface Connection
|
||||
{
|
||||
/**
|
||||
* @return Connection
|
||||
* @throws PDOException
|
||||
*/
|
||||
public function connect(): Connection;
|
||||
|
||||
/**
|
||||
* @param string $query
|
||||
* @return PDOStatement
|
||||
* @throws PDOException
|
||||
*/
|
||||
public function query(string $query): PDOStatement;
|
||||
|
||||
/**
|
||||
* @param string $query
|
||||
* @return PDOStatement
|
||||
* @throws PDOException
|
||||
*/
|
||||
public function prepare(string $query): PDOStatement;
|
||||
|
||||
/**
|
||||
* @param string $query
|
||||
* @param array|null $data
|
||||
* @return PDOStatement
|
||||
* @throws PDOException
|
||||
*/
|
||||
public function execute(string $query, ?array $data = null): PDOStatement;
|
||||
|
||||
/**
|
||||
* @return PDO
|
||||
* @throws PDOException
|
||||
*/
|
||||
public function getPDO(): PDO;
|
||||
public function getQueryBuilder(): Query\Builder;
|
||||
}
|
||||
|
@ -6,5 +6,5 @@ use Incoviba\Model;
|
||||
|
||||
interface Exporter
|
||||
{
|
||||
public function export(Model\Inmobiliaria $inmobiliaria, Model\Banco $banco, DateTimeInterface $mes, array $movimientos): string;
|
||||
public function export(Model\Inmobiliaria $inmobiliaria, Model\Contabilidad\Banco $banco, DateTimeInterface $mes, array $movimientos): string;
|
||||
}
|
||||
|
@ -2,8 +2,15 @@
|
||||
namespace Incoviba\Common\Define\Money;
|
||||
|
||||
use DateTimeInterface;
|
||||
use Incoviba\Common\Implement\Exception\EmptyResponse;
|
||||
|
||||
interface Provider
|
||||
{
|
||||
public function get(string $money_symbol, DateTimeInterface $dateTime): float;
|
||||
/**
|
||||
* @param string $money_symbol
|
||||
* @param ?DateTimeInterface $dateTime = null
|
||||
* @return float
|
||||
* @throws EmptyResponse
|
||||
*/
|
||||
public function get(string $money_symbol, ?DateTimeInterface $dateTime = null): float;
|
||||
}
|
||||
|
@ -1,11 +1,42 @@
|
||||
<?php
|
||||
namespace Incoviba\Common\Define;
|
||||
|
||||
use Incoviba\Common\Implement\Exception\EmptyResult;
|
||||
use PDOException;
|
||||
|
||||
interface Repository
|
||||
{
|
||||
/**
|
||||
* @param array|null $data
|
||||
* @return Model
|
||||
*/
|
||||
public function create(?array $data = null): Model;
|
||||
|
||||
/**
|
||||
* @param Model $model
|
||||
* @return Model
|
||||
* @throws PDOException
|
||||
*/
|
||||
public function save(Model $model): Model;
|
||||
|
||||
/**
|
||||
* @param array $data_row
|
||||
* @return Model
|
||||
*/
|
||||
public function load(array $data_row): Model;
|
||||
|
||||
/**
|
||||
* @param Model $model
|
||||
* @param array $new_data
|
||||
* @return Model
|
||||
* @throws EmptyResult
|
||||
*/
|
||||
public function edit(Model $model, array $new_data): Model;
|
||||
|
||||
/**
|
||||
* @param Model $model
|
||||
* @return void
|
||||
* @throws PDOException
|
||||
*/
|
||||
public function remove(Model $model): void;
|
||||
}
|
||||
|
@ -9,9 +9,55 @@ abstract class Banco extends Service implements Define\Cartola\Banco
|
||||
{
|
||||
public function process(UploadedFileInterface $file): array
|
||||
{
|
||||
$data = $this->parseFile($file);
|
||||
$filename = $this->processUploadedFile($file);
|
||||
$data = $this->processFile($filename);
|
||||
return $this->mapColumns($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* There are banks that need some post-processing
|
||||
* @param array $movimientos
|
||||
* @return array
|
||||
*/
|
||||
public function processMovimientosDiarios(array $movimientos): array
|
||||
{
|
||||
return $movimientos;
|
||||
}
|
||||
|
||||
/**
|
||||
* Move the UploadedFile into a temp file from getFilename
|
||||
* @param UploadedFileInterface $uploadedFile
|
||||
* @return string
|
||||
*/
|
||||
protected function processUploadedFile(UploadedFileInterface $uploadedFile): string
|
||||
{
|
||||
$filename = $this->getFilename($uploadedFile);
|
||||
$uploadedFile->moveTo($filename);
|
||||
return $filename;
|
||||
}
|
||||
|
||||
/**
|
||||
* Process the temp file from getFilename and remove it
|
||||
* @param string $filename
|
||||
* @return array
|
||||
*/
|
||||
protected function processFile(string $filename): array
|
||||
{
|
||||
$data = $this->parseFile($filename);
|
||||
unlink($filename);
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Map columns from uploaded file data to database columns
|
||||
* @param array $data
|
||||
* @return array
|
||||
*/
|
||||
protected function mapColumns(array $data): array
|
||||
{
|
||||
$temp = [];
|
||||
$columns = $this->columnMap();
|
||||
|
||||
foreach ($data as $row) {
|
||||
$r = [];
|
||||
foreach ($columns as $old => $new) {
|
||||
@ -24,11 +70,24 @@ abstract class Banco extends Service implements Define\Cartola\Banco
|
||||
}
|
||||
return $temp;
|
||||
}
|
||||
public function processMovimientosDiarios(array $movimientos): array
|
||||
{
|
||||
return $movimientos;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get filename where to move UploadedFile
|
||||
* @param UploadedFileInterface $uploadedFile
|
||||
* @return string
|
||||
*/
|
||||
abstract protected function getFilename(UploadedFileInterface $uploadedFile): string;
|
||||
|
||||
/**
|
||||
* Mapping of uploaded file data columns to database columns
|
||||
* @return array
|
||||
*/
|
||||
abstract protected function columnMap(): array;
|
||||
abstract protected function parseFile(UploadedFileInterface $uploadedFile): array;
|
||||
|
||||
/**
|
||||
* Translate uploaded file data to database data
|
||||
* @param string $filename
|
||||
* @return array
|
||||
*/
|
||||
abstract protected function parseFile(string $filename): array;
|
||||
}
|
||||
|
18
app/common/Ideal/LoggerEnabled.php
Normal file
18
app/common/Ideal/LoggerEnabled.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
namespace Incoviba\Common\Ideal;
|
||||
|
||||
use Psr\Log\LoggerAwareInterface;
|
||||
use Psr\Log\LoggerInterface;
|
||||
|
||||
abstract class LoggerEnabled implements LoggerAwareInterface
|
||||
{
|
||||
public LoggerInterface $logger;
|
||||
public function setLogger(LoggerInterface $logger): void
|
||||
{
|
||||
$this->logger = $logger;
|
||||
}
|
||||
public function getLogger(): LoggerInterface
|
||||
{
|
||||
return $this->logger;
|
||||
}
|
||||
}
|
@ -26,7 +26,13 @@ abstract class Model implements Define\Model
|
||||
public function jsonSerialize(): mixed
|
||||
{
|
||||
return [
|
||||
'id' => $this->id
|
||||
'id' => $this->id,
|
||||
...$this->jsonComplement()
|
||||
];
|
||||
}
|
||||
|
||||
protected function jsonComplement(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
@ -2,7 +2,9 @@
|
||||
namespace Incoviba\Common\Ideal;
|
||||
|
||||
use PDO;
|
||||
use PDOException;
|
||||
use ReflectionProperty;
|
||||
use ReflectionException;
|
||||
use Incoviba\Common\Define;
|
||||
use Incoviba\Common\Implement;
|
||||
use Incoviba\Common\Implement\Exception\EmptyResult;
|
||||
@ -22,10 +24,15 @@ abstract class Repository implements Define\Repository
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getConnection(): Define\Connection
|
||||
{
|
||||
return $this->connection;
|
||||
}
|
||||
|
||||
public function load(array $data_row): Define\Model
|
||||
{
|
||||
$model = $this->create($data_row);
|
||||
$model->{$this->getKey()} = $data_row[$this->getKey()];
|
||||
$this->setIndex($model, $data_row[$this->getKey()]);
|
||||
return $model;
|
||||
}
|
||||
|
||||
@ -34,9 +41,12 @@ abstract class Repository implements Define\Repository
|
||||
$query = $this->connection->getQueryBuilder()
|
||||
->delete()->from($this->getTable())
|
||||
->where("{$this->getKey()} = ?");
|
||||
$this->connection->execute($query, [$model->id]);
|
||||
$this->connection->execute($query, [$this->getIndex($model)]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws EmptyResult
|
||||
*/
|
||||
public function fetchById(int $id): Define\Model
|
||||
{
|
||||
$query = $this->connection->getQueryBuilder()
|
||||
@ -45,6 +55,10 @@ abstract class Repository implements Define\Repository
|
||||
->where("{$this->getKey()} = ?");
|
||||
return $this->fetchOne($query, [$id]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws EmptyResult
|
||||
*/
|
||||
public function fetchAll(null|string|array $ordering = null): array
|
||||
{
|
||||
$query = $this->connection->getQueryBuilder()
|
||||
@ -56,10 +70,27 @@ abstract class Repository implements Define\Repository
|
||||
return $this->fetchMany($query);
|
||||
}
|
||||
|
||||
protected string $key = 'id';
|
||||
public function setKey(string $key): Repository
|
||||
{
|
||||
$this->key = $key;
|
||||
return $this;
|
||||
}
|
||||
protected function getKey(): string
|
||||
{
|
||||
return 'id';
|
||||
return $this->key;
|
||||
}
|
||||
|
||||
protected function setIndex(Define\Model &$model, mixed $value): Repository
|
||||
{
|
||||
$model->{$this->getKey()} = $value;
|
||||
return $this;
|
||||
}
|
||||
protected function getIndex(Define\Model $model): mixed
|
||||
{
|
||||
return $model->id;
|
||||
}
|
||||
|
||||
protected function parseData(Define\Model $model, ?array $data, Implement\Repository\MapperParser $data_map): Define\Model
|
||||
{
|
||||
if ($data === null) {
|
||||
@ -92,9 +123,20 @@ abstract class Repository implements Define\Repository
|
||||
}
|
||||
$this->setDefault($model, $property);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Define\Model $model
|
||||
* @param string $property
|
||||
* @return void
|
||||
*/
|
||||
protected function setDefault(Define\Model &$model, string $property): void
|
||||
{
|
||||
$prop = new ReflectionProperty($model, $property);
|
||||
try {
|
||||
$prop = new ReflectionProperty($model, $property);
|
||||
} catch (ReflectionException) {
|
||||
$model->{$property} = null;
|
||||
return;
|
||||
}
|
||||
$type = $prop->getType()->getName();
|
||||
$value = match ($type) {
|
||||
'int' => 0,
|
||||
@ -104,6 +146,13 @@ abstract class Repository implements Define\Repository
|
||||
};
|
||||
$model->{$property} = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $columns
|
||||
* @param array $values
|
||||
* @return int
|
||||
* @throws PDOException
|
||||
*/
|
||||
protected function saveNew(array $columns, array $values): int
|
||||
{
|
||||
$query = $this->connection->getQueryBuilder()
|
||||
@ -114,6 +163,14 @@ abstract class Repository implements Define\Repository
|
||||
$this->connection->execute($query, $values);
|
||||
return $this->connection->getPDO()->lastInsertId();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Define\Model $model
|
||||
* @param array $columns
|
||||
* @param array $data
|
||||
* @return Define\Model
|
||||
* @throws EmptyResult
|
||||
*/
|
||||
protected function update(Define\Model $model, array $columns, array $data): Define\Model
|
||||
{
|
||||
$changes = [];
|
||||
@ -133,32 +190,68 @@ abstract class Repository implements Define\Repository
|
||||
->update($this->getTable())
|
||||
->set($columns_string)
|
||||
->where("{$this->getKey()} = ?");
|
||||
$values []= $model->{$this->getKey()};
|
||||
$this->connection->execute($query, $values);
|
||||
return $this->fetchById($model->{$this->getKey()});
|
||||
$values []= $this->getIndex($model);
|
||||
try {
|
||||
$this->connection->execute($query, $values);
|
||||
} catch (PDOException $exception) {
|
||||
throw new EmptyResult($query, $exception, $data);
|
||||
}
|
||||
return $this->fetchById($this->getIndex($model));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $query
|
||||
* @param array|null $data
|
||||
* @return Define\Model
|
||||
* @throws EmptyResult
|
||||
*/
|
||||
protected function fetchOne(string $query, ?array $data = null): Define\Model
|
||||
{
|
||||
$result = $this->connection->execute($query, $data)->fetch(PDO::FETCH_ASSOC);
|
||||
if ($result === false) {
|
||||
throw new EmptyResult($query);
|
||||
try {
|
||||
$result = $this->connection->execute($query, $data)->fetch(PDO::FETCH_ASSOC);
|
||||
if ($result === false) {
|
||||
throw new EmptyResult($query, null, $data);
|
||||
}
|
||||
} catch (PDOException $exception) {
|
||||
throw new EmptyResult($query, $exception, $data);
|
||||
}
|
||||
return $this->load($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $query
|
||||
* @param array|null $data
|
||||
* @return array
|
||||
* @throws EmptyResult
|
||||
*/
|
||||
protected function fetchMany(string $query, ?array $data = null): array
|
||||
{
|
||||
$results = $this->connection->execute($query, $data)->fetchAll(PDO::FETCH_ASSOC);
|
||||
if ($results === false) {
|
||||
throw new EmptyResult($query);
|
||||
try {
|
||||
$results = $this->connection->execute($query, $data)->fetchAll(PDO::FETCH_ASSOC);
|
||||
} catch (PDOException $exception) {
|
||||
throw new EmptyResult($query, $exception, $data);
|
||||
}
|
||||
return array_map([$this, 'load'], $results);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $query
|
||||
* @param array|null $data
|
||||
* @return array
|
||||
* @throws EmptyResult
|
||||
*/
|
||||
protected function fetchAsArray(string $query, ?array $data = null): array
|
||||
{
|
||||
$results = $this->connection->execute($query, $data)->fetchAll(PDO::FETCH_ASSOC);
|
||||
if ($results === false) {
|
||||
throw new EmptyResult($query);
|
||||
try {
|
||||
$results = $this->connection->execute($query, $data)->fetchAll(PDO::FETCH_ASSOC);
|
||||
} catch (PDOException $exception) {
|
||||
throw new EmptyResult($query, $exception, $data);
|
||||
}
|
||||
return $results;
|
||||
}
|
||||
|
||||
public function filterData(array $data): array
|
||||
{
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
|
56
app/common/Ideal/Service/API.php
Normal file
56
app/common/Ideal/Service/API.php
Normal file
@ -0,0 +1,56 @@
|
||||
<?php
|
||||
namespace Incoviba\Common\Ideal\Service;
|
||||
|
||||
use Psr\Log\LoggerInterface;
|
||||
use Incoviba\Common\Define;
|
||||
use Incoviba\Common\Ideal;
|
||||
use Incoviba\Exception\ServiceAction;
|
||||
|
||||
abstract class API extends Ideal\Service
|
||||
{
|
||||
public function __construct(LoggerInterface $logger)
|
||||
{
|
||||
parent::__construct($logger);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string|array|null $order
|
||||
* @return array
|
||||
*/
|
||||
abstract public function getAll(null|string|array $order = null): array;
|
||||
|
||||
/**
|
||||
* @param int $id
|
||||
* @return Define\Model
|
||||
* @throws ServiceAction\Read
|
||||
*/
|
||||
abstract public function get(int $id): Define\Model;
|
||||
|
||||
/**
|
||||
* @param array $data
|
||||
* @return Define\Model
|
||||
* @throws ServiceAction\Create
|
||||
*/
|
||||
abstract public function add(array $data): Define\Model;
|
||||
|
||||
/**
|
||||
* @param Define\Model $model
|
||||
* @param array $new_data
|
||||
* @return Define\Model
|
||||
* @throws ServiceAction\Update
|
||||
*/
|
||||
abstract public function edit(Define\Model $model, array $new_data): Define\Model;
|
||||
|
||||
/**
|
||||
* @param int $id
|
||||
* @return Define\Model
|
||||
* @throws ServiceAction\Delete
|
||||
*/
|
||||
abstract public function delete(int $id): Define\Model;
|
||||
|
||||
/**
|
||||
* @param Define\Model $model
|
||||
* @return Define\Model
|
||||
*/
|
||||
abstract protected function process(Define\Model $model): Define\Model;
|
||||
}
|
10
app/common/Ideal/Service/Repository.php
Normal file
10
app/common/Ideal/Service/Repository.php
Normal file
@ -0,0 +1,10 @@
|
||||
<?php
|
||||
namespace Incoviba\Common\Ideal\Service;
|
||||
|
||||
use Incoviba\Common\Define;
|
||||
use Incoviba\Common\Ideal;
|
||||
|
||||
abstract class Repository extends Ideal\Service
|
||||
{
|
||||
abstract public function getRepository(): Define\Repository;
|
||||
}
|
@ -22,6 +22,7 @@ class Connection implements Define\Connection
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getPDO(): PDO
|
||||
{
|
||||
$this->connect();
|
||||
|
@ -81,6 +81,9 @@ class Insert extends Ideal\Query implements Define\Query\Insert
|
||||
if ($value === (int) $value) {
|
||||
return $value;
|
||||
}
|
||||
if (str_starts_with($value, ':')) {
|
||||
return $value;
|
||||
}
|
||||
return "'{$value}'";
|
||||
}, $this->values)) . ')';
|
||||
}
|
||||
|
@ -64,10 +64,10 @@ class Select extends Ideal\Query implements Define\Query\Select
|
||||
public function having(array|string $conditions): Select
|
||||
{
|
||||
if (is_string($conditions)) {
|
||||
return $this->addCondition($conditions);
|
||||
return $this->addHaving($conditions);
|
||||
}
|
||||
foreach ($conditions as $condition) {
|
||||
$this->addCondition($condition);
|
||||
$this->addHaving($condition);
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
@ -126,7 +126,7 @@ class Select extends Ideal\Query implements Define\Query\Select
|
||||
}
|
||||
protected function addCondition(string $condition): Select
|
||||
{
|
||||
if (!isset($this->coditions)) {
|
||||
if (!isset($this->conditions)) {
|
||||
$this->conditions = [];
|
||||
}
|
||||
$this->conditions []= $condition;
|
||||
|
@ -6,10 +6,15 @@ use Throwable;
|
||||
|
||||
class EmptyResult extends Exception
|
||||
{
|
||||
public function __construct(string $query, ?Throwable $previous = null)
|
||||
public function __construct(public string $query, ?Throwable $previous = null, protected ?array $data = null)
|
||||
{
|
||||
$message = "Empty results for {$query}";
|
||||
$code = 700;
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
|
||||
public function getData(): ?array
|
||||
{
|
||||
return $this->data;
|
||||
}
|
||||
}
|
||||
|
13
app/common/Implement/Exception/HttpException.php
Normal file
13
app/common/Implement/Exception/HttpException.php
Normal file
@ -0,0 +1,13 @@
|
||||
<?php
|
||||
namespace Incoviba\Common\Implement\Exception;
|
||||
|
||||
use Throwable;
|
||||
use Exception;
|
||||
|
||||
class HttpException extends Exception
|
||||
{
|
||||
public function __construct(string $message = "", int $code = 0, ?Throwable $previous = null)
|
||||
{
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
}
|
19
app/common/Implement/Exception/HttpResponse.php
Normal file
19
app/common/Implement/Exception/HttpResponse.php
Normal file
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
namespace Incoviba\Common\Implement\Exception;
|
||||
|
||||
use Throwable;
|
||||
use Exception;
|
||||
|
||||
class HttpResponse extends Exception
|
||||
{
|
||||
public function __construct($reason = "", $message = "", $code = 0, Throwable $previous = null)
|
||||
{
|
||||
$this->reason = "HTTP Reason: {$reason}";
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
protected string $reason;
|
||||
public function getReason(): string
|
||||
{
|
||||
return $this->reason;
|
||||
}
|
||||
}
|
48
app/common/Implement/Log/Formatter/PDO.php
Normal file
48
app/common/Implement/Log/Formatter/PDO.php
Normal file
@ -0,0 +1,48 @@
|
||||
<?php
|
||||
namespace Incoviba\Common\Implement\Log\Formatter;
|
||||
|
||||
use Throwable;
|
||||
use Monolog\Formatter\JsonFormatter;
|
||||
use Monolog\LogRecord;
|
||||
|
||||
class PDO extends JsonFormatter
|
||||
{
|
||||
public function __construct(int $batchMode = self::BATCH_MODE_JSON, bool $appendNewline = false, bool $ignoreEmptyContextAndExtra = false, bool $includeStacktraces = true)
|
||||
{
|
||||
parent::__construct($batchMode, $appendNewline, $ignoreEmptyContextAndExtra, $includeStacktraces);
|
||||
}
|
||||
|
||||
public function format(LogRecord $record): string
|
||||
{
|
||||
if (is_a($record->message, Throwable::class)) {
|
||||
$exception = $record->message;
|
||||
$message = $this->normalizeException($exception);
|
||||
$context = $record->context;
|
||||
$context['exception'] = $exception;
|
||||
if ($exception->getPrevious()) {
|
||||
$context['previous'] = $this->walkException($exception);
|
||||
}
|
||||
$new_record = new LogRecord(
|
||||
$record->datetime,
|
||||
$record->channel,
|
||||
$record->level,
|
||||
json_encode($message),
|
||||
$context,
|
||||
$record->extra
|
||||
);
|
||||
$record = $new_record;
|
||||
}
|
||||
$normalized = $this->normalize($record, $this->maxNormalizeDepth);
|
||||
return $normalized['message'];
|
||||
}
|
||||
|
||||
protected function walkException(Throwable $exception, int $depth = 0): array
|
||||
{
|
||||
$output = [];
|
||||
$currentDepth = $depth;
|
||||
while ($previous = $exception->getPrevious() and $currentDepth < $this->maxNormalizeDepth) {
|
||||
$output []= $this->normalizeException($previous);
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
}
|
72
app/common/Implement/Log/Handler/MySQL.php
Normal file
72
app/common/Implement/Log/Handler/MySQL.php
Normal file
@ -0,0 +1,72 @@
|
||||
<?php
|
||||
namespace Incoviba\Common\Implement\Log\Handler;
|
||||
|
||||
use Incoviba\Common\Define\Connection;
|
||||
use Monolog\Handler\AbstractProcessingHandler;
|
||||
use Monolog\Level;
|
||||
use Monolog\LogRecord;
|
||||
use PDOStatement;
|
||||
|
||||
class MySQL extends AbstractProcessingHandler
|
||||
{
|
||||
private bool $initialized = false;
|
||||
private PDOStatement $statement;
|
||||
|
||||
public function __construct(protected Connection $connection, protected int $retainDays = 90, int|string|Level $level = Level::Debug, bool $bubble = true)
|
||||
{
|
||||
parent::__construct($level, $bubble);
|
||||
}
|
||||
public function write(LogRecord $record): void
|
||||
{
|
||||
if (!$this->initialized) {
|
||||
if (!$this->checkTableExists()) {
|
||||
$this->createTable();
|
||||
}
|
||||
$this->cleanup();
|
||||
$this->initialized();
|
||||
}
|
||||
$this->statement->execute([
|
||||
'channel' => $record->channel,
|
||||
'level' => $record->level->getName(),
|
||||
'message' => $record->formatted,
|
||||
'time' => $record->datetime->format('Y-m-d H:i:s.u'),
|
||||
'context' => (count($record->context) > 0) ? json_encode($record->context, JSON_UNESCAPED_SLASHES) : '',
|
||||
'extra' => (count($record->extra) > 0) ? json_encode($record->extra, JSON_UNESCAPED_SLASHES) : ''
|
||||
]);
|
||||
}
|
||||
|
||||
private function initialized(): void
|
||||
{
|
||||
$query = <<<QUERY
|
||||
INSERT INTO monolog (channel, level, message, time, context, extra)
|
||||
VALUES (:channel, :level, :message, :time, :context, :extra)
|
||||
QUERY;
|
||||
$this->statement = $this->connection->getPDO()->prepare($query);
|
||||
$this->initialized = true;
|
||||
}
|
||||
private function checkTableExists(): bool
|
||||
{
|
||||
$query = "SHOW TABLES LIKE 'monolog'";
|
||||
$result = $this->connection->query($query);
|
||||
return $result->rowCount() > 0;
|
||||
}
|
||||
private function createTable(): void
|
||||
{
|
||||
$query = <<<QUERY
|
||||
CREATE TABLE IF NOT EXISTS monolog (
|
||||
channel VARCHAR(255),
|
||||
level VARCHAR(100),
|
||||
message LONGTEXT,
|
||||
time DATETIME,
|
||||
context LONGTEXT,
|
||||
extra LONGTEXT
|
||||
)
|
||||
QUERY;
|
||||
$this->connection->getPDO()->exec($query);
|
||||
}
|
||||
private function cleanup(): void
|
||||
{
|
||||
$query = "DELETE FROM monolog WHERE time < DATE_SUB(CURDATE(), INTERVAL {$this->retainDays} DAY)";
|
||||
$this->connection->query($query);
|
||||
}
|
||||
}
|
139
app/common/Implement/Log/Processor/ArrayBuilder.php
Normal file
139
app/common/Implement/Log/Processor/ArrayBuilder.php
Normal file
@ -0,0 +1,139 @@
|
||||
<?php
|
||||
namespace Incoviba\Common\Implement\Log\Processor;
|
||||
|
||||
use DateInvalidTimeZoneException;
|
||||
use DateMalformedStringException;
|
||||
use DateTimeImmutable;
|
||||
use DateTimeZone;
|
||||
use Psr\Container\ContainerExceptionInterface;
|
||||
use Psr\Container\ContainerInterface;
|
||||
use Psr\Container\NotFoundExceptionInterface;
|
||||
use Monolog\Formatter;
|
||||
use Monolog\Handler;
|
||||
use Monolog\Level;
|
||||
use Predis;
|
||||
use Incoviba;
|
||||
use Throwable;
|
||||
|
||||
class ArrayBuilder
|
||||
{
|
||||
public function __construct(protected ContainerInterface $container) {}
|
||||
|
||||
public function build(array $data): array
|
||||
{
|
||||
$handlers = [];
|
||||
foreach ($data as $handlerData) {
|
||||
if (in_array($handlerData['handler'], [Handler\StreamHandler::class, Handler\RotatingFileHandler::class,])) {
|
||||
$params = [
|
||||
"/logs/{$handlerData['filename']}",
|
||||
];
|
||||
if ($handlerData['handler'] === Handler\RotatingFileHandler::class) {
|
||||
$params []= 10;
|
||||
}
|
||||
try {
|
||||
$formatter = Formatter\LineFormatter::class;
|
||||
if (array_key_exists('formatter', $handlerData)) {
|
||||
$formatter = $handlerData['formatter'];
|
||||
}
|
||||
$handler = new $handlerData['handler'](...$params)
|
||||
->setFormatter($this->container->get($formatter));
|
||||
} catch (NotFoundExceptionInterface | ContainerExceptionInterface $exception) {
|
||||
$this->log($exception, ['handlerData' => $handlerData]);
|
||||
continue;
|
||||
}
|
||||
} elseif ($handlerData['handler'] === Incoviba\Common\Implement\Log\Handler\MySQL::class) {
|
||||
try {
|
||||
$params = [
|
||||
$this->container->get(Incoviba\Common\Define\Connection::class)
|
||||
];
|
||||
$formatter = Incoviba\Common\Implement\Log\Formatter\PDO::class;
|
||||
if (array_key_exists('formatter', $handlerData)) {
|
||||
$formatter = $handlerData['formatter'];
|
||||
}
|
||||
$handler = new $handlerData['handler'](...$params)
|
||||
->setFormatter($this->container->get($formatter));
|
||||
} catch (NotFoundExceptionInterface | ContainerExceptionInterface $exception) {
|
||||
$this->log($exception, ['handlerData' => $handlerData]);
|
||||
continue;
|
||||
}
|
||||
} elseif ($handlerData['handler'] === Handler\RedisHandler::class) {
|
||||
try {
|
||||
$params = [
|
||||
$this->container->get(Predis\ClientInterface::class),
|
||||
"logs:{$handlerData['name']}"
|
||||
];
|
||||
} catch (NotFoundExceptionInterface | ContainerExceptionInterface $exception) {
|
||||
$this->log($exception, ['handlerData' => $handlerData]);
|
||||
continue;
|
||||
}
|
||||
$handler = new $handlerData['handler'](...$params);
|
||||
}
|
||||
if (!isset($handler)) {
|
||||
$this->log("Invalid handler", ['handlerData' => $handlerData]);
|
||||
continue;
|
||||
}
|
||||
$params = [
|
||||
$handler,
|
||||
];
|
||||
if (is_array($handlerData['levels'])) {
|
||||
foreach ($handlerData['levels'] as $level) {
|
||||
$params []= $level;
|
||||
}
|
||||
} else {
|
||||
$params []= $handlerData['levels'];
|
||||
$params []= Level::Emergency;
|
||||
}
|
||||
$params []= false;
|
||||
$handlers []= new Handler\FilterHandler(...$params);
|
||||
}
|
||||
return $handlers;
|
||||
}
|
||||
|
||||
protected function log(string|Throwable $message, array $context = []): void
|
||||
{
|
||||
try {
|
||||
$dateTime = new DateTimeImmutable('now', new DateTimeZone($_ENV['TZ'] ?? 'America/Santiago'));
|
||||
} catch (DateMalformedStringException | DateInvalidTimeZoneException $exception) {
|
||||
$dateTime = new DateTimeImmutable();
|
||||
}
|
||||
if (is_a($message, Throwable::class)) {
|
||||
$exception = $message;
|
||||
$message = $exception->getMessage();
|
||||
}
|
||||
$context = json_encode($context, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
|
||||
if ($context === false) {
|
||||
$context = '[]';
|
||||
}
|
||||
$extra = [];
|
||||
$extra['from'] = __FILE__;
|
||||
if (isset($exception)) {
|
||||
$extra['file'] = $exception->getFile();
|
||||
$extra['line'] = $exception->getLine();
|
||||
$extra['trace'] = $exception->getTrace();
|
||||
}
|
||||
$extra = json_encode($extra, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
|
||||
$code = 0;
|
||||
if (isset($exception)) {
|
||||
$code = $exception->getCode();
|
||||
}
|
||||
if ($extra === false) {
|
||||
$extra = '[]';
|
||||
}
|
||||
$output = "[{$dateTime->format('Y-m-d H:i:s P')}] [{$code}] {$message} {$context} {$extra}";
|
||||
$filename = '/logs/error.json';
|
||||
$fileContents = [];
|
||||
if (file_exists($filename)) {
|
||||
$fileContents = file_get_contents($filename);
|
||||
$fileContents = json_decode($fileContents, true);
|
||||
if ($fileContents === false) {
|
||||
$fileContents = [];
|
||||
}
|
||||
}
|
||||
$fileContents[$dateTime->getTimestamp()] = $output;
|
||||
$fileContents = json_encode($fileContents, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
|
||||
if ($fileContents === false) {
|
||||
$fileContents = '[]';
|
||||
}
|
||||
file_put_contents($filename, $fileContents);
|
||||
}
|
||||
}
|
18
app/common/Implement/Log/Processor/User.php
Normal file
18
app/common/Implement/Log/Processor/User.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
namespace Incoviba\Common\Implement\Log\Processor;
|
||||
|
||||
use Incoviba\Service;
|
||||
use Monolog\LogRecord;
|
||||
use Monolog\Processor\ProcessorInterface;
|
||||
|
||||
class User implements ProcessorInterface
|
||||
{
|
||||
public function __construct(protected Service\Login $loginService) {}
|
||||
public function __invoke(LogRecord $record): LogRecord
|
||||
{
|
||||
if ($this->loginService->isIn()) {
|
||||
$record->extra['user'] = $this->loginService->getUser()->name;
|
||||
}
|
||||
return $record;
|
||||
}
|
||||
}
|
@ -1,8 +1,10 @@
|
||||
<?php
|
||||
namespace Incoviba\Common\Implement\Repository;
|
||||
|
||||
use Error;
|
||||
use Closure;
|
||||
use Incoviba\Common\Define;
|
||||
use Incoviba\Common\Implement\Exception\EmptyResult;
|
||||
|
||||
class Mapper implements Define\Repository\Mapper
|
||||
{
|
||||
@ -46,7 +48,11 @@ class Mapper implements Define\Repository\Mapper
|
||||
}
|
||||
public function hasDefault(): bool
|
||||
{
|
||||
return isset($this->default);
|
||||
try {
|
||||
return isset($this->default) or $this->default === null;
|
||||
} catch (Error) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public function parse(Define\Model &$model, string $column, ?array $data): bool
|
||||
@ -62,10 +68,14 @@ class Mapper implements Define\Repository\Mapper
|
||||
}
|
||||
$value = $data[$column];
|
||||
if ($this->hasFunction()) {
|
||||
if ($value !== null) {
|
||||
try {
|
||||
$value = ($this->function)($data);
|
||||
} elseif ($this->hasDefault()) {
|
||||
$value = $this->default;
|
||||
} catch (EmptyResult $exception) {
|
||||
if ($this->hasDefault()) {
|
||||
$value = $this->default;
|
||||
} else {
|
||||
throw $exception;
|
||||
}
|
||||
}
|
||||
}
|
||||
$model->{$property} = $value;
|
||||
|
@ -2,6 +2,7 @@
|
||||
namespace Incoviba\Common\Implement\Repository\Mapper;
|
||||
|
||||
use DateTimeImmutable;
|
||||
use DateMalformedStringException;
|
||||
use Incoviba\Common\Implement\Repository\Mapper;
|
||||
|
||||
class DateTime extends Mapper
|
||||
@ -9,7 +10,17 @@ class DateTime extends Mapper
|
||||
public function __construct(string $column, ?string $property = null)
|
||||
{
|
||||
$this->setFunction(function($data) use ($column) {
|
||||
return new DateTimeImmutable($data[$column] ?? '');
|
||||
if (!isset($data[$column])) {
|
||||
return null;
|
||||
}
|
||||
if (is_a($data[$column], DateTimeImmutable::class)) {
|
||||
return $data[$column];
|
||||
}
|
||||
try {
|
||||
return new DateTimeImmutable($data[$column] ?? '');
|
||||
} catch (DateMalformedStringException) {
|
||||
return new DateTimeImmutable();
|
||||
}
|
||||
});
|
||||
if ($property !== null) {
|
||||
$this->setProperty($property);
|
||||
|
@ -1,21 +1,35 @@
|
||||
{
|
||||
"name": "incoviba/web",
|
||||
"version": "2.0.0",
|
||||
"type": "project",
|
||||
"require": {
|
||||
"berrnd/slim-blade-view": "^1.0",
|
||||
"guzzlehttp/guzzle": "^7.8",
|
||||
"monolog/monolog": "^3.4",
|
||||
"nyholm/psr7": "^1.8",
|
||||
"nyholm/psr7-server": "^1.0",
|
||||
"php-di/php-di": "^7.0",
|
||||
"php-di/slim-bridge": "^3.4",
|
||||
"phpoffice/phpspreadsheet": "^1.29",
|
||||
"predis/predis": "^2.2",
|
||||
"slim/slim": "^4.11"
|
||||
"ext-curl": "*",
|
||||
"ext-dom": "*",
|
||||
"ext-gd": "*",
|
||||
"ext-openssl": "*",
|
||||
"ext-pdo": "*",
|
||||
"ext-sockets": "*",
|
||||
"berrnd/slim-blade-view": "^1",
|
||||
"guzzlehttp/guzzle": "^7",
|
||||
"monolog/monolog": "^3",
|
||||
"nyholm/psr7": "^1",
|
||||
"nyholm/psr7-server": "^1",
|
||||
"pda/pheanstalk": "^7.0",
|
||||
"php-di/php-di": "^7",
|
||||
"php-di/slim-bridge": "^3",
|
||||
"phpoffice/phpspreadsheet": "^3",
|
||||
"predis/predis": "^2",
|
||||
"robmorgan/phinx": "^0.16",
|
||||
"slim/slim": "^4",
|
||||
"symfony/string": "^7.2",
|
||||
"tedivm/jshrink": "^1.7"
|
||||
},
|
||||
"require-dev": {
|
||||
"kint-php/kint": "^5.1",
|
||||
"phpunit/phpunit": "^10.2"
|
||||
"fakerphp/faker": "^1",
|
||||
"kint-php/kint": "^5",
|
||||
"odan/phinx-migrations-generator": "^6",
|
||||
"phpunit/phpunit": "^11",
|
||||
"spatie/phpunit-watcher": "^1"
|
||||
},
|
||||
"authors": [
|
||||
{
|
||||
@ -30,6 +44,8 @@
|
||||
}
|
||||
},
|
||||
"config": {
|
||||
"sort-packages": true
|
||||
"sort-packages": true,
|
||||
"process-timeout": 0,
|
||||
"bin-dir": "bin"
|
||||
}
|
||||
}
|
||||
|
496
app/fcgi.conf
Normal file
496
app/fcgi.conf
Normal file
@ -0,0 +1,496 @@
|
||||
; Start a new pool named 'www'.
|
||||
; the variable $pool can be used in any directive and will be replaced by the
|
||||
; pool name ('www' here)
|
||||
[fcgi]
|
||||
|
||||
; Per pool prefix
|
||||
; It only applies on the following directives:
|
||||
; - 'access.log'
|
||||
; - 'slowlog'
|
||||
; - 'listen' (unixsocket)
|
||||
; - 'chroot'
|
||||
; - 'chdir'
|
||||
; - 'php_values'
|
||||
; - 'php_admin_values'
|
||||
; When not set, the global prefix (or NONE) applies instead.
|
||||
; Note: This directive can also be relative to the global prefix.
|
||||
; Default Value: none
|
||||
;prefix = /path/to/pools/$pool
|
||||
|
||||
; Unix user/group of the child processes. This can be used only if the master
|
||||
; process running user is root. It is set after the child process is created.
|
||||
; The user and group can be specified either by their name or by their numeric
|
||||
; IDs.
|
||||
; Note: If the user is root, the executable needs to be started with
|
||||
; --allow-to-run-as-root option to work.
|
||||
; Default Values: The user is set to master process running user by default.
|
||||
; If the group is not set, the user's group is used.
|
||||
user = www-data
|
||||
group = www-data
|
||||
|
||||
; The address on which to accept FastCGI requests.
|
||||
; Valid syntaxes are:
|
||||
; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on
|
||||
; a specific port;
|
||||
; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
|
||||
; a specific port;
|
||||
; 'port' - to listen on a TCP socket to all addresses
|
||||
; (IPv6 and IPv4-mapped) on a specific port;
|
||||
; '/path/to/unix/socket' - to listen on a unix socket.
|
||||
; Note: This value is mandatory.
|
||||
;listen = 127.0.0.1:9000
|
||||
listen = 9090
|
||||
|
||||
; Set listen(2) backlog.
|
||||
; Default Value: 511 (-1 on Linux, FreeBSD and OpenBSD)
|
||||
;listen.backlog = 511
|
||||
|
||||
; Set permissions for unix socket, if one is used. In Linux, read/write
|
||||
; permissions must be set in order to allow connections from a web server. Many
|
||||
; BSD-derived systems allow connections regardless of permissions. The owner
|
||||
; and group can be specified either by name or by their numeric IDs.
|
||||
; Default Values: Owner is set to the master process running user. If the group
|
||||
; is not set, the owner's group is used. Mode is set to 0660.
|
||||
;listen.owner = www-data
|
||||
;listen.group = www-data
|
||||
;listen.mode = 0660
|
||||
|
||||
; When POSIX Access Control Lists are supported you can set them using
|
||||
; these options, value is a comma separated list of user/group names.
|
||||
; When set, listen.owner and listen.group are ignored
|
||||
;listen.acl_users =
|
||||
;listen.acl_groups =
|
||||
|
||||
; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect.
|
||||
; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original
|
||||
; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address
|
||||
; must be separated by a comma. If this value is left blank, connections will be
|
||||
; accepted from any ip address.
|
||||
; Default Value: any
|
||||
;listen.allowed_clients = 127.0.0.1
|
||||
|
||||
; Set the associated the route table (FIB). FreeBSD only
|
||||
; Default Value: -1
|
||||
;listen.setfib = 1
|
||||
|
||||
; Specify the nice(2) priority to apply to the pool processes (only if set)
|
||||
; The value can vary from -19 (highest priority) to 20 (lower priority)
|
||||
; Note: - It will only work if the FPM master process is launched as root
|
||||
; - The pool processes will inherit the master process priority
|
||||
; unless it specified otherwise
|
||||
; Default Value: no set
|
||||
; process.priority = -19
|
||||
|
||||
; Set the process dumpable flag (PR_SET_DUMPABLE prctl for Linux or
|
||||
; PROC_TRACE_CTL procctl for FreeBSD) even if the process user
|
||||
; or group is different than the master process user. It allows to create process
|
||||
; core dump and ptrace the process for the pool user.
|
||||
; Default Value: no
|
||||
; process.dumpable = yes
|
||||
|
||||
; Choose how the process manager will control the number of child processes.
|
||||
; Possible Values:
|
||||
; static - a fixed number (pm.max_children) of child processes;
|
||||
; dynamic - the number of child processes are set dynamically based on the
|
||||
; following directives. With this process management, there will be
|
||||
; always at least 1 children.
|
||||
; pm.max_children - the maximum number of children that can
|
||||
; be alive at the same time.
|
||||
; pm.start_servers - the number of children created on startup.
|
||||
; pm.min_spare_servers - the minimum number of children in 'idle'
|
||||
; state (waiting to process). If the number
|
||||
; of 'idle' processes is less than this
|
||||
; number then some children will be created.
|
||||
; pm.max_spare_servers - the maximum number of children in 'idle'
|
||||
; state (waiting to process). If the number
|
||||
; of 'idle' processes is greater than this
|
||||
; number then some children will be killed.
|
||||
; pm.max_spawn_rate - the maximum number of rate to spawn child
|
||||
; processes at once.
|
||||
; ondemand - no children are created at startup. Children will be forked when
|
||||
; new requests will connect. The following parameter are used:
|
||||
; pm.max_children - the maximum number of children that
|
||||
; can be alive at the same time.
|
||||
; pm.process_idle_timeout - The number of seconds after which
|
||||
; an idle process will be killed.
|
||||
; Note: This value is mandatory.
|
||||
pm = ondemand
|
||||
|
||||
; The number of child processes to be created when pm is set to 'static' and the
|
||||
; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'.
|
||||
; This value sets the limit on the number of simultaneous requests that will be
|
||||
; served. Equivalent to the ApacheMaxClients directive with mpm_prefork.
|
||||
; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP
|
||||
; CGI. The below defaults are based on a server without much resources. Don't
|
||||
; forget to tweak pm.* to fit your needs.
|
||||
; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand'
|
||||
; Note: This value is mandatory.
|
||||
pm.max_children = 2
|
||||
|
||||
; The number of child processes created on startup.
|
||||
; Note: Used only when pm is set to 'dynamic'
|
||||
; Default Value: (min_spare_servers + max_spare_servers) / 2
|
||||
;pm.start_servers = 2
|
||||
|
||||
; The desired minimum number of idle server processes.
|
||||
; Note: Used only when pm is set to 'dynamic'
|
||||
; Note: Mandatory when pm is set to 'dynamic'
|
||||
;pm.min_spare_servers = 1
|
||||
|
||||
; The desired maximum number of idle server processes.
|
||||
; Note: Used only when pm is set to 'dynamic'
|
||||
; Note: Mandatory when pm is set to 'dynamic'
|
||||
;pm.max_spare_servers = 3
|
||||
|
||||
; The number of rate to spawn child processes at once.
|
||||
; Note: Used only when pm is set to 'dynamic'
|
||||
; Note: Mandatory when pm is set to 'dynamic'
|
||||
; Default Value: 32
|
||||
;pm.max_spawn_rate = 32
|
||||
|
||||
; The number of seconds after which an idle process will be killed.
|
||||
; Note: Used only when pm is set to 'ondemand'
|
||||
; Default Value: 10s
|
||||
;pm.process_idle_timeout = 10s;
|
||||
pm.process_idle_timeout = 10s
|
||||
|
||||
; The number of requests each child process should execute before respawning.
|
||||
; This can be useful to work around memory leaks in 3rd party libraries. For
|
||||
; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS.
|
||||
; Default Value: 0
|
||||
;pm.max_requests = 500
|
||||
|
||||
; The URI to view the FPM status page. If this value is not set, no URI will be
|
||||
; recognized as a status page. It shows the following information:
|
||||
; pool - the name of the pool;
|
||||
; process manager - static, dynamic or ondemand;
|
||||
; start time - the date and time FPM has started;
|
||||
; start since - number of seconds since FPM has started;
|
||||
; accepted conn - the number of request accepted by the pool;
|
||||
; listen queue - the number of request in the queue of pending
|
||||
; connections (see backlog in listen(2));
|
||||
; max listen queue - the maximum number of requests in the queue
|
||||
; of pending connections since FPM has started;
|
||||
; listen queue len - the size of the socket queue of pending connections;
|
||||
; idle processes - the number of idle processes;
|
||||
; active processes - the number of active processes;
|
||||
; total processes - the number of idle + active processes;
|
||||
; max active processes - the maximum number of active processes since FPM
|
||||
; has started;
|
||||
; max children reached - number of times, the process limit has been reached,
|
||||
; when pm tries to start more children (works only for
|
||||
; pm 'dynamic' and 'ondemand');
|
||||
; Value are updated in real time.
|
||||
; Example output:
|
||||
; pool: www
|
||||
; process manager: static
|
||||
; start time: 01/Jul/2011:17:53:49 +0200
|
||||
; start since: 62636
|
||||
; accepted conn: 190460
|
||||
; listen queue: 0
|
||||
; max listen queue: 1
|
||||
; listen queue len: 42
|
||||
; idle processes: 4
|
||||
; active processes: 11
|
||||
; total processes: 15
|
||||
; max active processes: 12
|
||||
; max children reached: 0
|
||||
;
|
||||
; By default the status page output is formatted as text/plain. Passing either
|
||||
; 'html', 'xml' or 'json' in the query string will return the corresponding
|
||||
; output syntax. Example:
|
||||
; http://www.foo.bar/status
|
||||
; http://www.foo.bar/status?json
|
||||
; http://www.foo.bar/status?html
|
||||
; http://www.foo.bar/status?xml
|
||||
;
|
||||
; By default the status page only outputs short status. Passing 'full' in the
|
||||
; query string will also return status for each pool process.
|
||||
; Example:
|
||||
; http://www.foo.bar/status?full
|
||||
; http://www.foo.bar/status?json&full
|
||||
; http://www.foo.bar/status?html&full
|
||||
; http://www.foo.bar/status?xml&full
|
||||
; The Full status returns for each process:
|
||||
; pid - the PID of the process;
|
||||
; state - the state of the process (Idle, Running, ...);
|
||||
; start time - the date and time the process has started;
|
||||
; start since - the number of seconds since the process has started;
|
||||
; requests - the number of requests the process has served;
|
||||
; request duration - the duration in µs of the requests;
|
||||
; request method - the request method (GET, POST, ...);
|
||||
; request URI - the request URI with the query string;
|
||||
; content length - the content length of the request (only with POST);
|
||||
; user - the user (PHP_AUTH_USER) (or '-' if not set);
|
||||
; script - the main script called (or '-' if not set);
|
||||
; last request cpu - the %cpu the last request consumed
|
||||
; it's always 0 if the process is not in Idle state
|
||||
; because CPU calculation is done when the request
|
||||
; processing has terminated;
|
||||
; last request memory - the max amount of memory the last request consumed
|
||||
; it's always 0 if the process is not in Idle state
|
||||
; because memory calculation is done when the request
|
||||
; processing has terminated;
|
||||
; If the process is in Idle state, then information is related to the
|
||||
; last request the process has served. Otherwise information is related to
|
||||
; the current request being served.
|
||||
; Example output:
|
||||
; ************************
|
||||
; pid: 31330
|
||||
; state: Running
|
||||
; start time: 01/Jul/2011:17:53:49 +0200
|
||||
; start since: 63087
|
||||
; requests: 12808
|
||||
; request duration: 1250261
|
||||
; request method: GET
|
||||
; request URI: /test_mem.php?N=10000
|
||||
; content length: 0
|
||||
; user: -
|
||||
; script: /home/fat/web/docs/php/test_mem.php
|
||||
; last request cpu: 0.00
|
||||
; last request memory: 0
|
||||
;
|
||||
; Note: There is a real-time FPM status monitoring sample web page available
|
||||
; It's available in: /usr/local/share/php/fpm/status.html
|
||||
;
|
||||
; Note: The value must start with a leading slash (/). The value can be
|
||||
; anything, but it may not be a good idea to use the .php extension or it
|
||||
; may conflict with a real PHP file.
|
||||
; Default Value: not set
|
||||
;pm.status_path = /status
|
||||
|
||||
; The address on which to accept FastCGI status request. This creates a new
|
||||
; invisible pool that can handle requests independently. This is useful
|
||||
; if the main pool is busy with long running requests because it is still possible
|
||||
; to get the status before finishing the long running requests.
|
||||
;
|
||||
; Valid syntaxes are:
|
||||
; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on
|
||||
; a specific port;
|
||||
; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
|
||||
; a specific port;
|
||||
; 'port' - to listen on a TCP socket to all addresses
|
||||
; (IPv6 and IPv4-mapped) on a specific port;
|
||||
; '/path/to/unix/socket' - to listen on a unix socket.
|
||||
; Default Value: value of the listen option
|
||||
;pm.status_listen = 127.0.0.1:9001
|
||||
|
||||
; The ping URI to call the monitoring page of FPM. If this value is not set, no
|
||||
; URI will be recognized as a ping page. This could be used to test from outside
|
||||
; that FPM is alive and responding, or to
|
||||
; - create a graph of FPM availability (rrd or such);
|
||||
; - remove a server from a group if it is not responding (load balancing);
|
||||
; - trigger alerts for the operating team (24/7).
|
||||
; Note: The value must start with a leading slash (/). The value can be
|
||||
; anything, but it may not be a good idea to use the .php extension or it
|
||||
; may conflict with a real PHP file.
|
||||
; Default Value: not set
|
||||
;ping.path = /ping
|
||||
|
||||
; This directive may be used to customize the response of a ping request. The
|
||||
; response is formatted as text/plain with a 200 response code.
|
||||
; Default Value: pong
|
||||
;ping.response = pong
|
||||
|
||||
; The access log file
|
||||
; Default: not set
|
||||
;access.log = log/$pool.access.log
|
||||
access.log = /proc/self/fd/2
|
||||
|
||||
; The access log format.
|
||||
; The following syntax is allowed
|
||||
; %%: the '%' character
|
||||
; %C: %CPU used by the request
|
||||
; it can accept the following format:
|
||||
; - %{user}C for user CPU only
|
||||
; - %{system}C for system CPU only
|
||||
; - %{total}C for user + system CPU (default)
|
||||
; %d: time taken to serve the request
|
||||
; it can accept the following format:
|
||||
; - %{seconds}d (default)
|
||||
; - %{milliseconds}d
|
||||
; - %{milli}d
|
||||
; - %{microseconds}d
|
||||
; - %{micro}d
|
||||
; %e: an environment variable (same as $_ENV or $_SERVER)
|
||||
; it must be associated with embraces to specify the name of the env
|
||||
; variable. Some examples:
|
||||
; - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e
|
||||
; - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e
|
||||
; %f: script filename
|
||||
; %l: content-length of the request (for POST request only)
|
||||
; %m: request method
|
||||
; %M: peak of memory allocated by PHP
|
||||
; it can accept the following format:
|
||||
; - %{bytes}M (default)
|
||||
; - %{kilobytes}M
|
||||
; - %{kilo}M
|
||||
; - %{megabytes}M
|
||||
; - %{mega}M
|
||||
; %n: pool name
|
||||
; %o: output header
|
||||
; it must be associated with embraces to specify the name of the header:
|
||||
; - %{Content-Type}o
|
||||
; - %{X-Powered-By}o
|
||||
; - %{Transfert-Encoding}o
|
||||
; - ....
|
||||
; %p: PID of the child that serviced the request
|
||||
; %P: PID of the parent of the child that serviced the request
|
||||
; %q: the query string
|
||||
; %Q: the '?' character if query string exists
|
||||
; %r: the request URI (without the query string, see %q and %Q)
|
||||
; %R: remote IP address
|
||||
; %s: status (response code)
|
||||
; %t: server time the request was received
|
||||
; it can accept a strftime(3) format:
|
||||
; %d/%b/%Y:%H:%M:%S %z (default)
|
||||
; The strftime(3) format must be encapsulated in a %{<strftime_format>}t tag
|
||||
; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t
|
||||
; %T: time the log has been written (the request has finished)
|
||||
; it can accept a strftime(3) format:
|
||||
; %d/%b/%Y:%H:%M:%S %z (default)
|
||||
; The strftime(3) format must be encapsulated in a %{<strftime_format>}t tag
|
||||
; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t
|
||||
; %u: basic auth user if specified in Authorization header
|
||||
;
|
||||
; Default: "%R - %u %t \"%m %r\" %s"
|
||||
;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{milli}d %{kilo}M %C%%"
|
||||
|
||||
; A list of request_uri values which should be filtered from the access log.
|
||||
;
|
||||
; As a security precaution, this setting will be ignored if:
|
||||
; - the request method is not GET or HEAD; or
|
||||
; - there is a request body; or
|
||||
; - there are query parameters; or
|
||||
; - the response code is outwith the successful range of 200 to 299
|
||||
;
|
||||
; Note: The paths are matched against the output of the access.format tag "%r".
|
||||
; On common configurations, this may look more like SCRIPT_NAME than the
|
||||
; expected pre-rewrite URI.
|
||||
;
|
||||
; Default Value: not set
|
||||
;access.suppress_path[] = /ping
|
||||
;access.suppress_path[] = /health_check.php
|
||||
|
||||
; The log file for slow requests
|
||||
; Default Value: not set
|
||||
; Note: slowlog is mandatory if request_slowlog_timeout is set
|
||||
;slowlog = log/$pool.log.slow
|
||||
|
||||
; The timeout for serving a single request after which a PHP backtrace will be
|
||||
; dumped to the 'slowlog' file. A value of '0s' means 'off'.
|
||||
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
|
||||
; Default Value: 0
|
||||
;request_slowlog_timeout = 0
|
||||
|
||||
; Depth of slow log stack trace.
|
||||
; Default Value: 20
|
||||
;request_slowlog_trace_depth = 20
|
||||
|
||||
; The timeout for serving a single request after which the worker process will
|
||||
; be killed. This option should be used when the 'max_execution_time' ini option
|
||||
; does not stop script execution for some reason. A value of '0' means 'off'.
|
||||
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
|
||||
; Default Value: 0
|
||||
;request_terminate_timeout = 0
|
||||
|
||||
; The timeout set by 'request_terminate_timeout' ini option is not engaged after
|
||||
; application calls 'fastcgi_finish_request' or when application has finished and
|
||||
; shutdown functions are being called (registered via register_shutdown_function).
|
||||
; This option will enable timeout limit to be applied unconditionally
|
||||
; even in such cases.
|
||||
; Default Value: no
|
||||
;request_terminate_timeout_track_finished = no
|
||||
|
||||
; Set open file descriptor rlimit.
|
||||
; Default Value: system defined value
|
||||
;rlimit_files = 1024
|
||||
|
||||
; Set max core size rlimit.
|
||||
; Possible Values: 'unlimited' or an integer greater or equal to 0
|
||||
; Default Value: system defined value
|
||||
;rlimit_core = 0
|
||||
|
||||
; Chroot to this directory at the start. This value must be defined as an
|
||||
; absolute path. When this value is not set, chroot is not used.
|
||||
; Note: you can prefix with '$prefix' to chroot to the pool prefix or one
|
||||
; of its subdirectories. If the pool prefix is not set, the global prefix
|
||||
; will be used instead.
|
||||
; Note: chrooting is a great security feature and should be used whenever
|
||||
; possible. However, all PHP paths will be relative to the chroot
|
||||
; (error_log, sessions.save_path, ...).
|
||||
; Default Value: not set
|
||||
;chroot =
|
||||
|
||||
; Chdir to this directory at the start.
|
||||
; Note: relative path can be used.
|
||||
; Default Value: current directory or / when chroot
|
||||
;chdir = /var/www
|
||||
|
||||
; Redirect worker stdout and stderr into main error log. If not set, stdout and
|
||||
; stderr will be redirected to /dev/null according to FastCGI specs.
|
||||
; Note: on highloaded environment, this can cause some delay in the page
|
||||
; process time (several ms).
|
||||
; Default Value: no
|
||||
;catch_workers_output = yes
|
||||
catch_workers_output = yes
|
||||
|
||||
; Decorate worker output with prefix and suffix containing information about
|
||||
; the child that writes to the log and if stdout or stderr is used as well as
|
||||
; log level and time. This options is used only if catch_workers_output is yes.
|
||||
; Settings to "no" will output data as written to the stdout or stderr.
|
||||
; Default value: yes
|
||||
;decorate_workers_output = no
|
||||
decorate_workers_output = no
|
||||
|
||||
; Clear environment in FPM workers
|
||||
; Prevents arbitrary environment variables from reaching FPM worker processes
|
||||
; by clearing the environment in workers before env vars specified in this
|
||||
; pool configuration are added.
|
||||
; Setting to "no" will make all environment variables available to PHP code
|
||||
; via getenv(), $_ENV and $_SERVER.
|
||||
; Default Value: yes
|
||||
;clear_env = no
|
||||
clear_env = no
|
||||
|
||||
; Limits the extensions of the main script FPM will allow to parse. This can
|
||||
; prevent configuration mistakes on the web server side. You should only limit
|
||||
; FPM to .php extensions to prevent malicious users to use other extensions to
|
||||
; execute php code.
|
||||
; Note: set an empty value to allow all extensions.
|
||||
; Default Value: .php
|
||||
;security.limit_extensions = .php .php3 .php4 .php5 .php7
|
||||
|
||||
; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from
|
||||
; the current environment.
|
||||
; Default Value: clean env
|
||||
;env[HOSTNAME] = $HOSTNAME
|
||||
;env[PATH] = /usr/local/bin:/usr/bin:/bin
|
||||
;env[TMP] = /tmp
|
||||
;env[TMPDIR] = /tmp
|
||||
;env[TEMP] = /tmp
|
||||
|
||||
; Additional php.ini defines, specific to this pool of workers. These settings
|
||||
; overwrite the values previously defined in the php.ini. The directives are the
|
||||
; same as the PHP SAPI:
|
||||
; php_value/php_flag - you can set classic ini defines which can
|
||||
; be overwritten from PHP call 'ini_set'.
|
||||
; php_admin_value/php_admin_flag - these directives won't be overwritten by
|
||||
; PHP call 'ini_set'
|
||||
; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no.
|
||||
|
||||
; Defining 'extension' will load the corresponding shared extension from
|
||||
; extension_dir. Defining 'disable_functions' or 'disable_classes' will not
|
||||
; overwrite previously defined php.ini values, but will append the new value
|
||||
; instead.
|
||||
|
||||
; Note: path INI options can be relative and will be expanded with the prefix
|
||||
; (pool, global or /usr/local)
|
||||
|
||||
; Default Value: nothing is defined by default except the values in php.ini and
|
||||
; specified at startup with the -d argument
|
||||
;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
|
||||
;php_flag[display_errors] = off
|
||||
;php_admin_value[error_log] = /var/log/fpm-php.www.log
|
||||
;php_admin_flag[log_errors] = on
|
||||
;php_admin_value[memory_limit] = 32M
|
730
app/generate-migrations.php
Normal file
730
app/generate-migrations.php
Normal file
@ -0,0 +1,730 @@
|
||||
<?php
|
||||
require_once implode(DIRECTORY_SEPARATOR, [__DIR__, 'vendor', 'autoload.php']);
|
||||
|
||||
class TableRepository
|
||||
{
|
||||
public function __construct(protected Incoviba\Common\Define\Connection $connection, protected string $database) {}
|
||||
|
||||
public function getTables(): array
|
||||
{
|
||||
if (!isset($this->tables)) {
|
||||
$results = $this->connection->query("SHOW TABLES");
|
||||
$rows = $results->fetchAll(PDO::FETCH_ASSOC);
|
||||
$this->tables = array_map(function($row) {
|
||||
return $row["Tables_in_{$this->database}"];
|
||||
}, $rows);
|
||||
}
|
||||
return $this->tables;
|
||||
}
|
||||
public function getTableDefinition(string $table): string
|
||||
{
|
||||
if (!isset($this->definitions[$table])) {
|
||||
$results = $this->connection->query("SHOW CREATE TABLE {$table}");
|
||||
$row = $results->fetch(PDO::FETCH_ASSOC);
|
||||
$this->definitions[$table] = $row['Create Table'];
|
||||
}
|
||||
return $this->definitions[$table];
|
||||
}
|
||||
public function parseTableDefinition(string $table, int $offset = 2): string
|
||||
{
|
||||
$this->extractLines($table);
|
||||
$tableLine = "\$this->table('{$table}'";
|
||||
if (count($this->primary) === 1) {
|
||||
$tableLine .= ", ['id' => '{$this->primary[0]}']";
|
||||
} elseif (count($this->primary) > 1) {
|
||||
$primaryString = implode(', ', array_map(function($key) {return "'{$key}'";}, $this->primary));
|
||||
$tableLine .= ", ['id' = false, 'primary_key' => [{$primaryString}]]";
|
||||
}
|
||||
$tableLine .= ')';
|
||||
$output = [$this->prefixLine($tableLine, $offset)];
|
||||
foreach ($this->columns as $column) {
|
||||
$output []= $this->prefixLine($column, $offset + 1);
|
||||
}
|
||||
foreach ($this->constraints as $constraint) {
|
||||
$output []= $this->prefixLine($constraint, $offset + 1);
|
||||
}
|
||||
$output []= $this->prefixLine('->create();', $offset + 1);
|
||||
return implode(PHP_EOL, $output);
|
||||
}
|
||||
public function getTableIndex(string $table): int
|
||||
{
|
||||
return array_search($table, $this->getTables());
|
||||
}
|
||||
|
||||
protected array $tables;
|
||||
protected array $definitions;
|
||||
protected array $primary;
|
||||
protected array $columns;
|
||||
protected array $constraints;
|
||||
|
||||
protected function extractLines(string $table): void
|
||||
{
|
||||
$this->primary = [];
|
||||
$this->columns = [];
|
||||
$this->constraints = [];
|
||||
$lines = explode(PHP_EOL, $this->definitions[$table]);
|
||||
|
||||
array_shift($lines);
|
||||
foreach ($lines as $line) {
|
||||
if (str_starts_with(trim($line), ') ENGINE')) {
|
||||
break;
|
||||
}
|
||||
if (str_starts_with(trim($line), '`id`') or str_starts_with(trim($line), 'KEY')) {
|
||||
continue;
|
||||
}
|
||||
if (str_starts_with(trim($line), 'PRIMARY KEY')) {
|
||||
if (!str_contains($line, '`id`')) {
|
||||
$ini = strpos($line, '(') + 1;
|
||||
$end = strpos($line, ')', $ini);
|
||||
$this->primary []= substr($line, $ini, $end - $ini);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (str_starts_with(trim($line), 'CONSTRAINT')) {
|
||||
$this->constraints []= (new ConstraintParser($line))->parse();
|
||||
continue;
|
||||
}
|
||||
$this->columns []= (new ColumnParser($line))->parse();
|
||||
}
|
||||
}
|
||||
protected function prefixLine(string $line, int $length, string $character = "\t"): string
|
||||
{
|
||||
if ($length === 0) {
|
||||
return $line;
|
||||
}
|
||||
return implode('', array_fill(0, $length, $character)) . $line;
|
||||
}
|
||||
}
|
||||
class DataRepository
|
||||
{
|
||||
public function __construct(protected Incoviba\Common\Define\Connection $connection) {}
|
||||
|
||||
public int $size;
|
||||
|
||||
public function getData(string $table): Generator
|
||||
{
|
||||
$query = $this->connection->getQueryBuilder()
|
||||
->select()
|
||||
->from($table);
|
||||
$results = $this->connection->query($query);
|
||||
$this->size = $results->rowCount();
|
||||
while ($row = $results->fetch(PDO::FETCH_ASSOC)) {
|
||||
yield $row;
|
||||
}
|
||||
}
|
||||
}
|
||||
class ColumnParser
|
||||
{
|
||||
public function __construct(protected string $line) {}
|
||||
|
||||
public function parse(): string
|
||||
{
|
||||
return "->addColumn('{$this->getName()}', '{$this->getType()}'{$this->getOptions()})";
|
||||
}
|
||||
|
||||
protected int $ini;
|
||||
protected int $end;
|
||||
protected array $parts;
|
||||
protected array $options;
|
||||
|
||||
protected function getName(): string
|
||||
{
|
||||
$ini = $this->getIni();
|
||||
$end = $this->getEnd();
|
||||
return substr($this->line, $ini, $end - $ini);
|
||||
}
|
||||
protected function getType(): string
|
||||
{
|
||||
$parts = $this->getParts();
|
||||
$type = array_shift($parts);
|
||||
|
||||
if (str_contains($type, '(')) {
|
||||
list($type, $length) = explode('(', $type);
|
||||
$this->options []= "'length' => " . rtrim($length, ')');
|
||||
}
|
||||
return match($type) {
|
||||
'int' => 'integer',
|
||||
'tinyint' => 'boolean',
|
||||
'varchar' => 'string',
|
||||
default => $type
|
||||
};
|
||||
}
|
||||
protected function getOptions(): string
|
||||
{
|
||||
$parts = $this->getParts();
|
||||
array_shift($parts);
|
||||
$validOptions = [
|
||||
'default' => function($parts) {
|
||||
$i = array_search('default', array_map(function($part) {return strtolower($part);}, $parts));
|
||||
return ['default', $parts[$i + 1]];
|
||||
},
|
||||
'null' => function($parts) {
|
||||
$value = true;
|
||||
$i = array_search('null', array_map(function($part) {return strtolower($part);}, $parts));
|
||||
if (key_exists($i - 1, $parts) and strtolower($parts[$i - 1]) === 'not') {
|
||||
$value = false;
|
||||
}
|
||||
return ['null', $value];
|
||||
},
|
||||
'unsigned' => function($parts) {
|
||||
return ['signed', false];
|
||||
},
|
||||
'auto_increment' => function($parts) {
|
||||
return ['auto_increment', true];
|
||||
}
|
||||
];
|
||||
foreach ($validOptions as $validOption => $callable) {
|
||||
if (str_contains(strtolower($this->line), $validOption)) {
|
||||
list($option, $value) = $callable($parts);
|
||||
if (strtolower($value) === 'null') {
|
||||
$value = 'null';
|
||||
}
|
||||
if ($value !== 'null' and !is_bool($value) and !ctype_digit($value)) {
|
||||
$value = trim($value, "'");
|
||||
$value = "'{$value}'";
|
||||
}
|
||||
if (is_bool($value)) {
|
||||
$value = $value ? 'true' : 'false';
|
||||
}
|
||||
$this->options []= "'{$option}' => {$value}";
|
||||
}
|
||||
}
|
||||
if (count($this->options) === 0) {
|
||||
return '';
|
||||
}
|
||||
return ', [' . implode(', ', $this->options) . ']';
|
||||
}
|
||||
protected function getIni(): int
|
||||
{
|
||||
if (!isset($this->ini)) {
|
||||
$this->ini = strpos($this->line, '`') + 1;
|
||||
}
|
||||
return $this->ini;
|
||||
}
|
||||
protected function getEnd(): int
|
||||
{
|
||||
if (!isset($this->end)) {
|
||||
$this->end = strpos($this->line, '`', $this->getIni());
|
||||
}
|
||||
return $this->end;
|
||||
}
|
||||
protected function getParts(): array
|
||||
{
|
||||
if (!isset($this->parts)) {
|
||||
$this->parts = explode(' ', trim(substr($this->line, $this->getEnd() + 1), ' ,'));
|
||||
}
|
||||
return $this->parts;
|
||||
}
|
||||
}
|
||||
class ConstraintParser
|
||||
{
|
||||
public function __construct(protected string $line) {}
|
||||
|
||||
public function parse(): string
|
||||
{
|
||||
return "->addForeignKey({$this->getColumns()}, '{$this->getTable()}', {$this->getReferences()}, ['delete' => 'cascade', 'update' => 'cascade'])";
|
||||
}
|
||||
|
||||
protected function getColumns(): string
|
||||
{
|
||||
$ini = strpos(strtolower($this->line), 'foreign key') + strlen('FOREIGN KEY ');
|
||||
$ini = strpos($this->line, '(', $ini) + 1;
|
||||
$end = strpos(strtolower($this->line), ' references', $ini + 1) - strlen(')');
|
||||
return $this->getNames($ini, $end);
|
||||
}
|
||||
protected function getTable(): string
|
||||
{
|
||||
$ini = strpos(strtolower($this->line), 'references') + strlen('REFERENCES ') + 1;
|
||||
$end = strpos($this->line, '`', $ini + 1);
|
||||
return substr($this->line, $ini, $end - $ini);
|
||||
}
|
||||
protected function getReferences(): string
|
||||
{
|
||||
$ini = strpos($this->line, '(', strpos(strtolower($this->line), 'references')) + 1;
|
||||
$end = strpos($this->line, ')', $ini);
|
||||
return $this->getNames($ini, $end);
|
||||
}
|
||||
protected function getNames($ini, $end): string
|
||||
{
|
||||
$names = substr($this->line, $ini, $end - $ini);
|
||||
if (!str_contains($names, ',')) {
|
||||
return str_replace('`', "'", $names);
|
||||
}
|
||||
$names = explode(', ', $names);
|
||||
$columns = array_map(function($name) {return str_replace('`', "'", $name);}, $names);
|
||||
return '[' . implode(', ', $columns) . ']';
|
||||
}
|
||||
}
|
||||
class MigrationGenerator
|
||||
{
|
||||
public function __construct(protected Config $settings)
|
||||
{
|
||||
$this->databaseName = $settings->getEnv('DB_DATABASE');
|
||||
$this->migrationsPath = $settings->getMigrationsPath();
|
||||
$this->startDate = $settings->getStartDate();
|
||||
$this->database = new Incoviba\Common\Implement\Database\MySQL($settings->getEnv('DB_HOST'), $settings->getEnv('DB_DATABASE'), $settings->getEnv('DB_USER'), $settings->getEnv('DB_PASSWORD'));
|
||||
$this->connection = new Incoviba\Common\Implement\Connection($this->database, new Incoviba\Common\Implement\Database\Query\Builder());
|
||||
$this->tableRepository = new TableRepository($this->connection, $this->databaseName);
|
||||
$this->logger = $settings->getLogger();
|
||||
}
|
||||
|
||||
public function run(bool $execute = true): void
|
||||
{
|
||||
$this->logger->output('Running generate migrations' . (($execute) ? '' : ' [dry-run]'), 250);
|
||||
foreach ($this->tableRepository->getTables() as $tableName) {
|
||||
if (in_array($tableName, $this->settings->getSkip())) {
|
||||
continue;
|
||||
}
|
||||
$this->logger->output("Table: {$tableName}");
|
||||
$filename = $this->buildFilename($tableName);
|
||||
if ($execute) {
|
||||
$this->logger->debug("Filename: {$filename}");
|
||||
} else {
|
||||
$this->logger->output("Filename: {$filename}");
|
||||
}
|
||||
$content = $this->buildFile($tableName);
|
||||
$this->logger->debug("Content: {$content}");
|
||||
|
||||
if ($execute) {
|
||||
$status = file_put_contents($filename, $content);
|
||||
$this->logger->debug("Saved: " . var_export($status, true));
|
||||
try {
|
||||
$this->registerMigration($tableName);
|
||||
} catch (PDOException $exception) {
|
||||
$this->logger->warning($exception);
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->logger->output("Total tables migrated: " . count($this->tableRepository->getTables()), 250);
|
||||
}
|
||||
|
||||
protected Incoviba\Common\Define\Database $database;
|
||||
protected Incoviba\Common\Define\Connection $connection;
|
||||
protected string $databaseName;
|
||||
protected string $migrationsPath;
|
||||
protected DateTimeInterface $startDate;
|
||||
protected TableRepository $tableRepository;
|
||||
protected Logger $logger;
|
||||
|
||||
protected function buildFilename(string $table): string
|
||||
{
|
||||
$i = $this->tableRepository->getTableIndex($table);
|
||||
$time = $this->startDate->add(new DateInterval("PT{$i}S"));
|
||||
return implode(DIRECTORY_SEPARATOR, [
|
||||
$this->migrationsPath,
|
||||
"{$time->format('YmdHis')}_create_{$table}.php"
|
||||
]);
|
||||
}
|
||||
protected function buildClassName(string $table): string
|
||||
{
|
||||
return 'Create' . str_replace(' ', '', ucwords(str_replace('_', ' ', $table)));
|
||||
}
|
||||
protected function buildHeader(): string
|
||||
{
|
||||
return "<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
";
|
||||
}
|
||||
protected function buildClass(string $table): string
|
||||
{
|
||||
return "class {$this->buildClassName($table)} extends Phinx\Migration\AbstractMigration";
|
||||
}
|
||||
protected function buildFunction(string $table): string
|
||||
{
|
||||
$output = ["{", "\tpublic function change(): void", "\t{"];
|
||||
$output []= $this->buildInitialSetup();
|
||||
$this->tableRepository->getTableDefinition($table);
|
||||
$output []= $this->tableRepository->parseTableDefinition($table);
|
||||
$output []= $this->buildFinalSetup();
|
||||
$output []= "\t}";
|
||||
return implode(PHP_EOL, $output);
|
||||
}
|
||||
protected function buildInitialSetup(): string
|
||||
{
|
||||
return implode(PHP_EOL, [
|
||||
"\t\t\$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');",
|
||||
"\t\t\$this->execute(\"ALTER DATABASE CHARACTER SET 'utf8mb4';\");",
|
||||
"\t\t\$this->execute(\"ALTER DATABASE COLLATE='utf8mb4_general_ci';\");",
|
||||
''
|
||||
]);
|
||||
}
|
||||
protected function buildFinalSetup(): string
|
||||
{
|
||||
return "\t\t\$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');";
|
||||
}
|
||||
protected function buildFile(string $table): string
|
||||
{
|
||||
return implode(PHP_EOL, [
|
||||
$this->buildHeader(),
|
||||
$this->buildClass($table),
|
||||
$this->buildFunction($table),
|
||||
'}',
|
||||
''
|
||||
]);
|
||||
}
|
||||
protected function registerMigration(string $table): void
|
||||
{
|
||||
$i = $this->tableRepository->getTableIndex($table);
|
||||
$time = $this->startDate->add(new DateInterval("PT{$i}S"));
|
||||
$this->logger->output("Registering migration: {$time->format('Y-m-d H:i:s')}");
|
||||
$migrationName = $this->buildClassName($table);
|
||||
|
||||
$query = $this->connection->getQueryBuilder()
|
||||
->insert()
|
||||
->into('phinxlog')
|
||||
->columns(['version', 'migration_name', 'start_time', 'end_time', 'breakpoint'])
|
||||
->values(['?', '?', '?', '?', 0]);
|
||||
|
||||
$this->connection->execute($query, [
|
||||
$time->format('YmdHis'),
|
||||
$migrationName,
|
||||
$time->format('Y-m-d H:i:s'),
|
||||
$time->format('Y-m-d H:i:s')
|
||||
]);
|
||||
}
|
||||
}
|
||||
class SeedGenerator
|
||||
{
|
||||
public function __construct(protected Config $settings)
|
||||
{
|
||||
$this->databaseName = $settings->getEnv('DB_DATABASE');
|
||||
$this->seedsPath = $settings->getSeedsPath();
|
||||
$this->startDate = $settings->getStartDate();
|
||||
$this->database = new Incoviba\Common\Implement\Database\MySQL($settings->getEnv('DB_HOST'), $settings->getEnv('DB_DATABASE'), $settings->getEnv('DB_USER'), $settings->getEnv('DB_PASSWORD'));
|
||||
$this->connection = new Incoviba\Common\Implement\Connection($this->database, new Incoviba\Common\Implement\Database\Query\Builder());
|
||||
$this->tableRepository = new TableRepository($this->connection, $this->databaseName);
|
||||
$this->dataRepository = new DataRepository($this->connection);
|
||||
$this->logger = $settings->getLogger();
|
||||
}
|
||||
|
||||
public function run(bool $execute = true): void
|
||||
{
|
||||
$this->logger->output('Running generate seeds' . (($execute) ? '' : ' [dry-run]'), 250);
|
||||
$tables = $this->tableRepository->getTables();
|
||||
foreach ($tables as $table) {
|
||||
if (in_array($table, $this->settings->getSkip())) {
|
||||
continue;
|
||||
}
|
||||
$this->logger->output("Table: {$table}");
|
||||
$filename = $this->buildFilename($table);
|
||||
if ($execute) {
|
||||
$this->logger->debug("Filename: {$filename}");
|
||||
} else {
|
||||
$this->logger->output("Filename: {$filename}");
|
||||
}
|
||||
$content = $this->buildFile($table);
|
||||
$this->logger->debug("Content: {$content}");
|
||||
|
||||
if ($execute) {
|
||||
$status = file_put_contents($filename, $content);
|
||||
$this->logger->debug("Saved: " . var_export($status, true));
|
||||
}
|
||||
}
|
||||
$this->logger->output("Total tables seeded: " . count($this->tableRepository->getTables()), 250);
|
||||
}
|
||||
|
||||
protected Incoviba\Common\Define\Database $database;
|
||||
protected Incoviba\Common\Define\Connection $connection;
|
||||
protected string $databaseName;
|
||||
protected string $seedsPath;
|
||||
protected DateTimeInterface $startDate;
|
||||
protected TableRepository $tableRepository;
|
||||
protected DataRepository $dataRepository;
|
||||
protected Logger $logger;
|
||||
|
||||
protected function buildFilename(string $table): string
|
||||
{
|
||||
$i = $this->tableRepository->getTableIndex($table);
|
||||
$time = $this->startDate->add(new DateInterval("PT{$i}S"));
|
||||
return implode(DIRECTORY_SEPARATOR, [
|
||||
$this->seedsPath,
|
||||
"{$time->format('YmdHis')}_{$table}_seeder.php"
|
||||
]);
|
||||
}
|
||||
protected function buildFile(string $table): string
|
||||
{
|
||||
return implode(PHP_EOL, [
|
||||
$this->buildHeader(),
|
||||
$this->buildClass($table),
|
||||
"{",
|
||||
$this->buildFunction($table),
|
||||
'}',
|
||||
''
|
||||
]);
|
||||
}
|
||||
protected function buildHeader(): string
|
||||
{
|
||||
return "<?php
|
||||
|
||||
use Phinx\Seed\AbstractSeed;
|
||||
";
|
||||
}
|
||||
protected function buildClass(string $table): string
|
||||
{
|
||||
return "class {$this->buildClassName($table)} extends AbstractSeed";
|
||||
}
|
||||
protected function buildClassName(string $table): string
|
||||
{
|
||||
return str_replace(' ', '', ucwords(str_replace('_', ' ', $table))) . 'Seeder';
|
||||
}
|
||||
protected function buildFunction(string $table): string
|
||||
{
|
||||
return implode(PHP_EOL, [
|
||||
"\tpublic function run(): void",
|
||||
"\t{",
|
||||
$this->buildData($table),
|
||||
"",
|
||||
$this->buildInitialSetup(),
|
||||
"\t\t\$this->table('{$table}')",
|
||||
"\t\t\t->insert(\$data)",
|
||||
"\t\t\t->saveData();",
|
||||
$this->buildFinalSetup(),
|
||||
"\t}"
|
||||
]);
|
||||
}
|
||||
protected function buildData(string $table): string
|
||||
{
|
||||
$output = ["\t\t\$data = ["];
|
||||
$dataGenerator = $this->dataRepository->getData($table);
|
||||
foreach ($dataGenerator as $row) {
|
||||
$output []= "\t\t\t[";
|
||||
foreach ($row as $key => $value) {
|
||||
if (is_bool($value)) {
|
||||
$value = $value ? 1 : 0;
|
||||
}
|
||||
if (!ctype_digit("{$value}") and $value !== null) {
|
||||
if (str_contains($value, "'")) {
|
||||
$value = str_replace("'", "\'", $value);
|
||||
}
|
||||
$value = "'{$value}'";
|
||||
}
|
||||
if ($value === null) {
|
||||
$value = 'null';
|
||||
}
|
||||
if (strlen($value) > 2 and str_starts_with($value, '0')) {
|
||||
$value = "'{$value}'";
|
||||
}
|
||||
$output []= "\t\t\t\t'{$key}' => {$value},";
|
||||
}
|
||||
$output []= "\t\t\t],";
|
||||
}
|
||||
$output []= "\t\t];";
|
||||
$this->logger->debug("Total data: {$this->dataRepository->size}");
|
||||
return implode(PHP_EOL, $output);
|
||||
}
|
||||
protected function buildInitialSetup(): string
|
||||
{
|
||||
return "\t\t\$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');";
|
||||
}
|
||||
protected function buildFinalSetup(): string
|
||||
{
|
||||
return "\t\t\$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');";
|
||||
}
|
||||
}
|
||||
|
||||
class Logger
|
||||
{
|
||||
public function __construct(protected bool $verbose = false, protected $quiet = false) {}
|
||||
|
||||
protected array $loggers;
|
||||
|
||||
public function registerLog(Psr\Log\LoggerInterface $logger): Logger
|
||||
{
|
||||
$this->loggers['log'] = $logger;
|
||||
return $this;
|
||||
}
|
||||
public function registerOutput(Psr\Log\LoggerInterface $logger): Logger
|
||||
{
|
||||
$this->loggers['output'] = $logger;
|
||||
return $this;
|
||||
}
|
||||
public function log(string $message, int $level = 200): void
|
||||
{
|
||||
if ($this->canLogLevel($level)) {
|
||||
$this->loggers['log']->log($level, $message);
|
||||
}
|
||||
}
|
||||
public function output(string $message, int $level = 200): void
|
||||
{
|
||||
if ($this->canLogLevel($level)) {
|
||||
$this->loggers['output']->log($level, $message);
|
||||
$this->log($message, $level);
|
||||
}
|
||||
}
|
||||
public function __call(string $name, array $arguments)
|
||||
{
|
||||
if (method_exists($this->loggers['log'], $name)) {
|
||||
$levelMap = [
|
||||
'debug' => 100,
|
||||
'info' => 200,
|
||||
'notice' => 250,
|
||||
'warning' => 300,
|
||||
'error' => 400,
|
||||
'critical' => 500,
|
||||
'alert' => 550,
|
||||
'emergency' => 600
|
||||
];
|
||||
$level = $levelMap[strtolower($name)];
|
||||
$this->log($arguments[0], $level);
|
||||
}
|
||||
}
|
||||
|
||||
protected function canLogLevel(int $level): bool
|
||||
{
|
||||
$minQuiet = 300;
|
||||
$maxVerbose = 250;
|
||||
|
||||
if ($this->quiet) {
|
||||
return $level >= $minQuiet;
|
||||
}
|
||||
if ($this->verbose) {
|
||||
return true;
|
||||
}
|
||||
return $level >= $maxVerbose;
|
||||
}
|
||||
}
|
||||
class Config
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
$this->opts = getopt('d:m:s:r:vq', ['date:', 'migrations:', 'seeds:', 'run:', 'verbose', 'quiet']);
|
||||
}
|
||||
|
||||
public function getStartDate(): DateTimeInterface
|
||||
{
|
||||
$dateString = '20141101080000';
|
||||
if (isset($this->opts['d']) or isset($this->opts['date'])) {
|
||||
$dateString = $this->opts['d'] ?? $this->opts['date'];
|
||||
}
|
||||
return new DateTimeImmutable($dateString);
|
||||
}
|
||||
public function getMigrationsPath(): string
|
||||
{
|
||||
$migrationsPath = implode(DIRECTORY_SEPARATOR, [__DIR__, 'resources', 'database', 'migrations']);
|
||||
if (isset($this->opts['m']) or isset($this->opts['migrations'])) {
|
||||
$migrationsPath = $this->opts['m'] ?? $this->opts['migrations'];
|
||||
}
|
||||
return $migrationsPath;
|
||||
}
|
||||
public function getSeedsPath(): string
|
||||
{
|
||||
$seedsPath = implode(DIRECTORY_SEPARATOR, [__DIR__, 'resources', 'database', 'seeds']);
|
||||
if (isset($this->opts['s']) or isset($this->opts['seeds'])) {
|
||||
$seedsPath = $this->opts['s'] ?? $this->opts['seeds'];
|
||||
}
|
||||
return $seedsPath;
|
||||
}
|
||||
public function getRun(): int
|
||||
{
|
||||
$option = 0;
|
||||
if (isset($this->opts['r']) or isset($this->opts['run'])) {
|
||||
$option = $this->opts['r'] ?? $this->opts['run'];
|
||||
}
|
||||
if (ctype_digit("{$option}")) {
|
||||
return (int) $option;
|
||||
}
|
||||
return match($option) {
|
||||
'm', 'migrations' => 1,
|
||||
's', 'seeds' => 2,
|
||||
'a', 'all' => 3,
|
||||
default => 0
|
||||
};
|
||||
}
|
||||
public function getEnv(string $name): mixed
|
||||
{
|
||||
return $_ENV[$name];
|
||||
}
|
||||
public function getLogger(): Logger
|
||||
{
|
||||
return (new Logger($this->isVerbose(), $this->isQuiet()))
|
||||
->registerLog($this->getPsrLogger())
|
||||
->registerOutput(new Monolog\Logger('output', [
|
||||
new Monolog\Handler\FilterHandler(
|
||||
(new Monolog\Handler\StreamHandler(STDOUT))
|
||||
->setFormatter(new Monolog\Formatter\LineFormatter(null, null, false, true)),
|
||||
Monolog\Level::Info,
|
||||
Monolog\Level::Notice
|
||||
)
|
||||
], [
|
||||
new Monolog\Processor\ProcessIdProcessor(),
|
||||
new Monolog\Processor\MemoryUsageProcessor(),
|
||||
new Monolog\Processor\MemoryPeakUsageProcessor(),
|
||||
new Monolog\Processor\PsrLogMessageProcessor()
|
||||
]));
|
||||
}
|
||||
public function getPsrLogger(): Psr\Log\LoggerInterface
|
||||
{
|
||||
return new Monolog\Logger('migrations',
|
||||
[
|
||||
(new Monolog\Handler\RotatingFileHandler('/logs/migrations.log'))
|
||||
->setFormatter(new Monolog\Formatter\LineFormatter(null, null, false, false, true)),
|
||||
], [
|
||||
new Monolog\Processor\ProcessIdProcessor(),
|
||||
new Monolog\Processor\MemoryUsageProcessor(),
|
||||
new Monolog\Processor\MemoryPeakUsageProcessor(),
|
||||
new Monolog\Processor\PsrLogMessageProcessor()
|
||||
]
|
||||
);
|
||||
}
|
||||
public function setSkip(string|array $skip): Config
|
||||
{
|
||||
if (is_string($skip)) {
|
||||
$skip = [$skip];
|
||||
}
|
||||
$this->skip = [...$this->skip ?? [], ...$skip];
|
||||
return $this;
|
||||
}
|
||||
public function getSkip(): array
|
||||
{
|
||||
return $this->skip;
|
||||
}
|
||||
public function isVerbose(): bool
|
||||
{
|
||||
return isset($this->opts['v']) or isset($this->opts['verbose']);
|
||||
}
|
||||
public function isQuiet(): bool
|
||||
{
|
||||
return isset($this->opts['q']) or isset($this->opts['quiet']);
|
||||
}
|
||||
|
||||
protected array $opts;
|
||||
protected array $skip;
|
||||
}
|
||||
|
||||
$config = new Config();
|
||||
$config->setSkip([
|
||||
'monolog',
|
||||
'phinxlog',
|
||||
'personas',
|
||||
'datos_personas',
|
||||
'proveedores',
|
||||
'datos_proveedores'
|
||||
]);
|
||||
|
||||
Monolog\ErrorHandler::register($config->getPsrLogger());
|
||||
try {
|
||||
$generator = new MigrationGenerator($config);
|
||||
$seeder = new SeedGenerator($config);
|
||||
|
||||
switch ($config->getRun()) {
|
||||
case 0:
|
||||
$generator->run(false);
|
||||
$seeder->run(false);
|
||||
break;
|
||||
case 3:
|
||||
$generator->run();
|
||||
$seeder->run();
|
||||
break;
|
||||
case 1:
|
||||
$generator->run();
|
||||
break;
|
||||
case 2:
|
||||
$seeder->run();
|
||||
break;
|
||||
}
|
||||
} catch (Exception $exception) {
|
||||
$config->getLogger()->warning($exception);
|
||||
} catch (Error $error) {
|
||||
$config->getLogger()->error($error);
|
||||
}
|
46
app/phinx.php
Normal file
46
app/phinx.php
Normal file
@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
return
|
||||
[
|
||||
'paths' => [
|
||||
'migrations' => '%%PHINX_CONFIG_DIR%%/resources/database/migrations',
|
||||
'seeds' => '%%PHINX_CONFIG_DIR%%/resources/database/seeds'
|
||||
],
|
||||
'environments' => [
|
||||
'default_migration_table' => 'phinxlog',
|
||||
'default_environment' => 'development',
|
||||
'production' => [
|
||||
'adapter' => 'mysql',
|
||||
'host' => $_ENV['DB_HOST'] ?? 'localhost',
|
||||
'name' => $_ENV['DB_DATABASE'],
|
||||
'user' => $_ENV['DB_USER'],
|
||||
'pass' => $_ENV['DB_PASSWORD'],
|
||||
'port' => '3306',
|
||||
'charset' => 'utf8',
|
||||
],
|
||||
'development' => [
|
||||
'adapter' => 'mysql',
|
||||
'host' => $_ENV['DB_HOST'] ?? 'localhost',
|
||||
'name' => $_ENV['DB_DATABASE'],
|
||||
'user' => $_ENV['DB_USER'],
|
||||
'pass' => $_ENV['DB_PASSWORD'],
|
||||
'port' => '3306',
|
||||
'charset' => 'utf8',
|
||||
],
|
||||
'testing' => [
|
||||
'adapter' => 'mysql',
|
||||
'host' => $_ENV['DB_HOST'] ?? 'localhost',
|
||||
'name' => $_ENV['DB_DATABASE'],
|
||||
'user' => $_ENV['DB_USER'],
|
||||
'pass' => $_ENV['DB_PASSWORD'],
|
||||
'port' => '3306',
|
||||
'charset' => 'utf8',
|
||||
]
|
||||
],
|
||||
'version_order' => 'creation',
|
||||
'schema_file' => '%%PHINX_CONFIG_DIR%%/resources/database/schema.php',
|
||||
'foreign_keys' => true,
|
||||
'generate_migration_name' => true,
|
||||
'default_migration_prefix' => 'incoviba_',
|
||||
'mark_generated_migration' => true
|
||||
];
|
42
app/phpunit.xml
Normal file
42
app/phpunit.xml
Normal file
@ -0,0 +1,42 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<phpunit
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/11.4/phpunit.xsd"
|
||||
bootstrap="test.bootstrap.php"
|
||||
cacheDirectory="/code/cache/tests"
|
||||
executionOrder="depends,defects"
|
||||
requireCoverageMetadata="false"
|
||||
beStrictAboutCoverageMetadata="false"
|
||||
beStrictAboutOutputDuringTests="true"
|
||||
colors="true"
|
||||
failOnRisky="false"
|
||||
failOnWarning="false">
|
||||
<testsuites>
|
||||
<testsuite name="unit">
|
||||
<directory>tests/unit</directory>
|
||||
</testsuite>
|
||||
<testsuite name="acceptance">
|
||||
<directory>tests/integration</directory>
|
||||
</testsuite>
|
||||
<testsuite name="performance">
|
||||
<directory>tests/performance</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
<source restrictNotices="true" restrictWarnings="true" ignoreIndirectDeprecations="true">
|
||||
<include>
|
||||
<directory>src</directory>
|
||||
<directory>common</directory>
|
||||
</include>
|
||||
</source>
|
||||
<!--<coverage pathCoverage="false" ignoreDeprecatedCodeUnits="true" disableCodeCoverageIgnore="true">
|
||||
<report>
|
||||
<html outputDirectory="/code/public/coverage/html"/>
|
||||
</report>
|
||||
</coverage>-->
|
||||
<logging>
|
||||
<junit outputFile="/code/cache/tests/junit.xml"/>
|
||||
<teamcity outputFile="/code/cache/tests/teamcity.txt"/>
|
||||
<!--<testdoxHtml outputFile="/code/public/tests/testdox.html"/>-->
|
||||
<testdoxText outputFile="/code/cache/tests/testdox.txt"/>
|
||||
</logging>
|
||||
</phpunit>
|
BIN
app/public/favicon.ico
Normal file
BIN
app/public/favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 894 B |
@ -13,3 +13,12 @@ try {
|
||||
$app->getContainer()->get(Psr\Log\LoggerInterface::class)->notice($exception);
|
||||
header('Location: /construccion');
|
||||
}
|
||||
register_shutdown_function(function() {
|
||||
$error = error_get_last();
|
||||
|
||||
$fatal_errors = [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR];
|
||||
if ($error !== null and in_array($error['type'], $fatal_errors, true)) {
|
||||
error_log(json_encode($error).PHP_EOL,3, '/logs/fatal.log');
|
||||
}
|
||||
error_clear_last();
|
||||
});
|
||||
|
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateAction extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('action')
|
||||
->addColumn('description', 'string', ['length' => 50, 'null' => false])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateAgente extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('agente')
|
||||
->addColumn('tipo', 'integer', ['length' => 11, 'default' => null, 'null' => true])
|
||||
->addColumn('rut', 'integer', ['length' => 11, 'default' => null, 'null' => true])
|
||||
->addColumn('descripcion', 'string', ['length' => 100, 'default' => null, 'null' => true])
|
||||
->addColumn('representante', 'string', ['length' => 100, 'default' => null, 'null' => true])
|
||||
->addColumn('telefono', 'integer', ['length' => 11, 'default' => null, 'null' => true])
|
||||
->addColumn('correo', 'string', ['length' => 50, 'default' => null, 'null' => true])
|
||||
->addColumn('direccion', 'integer', ['length' => 11, 'default' => null, 'null' => true])
|
||||
->addColumn('giro', 'text', ['default' => null, 'null' => true])
|
||||
->addColumn('abreviacion', 'string', ['length' => 20, 'default' => null, 'null' => true])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateAgenteTipo extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('agente_tipo')
|
||||
->addColumn('agente', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('tipo', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addForeignKey('agente', 'agente', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->addForeignKey('tipo', 'tipo_agente', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateAvanceConstruccion extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('avance_construccion')
|
||||
->addColumn('proyecto', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('fecha', 'date', ['null' => false])
|
||||
->addColumn('numero', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('avance', 'double', ['null' => false, 'signed' => false])
|
||||
->addColumn('estado_pago', 'double', ['null' => false, 'signed' => false])
|
||||
->addColumn('pagado', 'integer', ['length' => 10, 'default' => null, 'null' => true, 'signed' => false])
|
||||
->addColumn('uf', 'double', ['default' => null, 'null' => true, 'signed' => false])
|
||||
->addColumn('fecha_pagado', 'date', ['default' => null, 'null' => true])
|
||||
->addForeignKey('proyecto', 'proyecto', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateBackup extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('backup')
|
||||
->addColumn('date', 'datetime', ['default' => null, 'null' => true])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateBanco extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('banco')
|
||||
->addColumn('nombre', 'string', ['length' => 20, 'default' => null, 'null' => true])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateBonoPie extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('bono_pie')
|
||||
->addColumn('valor', 'float', ['default' => null, 'null' => true])
|
||||
->addColumn('pago', 'integer', ['length' => 11, 'default' => null, 'null' => true, 'signed' => false])
|
||||
->addForeignKey('pago', 'pago', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateCartolas extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('cartolas')
|
||||
->addColumn('cuenta_id', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('fecha', 'date', ['null' => false])
|
||||
->addColumn('cargos', 'biginteger', ['length' => 20, 'default' => 0, 'null' => false, 'signed' => false])
|
||||
->addColumn('abonos', 'biginteger', ['length' => 20, 'default' => 0, 'null' => false, 'signed' => false])
|
||||
->addColumn('saldo', 'biginteger', ['length' => 20, 'default' => 0, 'null' => false])
|
||||
->addForeignKey('cuenta_id', 'cuenta', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateCategoriasCentrosCostos extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('categorias_centros_costos')
|
||||
->addColumn('descripcion', 'string', ['length' => 255, 'null' => false])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateCentrosCostos extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('centros_costos')
|
||||
->addColumn('tipo_centro_id', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('categoria_id', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('tipo_cuenta_id', 'integer', ['length' => 10, 'default' => null, 'null' => true, 'signed' => false])
|
||||
->addColumn('cuenta_contable', 'string', ['length' => 100, 'null' => false])
|
||||
->addColumn('descripcion', 'text', ['null' => false, 'limit' => MysqlAdapter::TEXT_MEDIUM])
|
||||
->addForeignKey('tipo_centro_id', 'tipos_centros_costos', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->addForeignKey('categoria_id', 'categorias_centros_costos', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateCierre extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('cierre')
|
||||
->addColumn('proyecto', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('precio', 'double', ['null' => false])
|
||||
->addColumn('fecha', 'date', ['null' => false])
|
||||
->addColumn('relacionado', 'integer', ['length' => 1, 'default' => 0])
|
||||
->addColumn('propietario', 'integer', ['length' => 10, 'default' => 0, 'signed' => false])
|
||||
->addForeignKey('proyecto', 'proyecto', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateCobro extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('cobro')
|
||||
->addColumn('proyecto', 'integer', ['length' => 11, 'default' => null, 'null' => true])
|
||||
->addColumn('agente', 'integer', ['length' => 11, 'default' => null, 'null' => true])
|
||||
->addColumn('tipo', 'integer', ['length' => 11, 'default' => null, 'null' => true])
|
||||
->addColumn('fecha', 'date', ['default' => null, 'null' => true])
|
||||
->addColumn('valor', 'float', ['default' => null, 'null' => true])
|
||||
->addColumn('iva', 'float', ['default' => 0])
|
||||
->addColumn('uf', 'float', ['default' => null, 'null' => true])
|
||||
->addColumn('identificador', 'string', ['length' => 50, 'default' => null, 'null' => true])
|
||||
->addColumn('glosa', 'text', ['default' => null, 'null' => true, 'limit' => MysqlAdapter::TEXT_MEDIUM])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateComentario extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('comentario')
|
||||
->addColumn('venta', 'integer', ['length' => 10, 'default' => null, 'null' => true, 'signed' => false])
|
||||
->addColumn('fecha', 'datetime', ['default' => null, 'null' => true])
|
||||
->addColumn('texto', 'blob', ['default' => null, 'null' => true])
|
||||
->addColumn('estado', 'integer', ['length' => 11, 'default' => 1])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateComuna extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('comuna')
|
||||
->addColumn('descripcion', 'string', ['length' => 50, 'null' => false])
|
||||
->addColumn('provincia', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addForeignKey('provincia', 'provincia', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateConfigurations extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('configurations')
|
||||
->addColumn('name', 'string', ['length' => 30, 'null' => false])
|
||||
->addColumn('value', 'string', ['length' => 255, 'null' => false])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateCosto extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('costo')
|
||||
->addColumn('proyecto', 'integer', ['length' => 11, 'default' => null, 'null' => true])
|
||||
->addColumn('tipo', 'integer', ['length' => 11, 'default' => null, 'null' => true])
|
||||
->addColumn('valor', 'float', ['default' => null, 'null' => true])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateCredito extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('credito')
|
||||
->addColumn('banco', 'string', ['length' => 50, 'default' => null, 'null' => true])
|
||||
->addColumn('valor', 'float', ['default' => null, 'null' => true])
|
||||
->addColumn('fecha', 'date', ['default' => null, 'null' => true])
|
||||
->addColumn('uf', 'float', ['default' => null, 'null' => true])
|
||||
->addColumn('abonado', 'integer', ['length' => 1, 'default' => 0])
|
||||
->addColumn('fecha_abono', 'date', ['default' => null, 'null' => true])
|
||||
->addColumn('pago', 'integer', ['length' => 11, 'null' => false])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateCuenta extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('cuenta')
|
||||
->addColumn('inmobiliaria', 'integer', ['length' => 8, 'null' => false, 'signed' => false])
|
||||
->addColumn('banco', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('cuenta', 'string', ['length' => 50, 'null' => false])
|
||||
->addForeignKey('inmobiliaria', 'inmobiliaria', 'rut', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->addForeignKey('banco', 'banco', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateCuota extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('cuota')
|
||||
->addColumn('pie', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('fecha', 'date', ['null' => false])
|
||||
->addColumn('valor_$', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('estado', 'boolean', ['length' => 1, 'default' => 0])
|
||||
->addColumn('banco', 'string', ['length' => 20, 'null' => false])
|
||||
->addColumn('fecha_pago', 'date', ['default' => null, 'null' => true])
|
||||
->addColumn('abonado', 'boolean', ['length' => 1, 'default' => 0])
|
||||
->addColumn('fecha_abono', 'date', ['default' => null, 'null' => true])
|
||||
->addColumn('uf', 'double', ['default' => 0])
|
||||
->addColumn('pago', 'integer', ['length' => 10, 'default' => null, 'null' => true, 'signed' => false])
|
||||
->addColumn('numero', 'integer', ['length' => 10, 'default' => null, 'null' => true, 'signed' => false])
|
||||
->addForeignKey('pago', 'pago', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->addForeignKey('pie', 'pie', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateDepositos extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('depositos')
|
||||
->addColumn('cuenta_id', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('capital', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('futuro', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('inicio', 'date', ['null' => false])
|
||||
->addColumn('termino', 'date', ['null' => false])
|
||||
->addForeignKey('cuenta_id', 'cuenta', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateDireccion extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('direccion')
|
||||
->addColumn('calle', 'string', ['length' => 255, 'null' => false])
|
||||
->addColumn('numero', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('extra', 'string', ['length' => 255, 'null' => false])
|
||||
->addColumn('comuna', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addForeignKey('comuna', 'comuna', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateEntrega extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('entrega')
|
||||
->addColumn('fecha', 'date', ['null' => false])
|
||||
->addColumn('fondo_operacion', 'integer', ['length' => 11, 'default' => 0])
|
||||
->addColumn('fondo_reserva', 'integer', ['length' => 11, 'default' => 0])
|
||||
->addColumn('fecha_fondo_operacion', 'date', ['default' => null, 'null' => true])
|
||||
->addColumn('fecha_fondo_reserva', 'date', ['default' => null, 'null' => true])
|
||||
->addColumn('pago_operacion', 'integer', ['length' => 11, 'default' => null, 'null' => true])
|
||||
->addColumn('pago_reserva', 'integer', ['length' => 11, 'default' => null, 'null' => true])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateEscritura extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('escritura')
|
||||
->addColumn('valor', 'biginteger', ['length' => 20, 'null' => false])
|
||||
->addColumn('fecha', 'date', ['null' => false])
|
||||
->addColumn('uf', 'float', ['default' => null, 'null' => true])
|
||||
->addColumn('abonado', 'integer', ['length' => 11, 'default' => 0])
|
||||
->addColumn('fecha_abono', 'date', ['default' => null, 'null' => true])
|
||||
->addColumn('pago', 'integer', ['length' => 11, 'default' => null, 'null' => true])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateEstadoCierre extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('estado_cierre')
|
||||
->addColumn('cierre', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('tipo', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('fecha', 'date', ['null' => false])
|
||||
->addForeignKey('cierre', 'cierre', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->addForeignKey('tipo', 'tipo_estado_cierre', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateEstadoCobro extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('estado_cobro')
|
||||
->addColumn('cobro', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('fecha', 'date', ['null' => false])
|
||||
->addColumn('estado', 'integer', ['length' => 11, 'null' => false])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateEstadoPago extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('estado_pago')
|
||||
->addColumn('pago', 'integer', ['length' => 11, 'null' => false, 'signed' => false])
|
||||
->addColumn('fecha', 'date', ['null' => false])
|
||||
->addColumn('estado', 'integer', ['length' => 11, 'null' => false])
|
||||
->addForeignKey('estado', 'tipo_estado_pago', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateEstadoPrecio extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('estado_precio')
|
||||
->addColumn('precio', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('fecha', 'date', ['null' => false])
|
||||
->addColumn('estado', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addForeignKey('precio', 'precio', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->addForeignKey('estado', 'tipo_estado_precio', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateEstadoProblema extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('estado_problema')
|
||||
->addColumn('problema', 'integer', ['length' => 11, 'default' => null, 'null' => true])
|
||||
->addColumn('fecha', 'date', ['default' => null, 'null' => true])
|
||||
->addColumn('estado', 'enum', ['values' => ['ingreso','revision','correccion','ok'], 'default' => null, 'null' => true])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateEstadoProyecto extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('estado_proyecto')
|
||||
->addColumn('proyecto', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('estado', 'integer', ['length' => 11, 'null' => false, 'signed' => false])
|
||||
->addColumn('fecha', 'date', ['null' => false])
|
||||
->addForeignKey('proyecto', 'proyecto', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->addForeignKey('estado', 'tipo_estado_proyecto', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateEstadoProyectoAgente extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('estado_proyecto_agente')
|
||||
->addColumn('agente', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('fecha', 'date', ['null' => false])
|
||||
->addColumn('tipo', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateEstadoUnidadBloqueada extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('estado_unidad_bloqueada')
|
||||
->addColumn('unidad', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('fecha', 'date', ['null' => false])
|
||||
->addColumn('tipo', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateEstadoVenta extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('estado_venta')
|
||||
->addColumn('venta', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('estado', 'integer', ['length' => 11, 'default' => 1, 'null' => false, 'signed' => false])
|
||||
->addColumn('fecha', 'date', ['null' => false])
|
||||
->addForeignKey('estado', 'tipo_estado_venta', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->addForeignKey('venta', 'venta', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateEstadosCuentas extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('estados_cuentas')
|
||||
->addColumn('cuenta_id', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('fecha', 'date', ['null' => false])
|
||||
->addColumn('active', 'boolean', ['length' => 1, 'null' => false])
|
||||
->addForeignKey('cuenta_id', 'cuenta', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateEtapaProyecto extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('etapa_proyecto')
|
||||
->addColumn('descripcion', 'string', ['length' => 20, 'default' => null, 'null' => true])
|
||||
->addColumn('orden', 'integer', ['length' => 10, 'default' => null, 'null' => true, 'signed' => false])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateFacturaProyectoOperador extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('factura_proyecto_operador')
|
||||
->addColumn('proyecto_id', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('operador_id', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('factura', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('valor_uf', 'double', ['null' => false, 'signed' => false])
|
||||
->addColumn('valor_neto', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('iva', 'integer', ['length' => 10, 'default' => 0, 'signed' => false])
|
||||
->addForeignKey('proyecto_id', 'proyecto', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->addForeignKey('operador_id', 'agente', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateVentaDatosFacturas extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('venta_datos_facturas')
|
||||
->addColumn('venta_id', 'integer', ['length' => 10, 'signed' => false])
|
||||
->addColumn('fecha', 'date')
|
||||
->addColumn('uf', 'string', ['length' => 50]) // fecha, valor
|
||||
->addColumn('ipc', 'string', ['length' => 50]) // fecha, valor
|
||||
->addColumn('terreno', 'integer', ['signed' => false])
|
||||
->addColumn('unidades', 'text') // id, precios, prorrateo
|
||||
->addForeignKey('venta_id', 'venta', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateFacturas extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('facturas')
|
||||
->addColumn('venta_id', 'integer', ['length' => 10, 'signed' => false])
|
||||
->addColumn('index', 'integer', ['signed' => false])
|
||||
->addColumn('proporcion', 'double', ['signed' => false]) // %
|
||||
->addColumn('cliente_rut', 'integer', ['length' => 10, 'signed' => false])
|
||||
->addForeignKey('venta_id', 'venta', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->addForeignKey('cliente_rut', 'personas', 'rut', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateInmobiliaria extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('inmobiliaria', ['id' => '`rut`'])
|
||||
->addColumn('rut', 'integer', ['length' => 8, 'null' => false, 'signed' => false])
|
||||
->addColumn('dv', 'char', ['length' => 1, 'default' => null, 'null' => true])
|
||||
->addColumn('razon', 'string', ['length' => 255, 'default' => null, 'null' => true])
|
||||
->addColumn('abreviacion', 'string', ['length' => 50, 'default' => null, 'null' => true])
|
||||
->addColumn('cuenta', 'string', ['length' => 50, 'default' => null, 'null' => true])
|
||||
->addColumn('banco', 'integer', ['length' => 11, 'default' => null, 'null' => true])
|
||||
->addColumn('sociedad', 'integer', ['length' => 10, 'default' => null, 'null' => true, 'signed' => false])
|
||||
->addColumn('sigla', 'string', ['length' => 4, 'default' => null, 'null' => true])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateInmobiliariasNubox extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('inmobiliarias_nubox')
|
||||
->addColumn('inmobiliaria_rut', 'integer', ['length' => 8, 'null' => false, 'signed' => false])
|
||||
->addColumn('alias', 'string', ['length' => 100, 'null' => false])
|
||||
->addColumn('usuario', 'string', ['length' => 100, 'null' => false])
|
||||
->addColumn('contraseña', 'string', ['length' => 100, 'null' => false])
|
||||
#->addForeignKey('inmobiliaria_rut', 'inmobiliaria', 'rut', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateLocations extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('locations')
|
||||
->addColumn('controller', 'string', ['length' => 50, 'null' => false])
|
||||
->addColumn('action', 'string', ['length' => 100, 'null' => false])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateLogins extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('logins')
|
||||
->addColumn('user_id', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('time', 'datetime', ['null' => false])
|
||||
->addColumn('selector', 'string', ['length' => 255, 'null' => false])
|
||||
->addColumn('token', 'string', ['length' => 255, 'null' => false])
|
||||
->addColumn('status', 'integer', ['length' => 1, 'default' => 1, 'null' => false])
|
||||
->addForeignKey('user_id', 'users', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateMovimientos extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('movimientos')
|
||||
->addColumn('cuenta_id', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('fecha', 'date', ['null' => false])
|
||||
->addColumn('glosa', 'text', ['null' => false])
|
||||
->addColumn('documento', 'string', ['length' => 50, 'null' => false])
|
||||
->addColumn('cargo', 'biginteger', ['length' => 20, 'default' => 0, 'null' => false, 'signed' => false])
|
||||
->addColumn('abono', 'biginteger', ['length' => 20, 'default' => 0, 'null' => false, 'signed' => false])
|
||||
->addColumn('saldo', 'biginteger', ['length' => 20, 'default' => 0, 'null' => false])
|
||||
->addForeignKey('cuenta_id', 'cuenta', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateMovimientosDetalles extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('movimientos_detalles')
|
||||
->addColumn('movimiento_id', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('centro_costo_id', 'integer', ['length' => 10, 'default' => null, 'null' => true, 'signed' => false])
|
||||
->addColumn('categoria', 'string', ['length' => 100, 'default' => null, 'null' => true])
|
||||
->addColumn('detalle', 'text', ['default' => null, 'null' => true])
|
||||
->addColumn('rut', 'integer', ['length' => 11, 'default' => null, 'null' => true])
|
||||
->addColumn('digito', 'string', ['length' => 1, 'default' => null, 'null' => true])
|
||||
->addColumn('nombres', 'string', ['length' => 255, 'default' => null, 'null' => true])
|
||||
->addColumn('identificador', 'string', ['length' => 100, 'default' => null, 'null' => true])
|
||||
->addForeignKey('movimiento_id', 'movimientos', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->addForeignKey('centro_costo_id', 'centros_costos', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreatePagare extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('pagare')
|
||||
->addColumn('proyecto', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('moneda', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('capital', 'double', ['default' => 0, 'null' => false, 'signed' => false])
|
||||
->addColumn('tasa', 'double', ['default' => 0, 'null' => false, 'signed' => false])
|
||||
->addColumn('fecha', 'date', ['null' => false])
|
||||
->addColumn('fecha_banco', 'date', ['default' => '0000-00-00', 'null' => false])
|
||||
->addColumn('duracion', 'integer', ['length' => 10, 'default' => 0, 'null' => false, 'signed' => false])
|
||||
->addColumn('uf', 'double', ['default' => 0, 'null' => false, 'signed' => false])
|
||||
->addColumn('abonado', 'integer', ['length' => 10, 'default' => 0, 'null' => false, 'signed' => false])
|
||||
->addColumn('estado_pago', 'integer', ['length' => 10, 'default' => 99999999, 'null' => false, 'signed' => false])
|
||||
->addForeignKey('moneda', 'tipo_moneda_pagare', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->addForeignKey('proyecto', 'proyecto', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreatePago extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('pago')
|
||||
->addColumn('valor', 'double', ['null' => false])
|
||||
->addColumn('banco', 'integer', ['length' => 11, 'default' => null, 'null' => true])
|
||||
->addColumn('tipo', 'integer', ['length' => 11, 'default' => null, 'null' => true])
|
||||
->addColumn('identificador', 'string', ['length' => 50, 'default' => null, 'null' => true])
|
||||
->addColumn('fecha', 'date', ['default' => null, 'null' => true])
|
||||
->addColumn('uf', 'double', ['default' => null, 'null' => true])
|
||||
->addColumn('pagador', 'string', ['length' => 50, 'default' => null, 'null' => true])
|
||||
->addColumn('asociado', 'integer', ['length' => 10, 'default' => null, 'null' => true, 'signed' => false])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreatePagosCentrosCostos extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('pagos_centros_costos')
|
||||
->addColumn('pago_id', 'integer', ['length' => 11, 'null' => false, 'signed' => false])
|
||||
->addColumn('centro_costo_id', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addForeignKey('pago_id', 'pago', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->addForeignKey('centro_costo_id', 'centros_costos', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreatePermissions extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('permissions')
|
||||
->addColumn('type', 'integer', ['length' => 1, 'null' => false, 'signed' => false])
|
||||
->addColumn('ext_id', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('action_id', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('status', 'integer', ['length' => 1, 'default' => 1, 'null' => false, 'signed' => false])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreatePie extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('pie')
|
||||
->addColumn('fecha', 'date', ['null' => false])
|
||||
->addColumn('valor', 'double', ['null' => false, 'signed' => false])
|
||||
->addColumn('uf', 'double', ['default' => null, 'null' => true, 'signed' => false])
|
||||
->addColumn('cuotas', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('asociado', 'integer', ['length' => 11, 'default' => 0])
|
||||
->addColumn('reajuste', 'integer', ['length' => 11, 'default' => null, 'null' => true, 'signed' => false])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreatePrecio extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('precio')
|
||||
->addColumn('unidad', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('valor', 'double', ['null' => false])
|
||||
->addForeignKey('unidad', 'unidad', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateProblema extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('problema')
|
||||
->addColumn('venta', 'integer', ['length' => 11, 'default' => null, 'null' => true])
|
||||
->addColumn('descripcion', 'text', ['default' => null, 'null' => true, 'limit' => MysqlAdapter::TEXT_MEDIUM])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreatePromocion extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('promocion')
|
||||
->addColumn('proyecto', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('descripcion', 'string', ['length' => 50, 'null' => false])
|
||||
->addColumn('titulo', 'string', ['length' => 20, 'null' => false])
|
||||
->addColumn('fecha_inicio', 'date', ['null' => false])
|
||||
->addForeignKey('proyecto', 'proyecto', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreatePromocionVenta extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('promocion_venta', ['id' => '`promocion`,`venta`'])
|
||||
->addColumn('promocion', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('venta', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('valor', 'double', ['null' => false, 'signed' => false])
|
||||
->addForeignKey('promocion', 'promocion', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreatePropiedad extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('propiedad')
|
||||
->addColumn('unidad_principal', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('estacionamientos', 'string', ['length' => 20, 'default' => null, 'null' => true])
|
||||
->addColumn('bodegas', 'string', ['length' => 20, 'default' => null, 'null' => true])
|
||||
->addColumn('estado', 'integer', ['length' => 11, 'default' => 1])
|
||||
->addForeignKey('unidad_principal', 'unidad', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreatePropiedadUnidad extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('propiedad_unidad')
|
||||
->addColumn('propiedad', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('unidad', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('principal', 'integer', ['length' => 1, 'default' => 0, 'null' => false, 'signed' => false])
|
||||
->addColumn('valor', 'double', ['default' => 0, 'null' => false, 'signed' => false])
|
||||
->addForeignKey('unidad', 'unidad', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->addForeignKey('propiedad', 'propiedad', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreatePropietario extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('propietario', ['id' => '`rut`'])
|
||||
->addColumn('rut', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addColumn('dv', 'char', ['length' => 1, 'null' => false])
|
||||
->addColumn('nombres', 'string', ['length' => 255, 'null' => false])
|
||||
->addColumn('apellido_paterno', 'string', ['length' => 50, 'null' => false])
|
||||
->addColumn('apellido_materno', 'string', ['length' => 50, 'null' => false])
|
||||
->addColumn('sexo', 'string', ['length' => 1, 'default' => null, 'null' => true])
|
||||
->addColumn('estado_civil', 'string', ['length' => 50, 'default' => null, 'null' => true])
|
||||
->addColumn('profesion', 'string', ['length' => 100, 'default' => null, 'null' => true])
|
||||
->addColumn('direccion', 'integer', ['length' => 10, 'default' => 0, 'null' => false, 'signed' => false])
|
||||
->addColumn('telefono', 'integer', ['length' => 10, 'default' => 0, 'signed' => false])
|
||||
->addColumn('email', 'string', ['length' => 100, 'default' => null, 'null' => true])
|
||||
->addColumn('representante', 'integer', ['length' => 10, 'default' => 0])
|
||||
->addColumn('otro', 'integer', ['length' => 11, 'default' => 0])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateProvincia extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('provincia')
|
||||
->addColumn('descripcion', 'string', ['length' => 50, 'null' => false])
|
||||
->addColumn('region', 'integer', ['length' => 10, 'null' => false, 'signed' => false])
|
||||
->addForeignKey('region', 'region', 'id', ['delete' => 'cascade', 'update' => 'cascade'])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateProyectista extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('proyectista')
|
||||
->addColumn('rut', 'integer', ['length' => 11, 'default' => null, 'null' => true])
|
||||
->addColumn('nombre', 'string', ['length' => 50, 'default' => null, 'null' => true])
|
||||
->addColumn('tipo', 'integer', ['length' => 11, 'default' => null, 'null' => true])
|
||||
->addColumn('representante', 'string', ['length' => 255, 'default' => null, 'null' => true])
|
||||
->addColumn('telefono', 'integer', ['length' => 11, 'default' => null, 'null' => true])
|
||||
->addColumn('correo', 'string', ['length' => 100, 'default' => null, 'null' => true])
|
||||
->addColumn('direccion', 'integer', ['length' => 11, 'default' => null, 'null' => true])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Db\Adapter\MysqlAdapter;
|
||||
|
||||
class CreateProyectistas extends Phinx\Migration\AbstractMigration
|
||||
{
|
||||
public function change(): void
|
||||
{
|
||||
$this->execute('SET unique_checks=0; SET foreign_key_checks=0;');
|
||||
$this->execute("ALTER DATABASE CHARACTER SET 'utf8mb4';");
|
||||
$this->execute("ALTER DATABASE COLLATE='utf8mb4_general_ci';");
|
||||
|
||||
$this->table('proyectistas')
|
||||
->addColumn('proyecto', 'integer', ['length' => 11, 'default' => null, 'null' => true])
|
||||
->addColumn('proyectista', 'integer', ['length' => 11, 'default' => null, 'null' => true])
|
||||
->addColumn('fecha', 'date', ['default' => null, 'null' => true])
|
||||
->create();
|
||||
$this->execute('SET unique_checks=1; SET foreign_key_checks=1;');
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user