Skip to content

Commit

Permalink
Merge branch 'release/2.7.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
fabiov committed Sep 25, 2021
2 parents ba224f6 + b016026 commit 11bd776
Show file tree
Hide file tree
Showing 11 changed files with 440 additions and 50 deletions.
2 changes: 1 addition & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ services:
context: ./docker/mysql
args:
- DB_USER=${DB_USER}
- DB_GROUP=${DB_GROUP}
# - DB_GROUP=${DB_GROUP}
ports:
- ${DB_PORT_EXPOSED}:3306
volumes:
Expand Down
2 changes: 1 addition & 1 deletion docker/mysql/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ FROM mysql:5.6
MAINTAINER @fvlgnn

ARG DB_USER
ARG DB_GROUP
#ARG DB_GROUP

#NOTE Uncomment below for enable mysql logs
#RUN sed -i "s/#log-error/log-error/g" /etc/mysql/mysql.conf.d/mysqld.cnf
Expand Down
1 change: 1 addition & 0 deletions module/Application/config/module.config.php
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@
'commonJavascript' => Application\ViewHelper\CommonJavascript::class,
'footer' => Application\ViewHelper\Footer::class,
'helpTooltip' => Application\ViewHelper\HelpTooltip::class,
'pagination' => Application\ViewHelper\Pagination::class,
'richInlineScript' => Application\ViewHelper\RichInlineScript::class,
'sbaFormRow' => Application\ViewHelper\SbaFormRow::class,
'userData' => Application\ViewHelper\UserData::class,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,27 @@

use Application\Entity\Account;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query\Expr\Join;

class AccountRepository extends EntityRepository
{
/**
* @param int $userId
* @return array<array>
*/
public function getUserAccountBalances(int $userId): array
{
$qb = $this->getEntityManager()->createQueryBuilder()
->select('a.id', 'a.name', 'a.recap', 'COALESCE(SUM(m.amount), 0) AS balance')
->from(Account::class, 'a')
->join('a.movements', 'm', Join::WITH, 'a.user=:userId')
->where("a.closed=:closed")
->setParameters([':closed' => false, ':userId' => $userId])
->groupBy('a.id');

return $qb->getQuery()->getResult();
}

/**
* @param int $userId
* @param bool $onlyRecap
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use Application\Entity\Category;
use Application\Entity\Movement;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query\Expr\Join;

class CategoryRepository extends EntityRepository
{
Expand Down Expand Up @@ -91,9 +92,19 @@ public function getSum(int $categoryId)
->createQueryBuilder()
->select('SUM(m.amount)')
->from(Category::class, 'c', 'c.id')
->innerJoin(Movement::class, 'm', 'WITH', 'c.id=m.category')
->innerJoin(Movement::class, 'm', Join::WITH, 'c.id=m.category')
->where("c.id=$categoryId")
->getQuery()
->getSingleScalarResult();
}

/**
* @param int $userId
* @param bool $active
* @return array<Category>
*/
public function getUserCategories(int $userId, bool $active = true): array
{
return $this->findBy(['active' => $active, 'user' => $userId], ['description' => 'ASC']);
}
}
106 changes: 68 additions & 38 deletions module/Application/src/Application/Repository/MovementRepository.php
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
<?php

declare(strict_types=1);

namespace Application\Repository;

use Application\Entity\Movement;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query;
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\Tools\Pagination\Paginator;

class MovementRepository extends EntityRepository
{
Expand Down Expand Up @@ -31,48 +36,28 @@ public function getBalance(int $accountId, ?\DateTime $date = null): float
}

