<?php
/**
* Created by PhpStorm.
* User: parcel
* Date: 11/1/18
* Time: 8:09 AM
*/
namespace App\Parcels;
use App\Entity\DailyAccount;
use App\Entity\Station;
use App\Entity\StationAccount;
use App\Entity\StationDailyAccount;
use App\Entity\StationExpense;
use App\Entity\TransactionStationExpense;
use App\Form\ExpenseForm;
use Doctrine\DBAL\Exception;
use JMS\Serializer\SerializerBuilder;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class ExpenseController extends AbstractController {
/**
* @Route("/expenses", name="expensesHomepage")
*/
public function indexExpenseAction(Request $request) {
$em = $this->getDoctrine()->getManager();
$station = $em->getRepository(Station::class)->findOneBy([
'id' => $request->getSession()->get('STATION')
]);
$expense = new StationExpense();
$expense->setCreatedBy($this->getUser());
$form = $this->createForm(ExpenseForm::class, $expense);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
$expense->setStation($station);
$expense->setCreatedAt(new \DateTime());
$expense->setCreatedBy($this->getUser());
$conn = $em->getConnection();
$conn->beginTransaction();
try {
$dailyAccount = $em->getRepository(DailyAccount::class)->findOneBy([
'user' => $this->getUser(),
'isClosed' => false
],['id' => 'DESC']);
if(!$dailyAccount) {
$this->addFlash('error', 'Please open a daily account');
return $this->render('fos/parcels/expenses.html.twig',[
'form' => $form->createView(),
]);
}
$stationExpense = $em->getRepository(StationExpense::class)->findOneBy([
'station' => $station,
'dailyAccount' => $dailyAccount
],['id' => 'DESC']);
// $dailyAccount->setExpenses($dailyAccount->getExpenses() + $expense->getAmount());
$expenseBalance = $expense->getAmount();
if($stationExpense) {
$expenseBalance = $stationExpense->getExpenseAccrued();
$expenseBalance = $expenseBalance + $expense->getAmount();
}
$expense->setExpenseAccrued($expenseBalance);
$balance = $expense->getAmount();
$stationAccount = $em->getRepository(StationAccount::class)->findOneBy([
'station' => $station
],['id' => 'DESC']);
if($stationAccount) {
$balance = $stationAccount->getBalance();
$balance = $balance - $expense->getAmount();
}
$newStationAccount = new StationAccount();
$newStationAccount->setCreatedAt(new \DateTime());
$newStationAccount->setStation($station);
$newStationAccount->setAmount($expense->getAmount());
$newStationAccount->setBalance($balance);
$newStationAccount->setExpenses($expense->getAmount());
$newStationAccount->setDailyAccount($dailyAccount);
$newStationAccount->setCreatedBy($this->getUser());
$expense->setDailyAccount($dailyAccount);
$em->persist($newStationAccount);
$em->persist($expense);
$em->flush();
$em->getConnection()->commit();
$this->addFlash('success', 'Expense Saved Successfully');
return $this->redirectToRoute('expensesHomepage');
}catch (\PDOException $e){
$em->getConnection()->rollBack();
$this->addFlash('error', 'An Error Occurred Please check whether every thing is filled');
return $this->render('fos/parcels/expenses.html.twig',[
'form' => $form->createView(),
]);
}
}
return $this->render('fos/parcels/expenses.html.twig',[
'form' => $form->createView()
]);
}
/**
* @Method("POST")
* @Route("/all/expenses-list", name="get_all_station_expenses_Parcels")
*/
public function getAllParcels(Request $request) {
$em = $this->getDoctrine()->getManager();
$station = $em->getRepository(Station::class)->findOneBy([
'id' => $request->getSession()->get('STATION')
]);
$serializer = SerializerBuilder::create()->build();
$page = empty($request->request->get('page')) ? intval('page') : 1;
$rows = empty($request->request->get('rows')) ? intval('rows') : 10;
$offset = ($page-1)*$rows;
$filterRules = $request->request->get('filterRules');
$em = $this->getDoctrine()->getManager();
$dailyAccount = $em->getRepository(DailyAccount::class)->findOneBy([
'user' => $this->getUser(),
'isClosed' => false
],['id' => 'DESC']);
$expenses = null;
$data = null;
if($dailyAccount){
$expenses = $em->getRepository(StationExpense::class)->findBy([
'station' => $station,
'dailyAccount' => $dailyAccount
]);
$data = [
'rows' => $expenses,
'total' => count($expenses)
];
}
/*$balance = $em->getRepository(StationExpense::class)->findOneBy([
'station' => $station
],['id' => 'DESC']);*/
$data = $serializer->serialize($data,'json');
return new Response($data, Response::HTTP_OK);
}
/**
* @Route("/station_expenses", name="expensesStationExpensesHomepage")
*/
public function indexStationExpensesAction(Request $request) {
$em = $this->getDoctrine()->getManager();
$station = $em->getRepository(Station::class)->findOneBy([
'id' => $request->getSession()->get('STATION')
]);
return $this->render('fos/parcels/station_expenses.html.twig',[]);
}
/**
* @Method("POST")
* @Route("/all/station_expenses_json", name="get_station_expenses_Parcels")
*/
public function getAllStationExpenses(Request $request) {
$em = $this->getDoctrine()->getManager();
$station = $em->getRepository(Station::class)->findOneBy([
'id' => $request->getSession()->get('STATION')
]);
$serializer = SerializerBuilder::create()->build();
$page = !empty($request->request->get('page')) ? intval($request->request->get('page')) : 1;
$rows = !empty($request->request->get('rows')) ? intval($request->request->get('rows')) : 10;
$offset = ($page-1)*$rows;
// $filterRules = $request->request->get('filterRules');
// print_r($rows); die;
$conn = $em->getConnection();
$sql = "SELECT sa.account_date, count(a.id) as expenses, sum(a.amount) AS total, sa.id as station_daily_account_id, sa.station_id FROM station_expense a
JOIN daily_account da on a.daily_account_id = da.id
JOIN station_daily_account sa on da.station_daily_account = sa.id
WHERE a.is_cancelled = false
AND a.station_id = :station
GROUP BY sa.id ORDER BY sa.id DESC LIMIT {$offset}, {$rows}" ;
$sqlCount = "SELECT count(sa.id) as days FROM station_expense a
JOIN daily_account da on a.daily_account_id = da.id
JOIN station_daily_account sa on da.station_daily_account = sa.id
WHERE a.is_cancelled = false
AND a.station_id = :station GROUP BY sa.id" ;
$expenses = null;
$days = null;
try {
$stmt = $conn->prepare($sql);
$stmt->execute([
'station'=> $station->getId()
]);
$stmtCount = $conn->prepare($sqlCount);
$stmtCount->execute([
'station'=> $station->getId()
]);
$days = $stmtCount->fetchAll(\PDO::FETCH_ASSOC);
// print_r($counts);die;
$expenses = $stmt->fetchAll(\PDO::FETCH_ASSOC);
//print_r($amounts);die;
// return $stmt->fetchAll(\PDO::FETCH_ASSOC);
} catch (Exception $e) {
return null;
}
$data = [
'rows' => $expenses,
'total' => count($days)
];
$data = $serializer->serialize($data,'json');
return new Response($data, Response::HTTP_OK);
}
/**
* @Route("/all/daily_expense_list/{dailyAccount}", name="get_daily_expenses_list")
* @param $dailyAccount
* @return Response
*/
public function dailyExpenseList(StationDailyAccount $dailyAccount){
$sql = "SELECT a.id, a.account_date, concat(p.first_name,' ',p.second_name,' ',p.sir_name)as nname,
(SELECT sum(amount) FROM station_expense ase
where daily_account_id = a.id AND is_cancelled = false) AS total_amount,
(SELECT CONCAT(
'[',GROUP_CONCAT(
JSON_OBJECT(
'amount',se.amount,
'description', se.description,
'expense_name', et.expense_name
)
), ']' )
FROM station_expense se
JOIN expense_type et on se.expense_type_id = et.id
where daily_account_id = a.id AND se.is_cancelled = false
) AS expenses
FROM daily_account a
JOIN station_daily_account sda ON sda.id = a.station_daily_account
JOIN user u ON u.id = a.user_id
JOIN person p ON p.id = u.person_id
WHERE sda.id = :station_daily_account_id";
try {
$em = $this->getDoctrine()->getManager();
$conn = $em->getConnection();
$stmt = $conn->prepare($sql);
$stmt->execute([
'station_daily_account_id'=> $dailyAccount->getId()
]);
$expenses = $stmt->fetchAll(\PDO::FETCH_ASSOC);
return $this->render('fos/parcels/station_expense.html.twig',[
'daily_accounts' => $expenses,
'station_account' => $dailyAccount
]);
} catch (DBALException $e) {
dump($e); die;
}
return $this->render('fos/parcels/station_expense.html.twig',[]);
}
}