<?php
namespace ApplicationBundle\Modules\Accounts\Controller;
use ApplicationBundle\Controller\GenericController;
use ApplicationBundle\Interfaces\SessionCheckInterface;
use ApplicationBundle\Modules\Authentication\Constants\UserConstants;
use ApplicationBundle\Modules\Accounts\Service\RecurringBillingManager;
use ApplicationBundle\Modules\Inventory\Inventory;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
/**
* Recurring billing management — list + add/edit recurring expense / sales-invoice
* templates, toggle, delete, run-now. Thin controller over RecurringBillingManager.
*/
class RecurringBillingController extends GenericController implements SessionCheckInterface
{
public function listAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$mgr = new RecurringBillingManager($em);
$conn = $em->getConnection();
$heads = $conn->fetchAllAssociative(
"SELECT accounts_head_id AS id, name FROM acc_accounts_head
WHERE (lock_flag = 0 OR lock_flag IS NULL) ORDER BY name"
);
$salesOrders = $conn->fetchAllAssociative(
"SELECT so.sales_order_id AS id, so.document_hash AS hash, c.client_name AS client
FROM sales_order so
LEFT JOIN acc_clients c ON c.client_id = so.client_id
WHERE so.approved = 1
ORDER BY so.sales_order_id DESC LIMIT 500"
);
return $this->render('@Accounts/pages/views/recurring_billing.html.twig', [
'schedules' => $mgr->listSchedules(),
'heads' => $heads,
'salesOrders' => $salesOrders,
'currencyList' => Inventory::CurrencyList($em),
'sidebar_partial' => '@Accounts/inc/_finance_sidebar.html.twig',
'cp_active' => 'recurring',
]);
}
public function saveAction(Request $request): JsonResponse
{
$loginId = $request->getSession()->get(UserConstants::USER_LOGIN_ID);
$em = $this->getDoctrine()->getManager();
$mgr = new RecurringBillingManager($em);
$s = $mgr->saveSchedule($request->request->all(), $loginId);
return new JsonResponse(['success' => true, 'id' => $s->getId()]);
}
public function toggleAction(Request $request, $id): JsonResponse
{
$em = $this->getDoctrine()->getManager();
$s = $em->getRepository('ApplicationBundle\\Entity\\RecurringSchedule')->findOneBy(['id' => (int) $id]);
if (!$s) { return new JsonResponse(['success' => false, 'message' => 'Not found']); }
$s->setEnabled($s->getEnabled() ? 0 : 1);
$s->setUpdatedAt(new \DateTime('now'));
$em->flush();
return new JsonResponse(['success' => true, 'enabled' => $s->getEnabled()]);
}
public function deleteAction(Request $request, $id): JsonResponse
{
$em = $this->getDoctrine()->getManager();
$em->getConnection()->executeStatement('DELETE FROM recurring_schedule WHERE id = ?', [(int) $id]);
return new JsonResponse(['success' => true]);
}
public function runNowAction(Request $request, $id): JsonResponse
{
$loginId = $request->getSession()->get(UserConstants::USER_LOGIN_ID);
$em = $this->getDoctrine()->getManager();
$mgr = new RecurringBillingManager($em);
$s = $mgr->getSchedule($id);
if (!$s) { return new JsonResponse(['success' => false, 'message' => 'Not found']); }
$dry = (int) $request->request->get('dry', 0) === 1;
$result = $mgr->runSchedule($s, new \DateTime('now'), $loginId, $dry);
return new JsonResponse(['success' => true, 'result' => $result]);
}
}