/**
* @param array<string, string> $params
* @return array<Movement>
* @param array<string, mixed> $searchParams
* @param int $page
* @param int $limit
* @return Paginator<Movement>
*/
public function search(array $params = []): array
public function paginator(array $searchParams, int $page, int $limit): Paginator
{
$cleanParams = [];
$qb = $this->getEntityManager()
->createQueryBuilder()
->select('m')
->from(Movement::class, 'm')
->where('1=1');
$query = $this
->getQuery($searchParams)
->setFirstResult($page > 0 ? $page - 1 : 0)
->setMaxResults($limit > 0 ? $limit : 10);

if (!empty($params['accountId'])) {
$qb->andWhere('m.account = :accountId');
$cleanParams['accountId'] = $params['accountId'];
}
if (!empty($params['dateMin'])) {
$qb->andWhere('m.date >= :dateMin');
$cleanParams['dateMin'] = $params['dateMin'];
}
if (!empty($params['dateMax'])) {
$qb->andWhere('m.date <= :dateMax');
$cleanParams['dateMax'] = $params['dateMax'];
}
if (!empty($params['category'])) {
$qb->andWhere('m.category = :category');
$cleanParams['category'] = $params['category'];
}
if (!empty($params['description'])) {
$qb->andWhere('m.description LIKE :description');
$cleanParams['description'] = '%' . $params['description'] . '%';
}
if (is_numeric($params['amountMin'])) {
$qb->andWhere('m.amount >= :amountMin');
$cleanParams['amountMin'] = (float) $params['amountMin'];
}
if (is_numeric($params['amountMax'])) {
$qb->andWhere('m.amount <= :amountMax');
$cleanParams['amountMax'] = (float) $params['amountMax'];
}
return new Paginator($query);
}

return $qb->setParameters($cleanParams)->orderBy('m.date', 'DESC')->getQuery()->getResult();
/**
* @param array<string, mixed> $params
* @return array<Movement>
*/
public function search(array $params = []): array
{
return $this->getQuery($params)->getResult();
}

/**
Expand Down Expand Up @@ -117,4 +102,49 @@ public function getMovementByDay(int $userId, string $minDate, string $maxDate):

return $qb->getQuery()->getResult();
}

/**
* @param array<string, mixed> $params
* @return Query
*/
private function getQuery(array $params): Query
{
$cleanParams = ['user' => (int)$params['user']];
$qb = $this->getEntityManager()
->createQueryBuilder()
->select('m')
->from(Movement::class, 'm')
->join('m.account', 'a', Join::WITH, 'a.user=:user');

if (!empty($params['account'])) {
$qb->andWhere('m.account = :account');
$cleanParams['account'] = (int)$params['account'];
}
if (!empty($params['dateMin'])) {
$qb->andWhere('m.date >= :dateMin');
$cleanParams['dateMin'] = $params['dateMin'];
}
if (!empty($params['dateMax'])) {
$qb->andWhere('m.date <= :dateMax');
$cleanParams['dateMax'] = $params['dateMax'];
}
if (!empty($params['category'])) {
$qb->andWhere('m.category = :category');
$cleanParams['category'] = (int)$params['category'];
}
if (!empty($params['description'])) {
$qb->andWhere('m.description LIKE :description');
$cleanParams['description'] = '%' . $params['description'] . '%';
}
if (is_numeric($params['amountMin'])) {
$qb->andWhere('m.amount >= :amountMin');
$cleanParams['amountMin'] = (float)$params['amountMin'];
}
if (is_numeric($params['amountMax'])) {
$qb->andWhere('m.amount <= :amountMax');
$cleanParams['amountMax'] = (float)$params['amountMax'];
}

return $qb->setParameters($cleanParams)->orderBy('m.date', 'DESC')->getQuery();
}
}
77 changes: 77 additions & 0 deletions module/Application/src/Application/ViewHelper/Pagination.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
<?php

namespace Application\ViewHelper;

use Doctrine\ORM\Tools\Pagination\Paginator;
use Laminas\View\Helper\AbstractHelper;

