<?php
namespace App\Parcels;
use App\Entity\CollectedParcel;
use App\Entity\Delivery;
use App\Entity\Transaction;
use App\Entity\UserStation;
use App\Entity\TransactionExpense;
use App\Entity\WayBill;
use Doctrine\Persistence\ManagerRegistry;
use Doctrine\Persistence\ObjectManager;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Validator\Constraints\NotBlank;
class DefaultController extends AbstractController
{
private ObjectManager $em;
public function __construct(ManagerRegistry $managerRegistry)
{
$this->em = $managerRegistry->getManager();
}
/**
* @Route("/", name="parcels_homepage")
*/
public function indexAction(Request $request){
$em = $this->em;
/** @var UserStation $userTown */
$userTown = $em->getRepository(UserStation::class)->findOneBy([
'user' => $this->getUser(),
'isActive' => true
], ['id'=>'DESC']);
$form = $this->searchWaybill();
$form->handleRequest($request);
$lastDay = $this->getLastActivityDate();
$dashboardCounts = $userTown ? $this->getDashboardCounts($userTown->getStation(), $lastDay) : null;
if($form->isSubmitted()){
$wayb = $form->getData()['waybill'];
$waybill = $em->getRepository(WayBill::class)->findOneBy([
'id' => $wayb
]);
if(!$waybill){
$form->get('waybill')->addError(new FormError(
"waybill {$wayb} does not exist"
));
}
if($form->isValid()){
// continue here
return $this->redirectToRoute('one_way_bill',['id'=>$wayb]);
}
}
// replace this example code with whatever you need
return $this->render('fos/home/home.html.twig', [
'user_town' => $userTown,
'form' => $form->createView(),
'dashboard_counts' => $dashboardCounts,
'dashboard_day' => $lastDay
]);
}
/**
* The most recent calendar date that has any waybill activity in the system.
* Falls back to today when the system has no data yet.
*/
private function getLastActivityDate(): \DateTimeImmutable
{
$lastCreatedAt = $this->em->createQueryBuilder()
->select('MAX(w.createdAt)')
->from(WayBill::class, 'w')
->getQuery()
->getSingleScalarResult();
return $lastCreatedAt ? new \DateTimeImmutable($lastCreatedAt) : new \DateTimeImmutable();
}
/**
* Per-tile dashboard counts, scoped to a single station and a single calendar day.
*/
private function getDashboardCounts($station, \DateTimeImmutable $day): array
{
$em = $this->em;
$dayStart = $day->setTime(0, 0, 0);
$dayEnd = $day->setTime(23, 59, 59);
$outgoing = (int) $em->createQueryBuilder()
->select('COUNT(d.id)')
->from(Delivery::class, 'd')
->andWhere('d.originStation = :station')
->andWhere('d.isReceived = false')
->andWhere('d.createdAt BETWEEN :start AND :end')
->setParameter('station', $station)
->setParameter('start', $dayStart)
->setParameter('end', $dayEnd)
->getQuery()
->getSingleScalarResult();
$incoming = (int) $em->createQueryBuilder()
->select('COUNT(d.id)')
->from(Delivery::class, 'd')
->andWhere('d.destination = :station')
->andWhere('d.isReceivedFully = false')
->andWhere('d.isVerified = true')
->andWhere('d.createdAt BETWEEN :start AND :end')
->setParameter('station', $station)
->setParameter('start', $dayStart)
->setParameter('end', $dayEnd)
->getQuery()
->getSingleScalarResult();
$uncollected = (int) $em->createQueryBuilder()
->select('COUNT(DISTINCT d.id)')
->from(Delivery::class, 'd')
->join('d.parcels', 'dp')
->join('dp.parcel', 'p')
->join('p.waybill', 'w')
->andWhere('d.destination = :station')
->andWhere('d.isReceived = true')
->andWhere('d.isVerified = true')
->andWhere('w.isCollected = false')
->andWhere('d.receivedAt BETWEEN :start AND :end')
->setParameter('station', $station)
->setParameter('start', $dayStart)
->setParameter('end', $dayEnd)
->getQuery()
->getSingleScalarResult();
$collected = (int) $em->createQueryBuilder()
->select('COUNT(cp.id)')
->from(CollectedParcel::class, 'cp')
->join('cp.waybill', 'w')
->andWhere('w.toStation = :station')
->andWhere('cp.createdAt BETWEEN :start AND :end')
->setParameter('station', $station)
->setParameter('start', $dayStart)
->setParameter('end', $dayEnd)
->getQuery()
->getSingleScalarResult();
$atOffice = (int) $em->createQueryBuilder()
->select('COUNT(w.id)')
->from(WayBill::class, 'w')
->andWhere('w.fromStation = :station')
->andWhere('w.isReceived = false')
->andWhere('w.isCollected = false')
->andWhere('w.createdAt BETWEEN :start AND :end')
->setParameter('station', $station)
->setParameter('start', $dayStart)
->setParameter('end', $dayEnd)
->getQuery()
->getSingleScalarResult();
$transactions = (int) $em->createQueryBuilder()
->select('COUNT(t.id)')
->from(Transaction::class, 't')
->join('t.wayBill', 'w')
->andWhere('w.fromStation = :station')
->andWhere('t.createdAt BETWEEN :start AND :end')
->setParameter('station', $station)
->setParameter('start', $dayStart)
->setParameter('end', $dayEnd)
->getQuery()
->getSingleScalarResult();
return [
'outgoing' => $outgoing,
'incoming' => $incoming,
'uncollected' => $uncollected,
'collected' => $collected,
'at_office' => $atOffice,
'transactions' => $transactions,
];
}
public function nav() {
return $this->render('fos/nav.html.twig', []);
}
/**
* @Route("/add-expense", name="parcels_add_expense")
*/
public function addExpense(){
$em = $this->getDoctrine()->getManager();
$transaction = $em->getRepository(Transaction::class)->findOneBy([
'wayBill' => 23
]);
$expenseType = $em->getRepository('App:ExpenseType')->findOneBy([
'id' => 3
]);
$autoExpenses = $em->getRepository('App:ExpenseType')->findBy([
'isActive' => true,
'isAutomatic' => true
]);
$wayBillExpense = new TransactionExpense();
$wayBillExpense->setCreatedAt(new \DateTime());
$wayBillExpense->setCreatedBy($this->getUser());
$wayBillExpense->setTransaction($transaction);
$wayBillExpense->setAmount(50);
$wayBillExpense->setExpenseType($expenseType);
$em->persist($wayBillExpense);
/*foreach ($autoExpenses as $item) {
if($item->getAutoExpense()) {
if($item->getAutoExpense()->getisSystem()) {
dump($item->getAutoExpense());
$wayBillExpense = new TransactionExpense();
$wayBillExpense->setCreatedAt(new \DateTime());
$wayBillExpense->setCreatedBy($this->getUser());
$wayBillExpense->setTransaction($transaction);
$wayBillExpense->setAmount($item->getAutoExpense()->getAmount());
$wayBillExpense->setExpenseType($item);
$em->persist($wayBillExpense);
}
}
}*/
$em->flush();
/** @var UserStation $userTown */
$userTown = $em->getRepository(UserStation::class)->findOneBy([
'user' => $this->getUser(),
'isActive' => true
], ['id'=>'DESC']);
// replace this example code with whatever you need
return $this->render('fos/home/home.html.twig', [
'user_town' => $userTown
]);
}
private function searchWaybill() {
return $this->createFormBuilder()
->add('waybill',TextType::class,[
'constraints' =>[
new NotBlank(['message' => 'Please enter a waybill'])
]
])
->setMethod('POST')
->getForm();
}
/**
* @Route("/download_app", name="download_app")
*/
public function downloadApp(){
// load the file from the filesystem
$file = new File("../public/assets/android-app/courier_26032025.apk");
return $this->file($file);
}
}