@@ -10,9 +10,9 @@
use App\Entity\User;
use App\Form\Model\PurposeModel;
use App\Form\Type\PurposeType;
use App\Repository\AreaRepository;
use App\Repository\PaymentRepository;
use App\Repository\PurposeRepository;
use Doctrine\ORM\EntityManagerInterface;
use Pagerfanta\Adapter\DoctrineORMAdapter;
use Pagerfanta\Pagerfanta;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
@@ -23,29 +23,16 @@
*/
final class PurposeController extends Controller
{
/**
* @var PurposeRepository
*/
private $purposeRepository;
private const PURPOSES_PER_PAGE = 20;

/**
* @var AreaRepository
* @var EntityManagerInterface
*/
private $areaRepository;
private $em;

/**
* @var PaymentRepository
*/
private $paymentRepository;

public function __construct(
PurposeRepository $purposeRepository,
AreaRepository $areaRepository,
PaymentRepository $paymentRepository
) {
$this->purposeRepository = $purposeRepository;
$this->areaRepository = $areaRepository;
$this->paymentRepository = $paymentRepository;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}

/**
@@ -54,8 +41,17 @@ public function __construct(
*/
public function indexAction($page)
{
$qb = $this->em->createQueryBuilder()
->select('entity')
->from(Purpose::class, 'entity')
->orderBy('entity.createdAt', 'DESC');

$paginator = new Pagerfanta(new DoctrineORMAdapter($qb, false));
$paginator->setMaxPerPage(self::PURPOSES_PER_PAGE);
$paginator->setCurrentPage($page);

return $this->render('purpose/index.html.twig', [
'purposes' => $this->purposeRepository->findLatest($page),
'purposes' => $paginator,
]);
}

@@ -69,15 +65,16 @@ public function newAction(Request $request)
$model = new PurposeModel();
$form = $this->createForm(PurposeType::class, $model, [
'action' => $this->generateUrl('purpose_new'),
'areas' => $this->areaRepository->findPayable(),
]);

if ($form->handleRequest($request)->isValid()) {
$entity = new Purpose($model->name, $model->amount, $model->schedule, $model->calculation);

$this->purposeRepository->save($entity);
$this->em->persist($entity);
$this->createPayments($entity, $model, $this->getUser());

$this->em->flush();

$this->addFlash('success', sprintf('Платежная цель "%s" создана!', $model->name));

return $this->redirectToRoute('purpose_index');
@@ -118,7 +115,7 @@ public function createPayments(Purpose $purpose, PurposeModel $model, User $user
$amount *= -1;
}

$this->paymentRepository->save(new Payment($area, $purpose, $user, $amount));
$this->em->persist(new Payment($area, $purpose, $user, $amount));
}
}
}
@@ -7,7 +7,7 @@
use App\Entity\Street;
use App\Form\Model\StreetModel;
use App\Form\Type\StreetType;
use App\Repository\StreetRepository;
use Doctrine\ORM\EntityManagerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
@@ -21,24 +21,21 @@
class StreetController extends Controller
{
/**
* @var StreetRepository
* @var EntityManagerInterface
*/
private $streetRepository;
private $em;

/**
* @param StreetRepository $streetRepository
*/
public function __construct(StreetRepository $streetRepository)
public function __construct(EntityManagerInterface $em)
{
$this->streetRepository = $streetRepository;
$this->em = $em;
}

/**
* @Route("/", name="street_index")
*/
public function indexAction()
{
$streets = $this->streetRepository->findAll();
$streets = $this->em->getRepository(Street::class)->findAll();

return $this->render('street/index.html.twig', [
'streets' => $streets,
@@ -55,7 +52,9 @@ public function newAction(Request $request)

if ($form->handleRequest($request)->isValid()) {
$street = new Street($streetModel->name);
$this->streetRepository->save($street);

$this->em->persist($street);
$this->em->flush();

return $this->redirectToRoute('street_index');
}
@@ -7,7 +7,9 @@
use App\Entity\Suggestion;
use App\Form\Model\Suggestion as SuggestionModel;
use App\Form\Type\SuggestionType;
use App\Repository\SuggestionRepository;
use Doctrine\ORM\EntityManagerInterface;
use Pagerfanta\Adapter\DoctrineORMAdapter;
use Pagerfanta\Pagerfanta;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
@@ -18,19 +20,21 @@
*/
final class SuggestionsController extends Controller
{
private const SUGGESTIONS_PER_PAGE = 10;

/**
* @var SuggestionRepository
* @var EntityManagerInterface
*/
private $repository;
private $em;

/**
* @var \Swift_Mailer
*/
private $mailer;

public function __construct(SuggestionRepository $repository, \Swift_Mailer $mailer)
public function __construct(EntityManagerInterface $em, \Swift_Mailer $mailer)
{
$this->repository = $repository;
$this->em = $em;
$this->mailer = $mailer;
}

@@ -42,11 +46,17 @@ public function __construct(SuggestionRepository $repository, \Swift_Mailer $mai
*/
public function indexAction($page)
{
/** @var Suggestion[] $suggestions */
$suggestions = $this->repository->findLatest($page);
$qb = $this->em->createQueryBuilder()
->select('entity')
->from(Suggestion::class, 'entity')
->orderBy('entity.createdAt', 'DESC');

$paginator = new Pagerfanta(new DoctrineORMAdapter($qb, false));
$paginator->setMaxPerPage(self::SUGGESTIONS_PER_PAGE);
$paginator->setCurrentPage($page);

return $this->render('suggestion/index.html.twig', [
'suggestions' => $suggestions,
'suggestions' => $paginator,
]);
}

@@ -61,7 +71,8 @@ public function newAction(Request $request)
$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
$this->repository->save(new Suggestion($model));
$this->em->persist(new Suggestion($model));
$this->em->flush();

$message = (new \Swift_Message())
->setFrom('no-reply@astra50.ru')
@@ -74,7 +85,7 @@ public function newAction(Request $request)
Телефон: $model->phone
Сообщение: $model->text
TEXT
);
);

$this->mailer->send($message);

@@ -7,9 +7,9 @@
use App\Entity\Payment;
use App\Form\Model\PaymentModel;
use App\Form\Type\PaymentType;
use App\Repository\AreaRepository;
use App\Repository\PaymentRepository;
use App\Repository\PurposeRepository;
use Doctrine\ORM\EntityManagerInterface;
use Pagerfanta\Adapter\DoctrineORMAdapter;
use Pagerfanta\Pagerfanta;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
@@ -23,29 +23,16 @@
*/
final class TransactionController extends Controller
{
/**
* @var PaymentRepository
*/
private $paymentRepository;
private const PAYMENTS_PER_PAGe = 50;

/**
* @var PurposeRepository
* @var EntityManagerInterface
*/
private $purposeRepository;
private $em;

/**
* @var AreaRepository
*/
private $areaRepository;

public function __construct(
PaymentRepository $paymentRepository,
PurposeRepository $purposeRepository,
AreaRepository $areaRepository
) {
$this->paymentRepository = $paymentRepository;
$this->purposeRepository = $purposeRepository;
$this->areaRepository = $areaRepository;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}

/**
@@ -54,8 +41,17 @@ public function __construct(
*/
public function indexAction(int $page): Response
{
$qb = $this->em->createQueryBuilder()
->select('entity')
->from(Payment::class, 'entity')
->orderBy('entity.createdAt', 'DESC');

$paginator = new Pagerfanta(new DoctrineORMAdapter($qb, false));
$paginator->setMaxPerPage(self::PAYMENTS_PER_PAGe);
$paginator->setCurrentPage($page);

return $this->render('transaction/index.html.twig', [
'payments' => $this->paymentRepository->findLatest($page),
'payments' => $paginator,
]);
}

@@ -65,13 +61,9 @@ public function indexAction(int $page): Response
public function newAction(Request $request): Response
{
$model = new PaymentModel();
$areas = $this->areaRepository->findPayable();
$purposes = $this->purposeRepository->findActive();

$form = $this->createForm(PaymentType::class, $model, [
'action' => $this->generateUrl('transaction_new'),
'areas' => $areas,
'purposes' => $purposes,
]);

if ($form->handleRequest($request)->isValid()) {
@@ -80,9 +72,8 @@ public function newAction(Request $request): Response
$user = $this->getUser();
$amount = $model->isPositive ? $model->amount : $model->amount * -1;

$entity = new Payment($area, $purpose, $user, $amount);

$this->paymentRepository->save($entity);
$this->em->persist(new Payment($area, $purpose, $user, $amount));
$this->em->flush();

$this->addFlash('success', sprintf('Платеж по цели "%s" для участка "%s" на сумму "%s" создан!', $purpose->getName(), $area->getNumber(), $amount / 100));

This file was deleted.

@@ -18,8 +18,6 @@ class News
{
use Identity;

public const NUM_ITEMS = 3;

/**
* @var User
*
@@ -15,7 +15,6 @@ class Payment
{
use Identity;
use CreatedAt;
public const NUM_ITEMS = 50;

/**
* @var Area
@@ -17,7 +17,6 @@ class Purpose
{
use Identity;
use CreatedAt;
public const NUM_ITEMS = 20;

public const SCHEDULE_ONCE = 1;
public const SCHEDULE_MONTHLY = 2;
@@ -15,7 +15,6 @@
class Suggestion
{
use Identity;
public const NUM_ITEMS = 10;

/**
* @var string
@@ -4,8 +4,12 @@

namespace App\Form\Type;

use App\Entity\Area;
use App\Entity\Purpose;
use App\Form\Model\PaymentModel;
use App\Form\Transformer\MoneyTransformer;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\Form\FormBuilderInterface;
@@ -22,19 +26,28 @@ class PaymentType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('purpose', Type\ChoiceType::class, [
->add('purpose', EntityType::class, [
'label' => 'Платёжная цель',
'choices' => $options['purposes'],
'class' => Purpose::class,
'query_builder' => function (EntityRepository $repository) {
return $repository->createQueryBuilder('entity')
->where('entity.archivedAt IS NULL')
->orderBy('entity.id', 'DESC');
},
'choice_label' => 'name',
'choice_value' => 'id',
'multiple' => false,
'expanded' => false,
'placeholder' => 'Выберите платёжную цель',
'translation_domain' => false,
])
->add('area', Type\ChoiceType::class, [
->add('area', EntityType::class, [
'label' => 'Участки',
'choices' => $options['areas'],
'class' => Area::class,
'query_builder' => function (EntityRepository $repository) {
return $repository->createQueryBuilder('entity')
->orderBy('entity.number + 0', 'ASC');
},
'choice_label' => 'number',
'choice_value' => 'id',
'multiple' => false,
@@ -69,10 +82,6 @@ public function configureOptions(OptionsResolver $resolver): void
$resolver
->setDefaults([
'data_class' => PaymentModel::class,
])
->setRequired([
'areas',
'purposes',
]);
}
}
@@ -4,9 +4,12 @@

namespace App\Form\Type;

use App\Entity\Area;
use App\Entity\Purpose;
use App\Form\Model\PurposeModel;
use App\Form\Transformer\MoneyTransformer;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\Form\FormBuilderInterface;
@@ -58,12 +61,23 @@ public function buildForm(FormBuilderInterface $builder, array $options): void
'expanded' => true,
'translation_domain' => false,
])
->add('areas', Type\ChoiceType::class, [
->add('areas', EntityType::class, [
'label' => 'Участки',
'choices' => $options['areas'],
'class' => Area::class,
'query_builder' => function (EntityRepository $repository) {
return $repository->createQueryBuilder('entity')
->orderBy('entity.number + 0', 'ASC');
},
'choice_label' => 'number',
'choice_value' => 'id',
'group_by' => 'street.name',
'choice_attr' => function (Area $area) {
return ['data-select-rule' => '0' === $area->getNumber() ? 'exclude' : 'include'];
},
'group_by' => function (Area $area) {
$street = $area->getStreet();

return $street ? $street->getName() : 'Без улицы';
},
'multiple' => true,
'expanded' => true,
'translation_domain' => false,
@@ -78,9 +92,6 @@ public function configureOptions(OptionsResolver $resolver): void
$resolver
->setDefaults([
'data_class' => PurposeModel::class,
])
->setRequired([
'areas',
]);
}
}
@@ -6,6 +6,7 @@

use App\Form\Model\StreetModel;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

@@ -19,7 +20,9 @@ class StreetType extends AbstractType
*/
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder->add('name');
$builder->add('name', TextType::class, [
'label' => 'Название',
]);
}

/**

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

@@ -51,7 +51,7 @@
</tr>
{% endfor %}
<tr class="{{ 0 > balance ? 'warning' : '' }}">
<td colspan="3"></td>
<td colspan="3">Баланс</td>
<td colspan="2">{{ (balance / 100)|number_format }}</td>
</tr>
</tbody>
@@ -32,11 +32,11 @@
$('input[name="{{ form.areas.vars.full_name }}[]"').each(function () {
var input = $(this);
var arr = input.attr('id').split('_');
if ("0" !== arr[arr.length - 1]) {
input.prop('checked', 'check' === $(button).data('action'));
if ('exclude' === input.data('select-rule')) {
return;
}
input.prop('checked', 'check' === $(button).data('action'));
});
});
</script>