class Pagination extends AbstractHelper
{
private const RANGE = 4;

/**
* @link https://getbootstrap.com/docs/3.3/components/#pagination
* @param Paginator<mixed> $paginator
* @param int $current
* @param string $route
* @param array<string, mixed> $queryParams
* @return string
* @throws \Exception
*/
public function __invoke(Paginator $paginator, int $current, string $route, array $queryParams = []): string
{
$items = '';
$totalItems = $paginator->count();
$pageSize = $paginator->getIterator()->count();
$totalPages = (int) ceil($totalItems / $pageSize);
$queryParams['limit'] = $pageSize;

// if ($current > 1) {
// $queryParams['page'] = $current - 1;
// $url = $this->view->url($route, ['action' => 'index'], ['query' => $queryParams]);
// $items .= "<li><a href=\"$url\" aria-label=\"\"><span aria-hidden=\"true\">&laquo;</span></a></li>";
// }

[$min, $max] = self::getLimits($current, $totalPages);

for ($i = $min; $i <= $max; $i++) {
if ($i === $current) {
$items .= "<li class=\"active\"><span>$i</span></li>";
} else {
$queryParams['page'] = $i;
$url = $this->view->url($route, ['action' => 'index'], ['query' => $queryParams]);
$items .= "<li><a href=\"$url\">$i</a></li>";
}
}

// if ($current < $totalPages) {
// $queryParams['page'] = $current + 1;
// $url = $this->view->url($route, ['action' => 'index'], ['query' => $queryParams]);
// $items .= "<li><a href=\"$url\" aria-label=\"\"><span aria-hidden=\"true\">&raquo;</span></a></li>";
// }

return "<nav aria-label=\"Page navigation\"><ul class=\"pagination\">$items</ul></nav>";
}

/**
* @param int $current
* @param int $totalPages
* @return array<int>
*/
private static function getLimits(int $current, int $totalPages): array
{
$min = $current;
$max = $current;

while ($max - $min < 2 * self::RANGE && ($min > 1 || $max < $totalPages)) {
if ($min > 1) {
$min--;
}
if ($max < $totalPages) {
$max++;
}
}

return [$min, $max];
}
}
51 changes: 44 additions & 7 deletions module/MoneyLog/src/MoneyLog/Controller/MovementController.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,43 @@ class MovementController extends AbstractActionController
public function __construct(LoggedUser $user, EntityManagerInterface $em)
{
$this->user = $user;
$this->em = $em;
$this->em = $em;
}

public function indexAction(): ViewModel
{
$page = (int) $this->getRequest()->getQuery('page', 1);
$pageSize = (int) $this->getRequest()->getQuery('limit', 25);
$userId = $this->user->getId();

/** @var AccountRepository $accountRepository */
$accountRepository = $this->em->getRepository(Account::class);

/** @var \Application\Repository\CategoryRepository $categoryRepository */
$categoryRepository = $this->em->getRepository(Category::class);

/** @var \Application\Repository\MovementRepository $movementRepository */
$movementRepository = $this->em->getRepository(Movement::class);

$params = $this->params();
$searchParams = [
'account' => $params->fromQuery('account'),
'amountMax' => $params->fromQuery('amountMax'),
'amountMin' => $params->fromQuery('amountMin'),
'category' => $params->fromQuery('category'),
'dateMax' => $params->fromQuery('dateMax', date('Y-m-d')),
'dateMin' => $params->fromQuery('dateMin', date('Y-m-d', strtotime('-3 months'))),
'description' => $params->fromQuery('description'),
];

return new ViewModel([
'accounts' => $accountRepository->findBy(['closed' => false, 'user' => $userId], ['name' => 'ASC']),
'balances' => $accountRepository->getUserAccountBalances($userId),
'categories' => $categoryRepository->getUserCategories($userId),
'page' => $page,
'paginator' => $movementRepository->paginator(array_merge($searchParams, ['user' => $userId]), $page, $pageSize),
'searchParams' => $searchParams,
]);
}

/**
Expand All @@ -37,13 +73,14 @@ public function accountAction()
$dateMin = $this->params()->fromQuery('dateMin', date('Y-m-d', strtotime('-3 months')));
$dateMax = $this->params()->fromQuery('dateMax', date('Y-m-d'));
$searchParams = [
'accountId' => $accountId,
'amountMax' => $this->params()->fromQuery('amountMax'),
'amountMin' => $this->params()->fromQuery('amountMin'),
'category' => $this->params()->fromQuery('category'),
'dateMax' => $dateMax,
'dateMin' => $dateMin,
'account' => $accountId,
'amountMax' => $this->params()->fromQuery('amountMax'),
'amountMin' => $this->params()->fromQuery('amountMin'),
'category' => $this->params()->fromQuery('category'),
'dateMax' => $dateMax,
'dateMin' => $dateMin,
'description' => $this->params()->fromQuery('description'),
'user' => $this->user->getId(),
];

$criteria = ['id' => $accountId, 'user' => $this->user->getId()];
Expand Down
2 changes: 1 addition & 1 deletion module/MoneyLog/view/money-log/movement/account.phtml
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ $morrisData = array();
<thead>
<tr>
<th>Data</th>
<th>Importo</th>
<th style="min-width: 70px;">Importo</th>
<th>Descrizione</th>
<th>Categoria</th>
<th>Azioni</th>
Expand Down
Loading

0 comments on commit 11bd776

Please sign in to comment.