Add trade in type for cmb. #270
This commit is contained in:
parent
a9ed02b0b2
commit
610bbdcc7c
7 changed files with 79 additions and 138 deletions
|
|
@ -153,62 +153,72 @@ class JobOrderController extends Controller
|
||||||
/**
|
/**
|
||||||
* @Menu(selected="jo_proc")
|
* @Menu(selected="jo_proc")
|
||||||
*/
|
*/
|
||||||
public function listProcessing()
|
public function listProcessing(JobOrderHandlerInterface $jo_handler)
|
||||||
{
|
{
|
||||||
$this->denyAccessUnlessGranted('jo_proc.list', null, 'No access.');
|
$this->denyAccessUnlessGranted('jo_proc.list', null, 'No access.');
|
||||||
|
|
||||||
|
$template = $jo_handler->getTwigTemplate('jo_list_processing');
|
||||||
|
|
||||||
$params['table_refresh_rate'] = $this->container->getParameter('job_order_refresh_interval');
|
$params['table_refresh_rate'] = $this->container->getParameter('job_order_refresh_interval');
|
||||||
|
|
||||||
return $this->render('job-order/list.processing.html.twig', $params);
|
return $this->render($template, $params);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Menu(selected="jo_assign")
|
* @Menu(selected="jo_assign")
|
||||||
*/
|
*/
|
||||||
public function listAssigning()
|
public function listAssigning(JobOrderHandlerInterface $jo_handler)
|
||||||
{
|
{
|
||||||
$this->denyAccessUnlessGranted('jo_assign.list', null, 'No access.');
|
$this->denyAccessUnlessGranted('jo_assign.list', null, 'No access.');
|
||||||
|
|
||||||
|
$template = $jo_handler->getTwigTemplate('jo_list_assigning');
|
||||||
|
|
||||||
$params['table_refresh_rate'] = $this->container->getParameter('job_order_refresh_interval');
|
$params['table_refresh_rate'] = $this->container->getParameter('job_order_refresh_interval');
|
||||||
|
|
||||||
return $this->render('job-order/list.assigning.html.twig', $params);
|
return $this->render($template, $params);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Menu(selected="jo_fulfill")
|
* @Menu(selected="jo_fulfill")
|
||||||
*/
|
*/
|
||||||
public function listFulfillment()
|
public function listFulfillment(JobOrderHandlerInterface $jo_handler)
|
||||||
{
|
{
|
||||||
$this->denyAccessUnlessGranted('jo_fulfill.list', null, 'No access.');
|
$this->denyAccessUnlessGranted('jo_fulfill.list', null, 'No access.');
|
||||||
|
|
||||||
|
$template = $jo_handler->getTwigTemplate('jo_list_fulfillment');
|
||||||
|
|
||||||
$params['table_refresh_rate'] = $this->container->getParameter('job_order_refresh_interval');
|
$params['table_refresh_rate'] = $this->container->getParameter('job_order_refresh_interval');
|
||||||
|
|
||||||
return $this->render('job-order/list.fulfillment.html.twig', $params);
|
return $this->render($template, $params);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Menu(selected="jo_open")
|
* @Menu(selected="jo_open")
|
||||||
*/
|
*/
|
||||||
public function listOpen()
|
public function listOpen(JobOrderHandlerInterface $jo_handler)
|
||||||
{
|
{
|
||||||
$this->denyAccessUnlessGranted('jo_open.list', null, 'No access.');
|
$this->denyAccessUnlessGranted('jo_open.list', null, 'No access.');
|
||||||
|
|
||||||
|
$template = $jo_handler->getTwigTemplate('jo_list_open');
|
||||||
|
|
||||||
$params['table_refresh_rate'] = $this->container->getParameter('job_order_refresh_interval');
|
$params['table_refresh_rate'] = $this->container->getParameter('job_order_refresh_interval');
|
||||||
$params['statuses'] = JOStatus::getCollection();
|
$params['statuses'] = JOStatus::getCollection();
|
||||||
|
|
||||||
return $this->render('job-order/list.open.html.twig', $params);
|
return $this->render($template, $params);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Menu(selected="jo_all")
|
* @Menu(selected="jo_all")
|
||||||
*/
|
*/
|
||||||
public function listAll()
|
public function listAll(JobOrderHandlerInterface $jo_handler)
|
||||||
{
|
{
|
||||||
$this->denyAccessUnlessGranted('jo_all.list', null, 'No access.');
|
$this->denyAccessUnlessGranted('jo_all.list', null, 'No access.');
|
||||||
|
|
||||||
|
$template = $jo_handler->getTwigTemplate('jo_list_all');
|
||||||
|
|
||||||
$params['table_refresh_rate'] = $this->container->getParameter('job_order_refresh_interval');
|
$params['table_refresh_rate'] = $this->container->getParameter('job_order_refresh_interval');
|
||||||
|
|
||||||
return $this->render('job-order/list.all.html.twig', $params);
|
return $this->render($template, $params);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -645,74 +655,6 @@ class JobOrderController extends Controller
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function invoicePromo($em, InvoiceCriteria $criteria, $promo_id)
|
|
||||||
{
|
|
||||||
// return error if there's a problem, false otherwise
|
|
||||||
|
|
||||||
// check service type
|
|
||||||
$stype = $criteria->getServiceType();
|
|
||||||
if ($stype != ServiceType::BATTERY_REPLACEMENT_NEW)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
|
|
||||||
if (empty($promo_id))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// check if this is a valid promo
|
|
||||||
$promo = $em->getRepository(Promo::class)->find($promo_id);
|
|
||||||
|
|
||||||
if (empty($promo))
|
|
||||||
return 'Invalid promo specified.';
|
|
||||||
|
|
||||||
$criteria->addPromo($promo);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function invoiceBatteries($em, InvoiceCriteria $criteria, $items)
|
|
||||||
{
|
|
||||||
// check service type
|
|
||||||
$stype = $criteria->getServiceType();
|
|
||||||
if ($stype != ServiceType::BATTERY_REPLACEMENT_NEW && $stype != ServiceType::BATTERY_REPLACEMENT_WARRANTY)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
// return error if there's a problem, false otherwise
|
|
||||||
if (!empty($items))
|
|
||||||
{
|
|
||||||
foreach ($items as $item)
|
|
||||||
{
|
|
||||||
// error_log('ITEMS');
|
|
||||||
// check if this is a valid battery
|
|
||||||
$battery = $em->getRepository(Battery::class)->find($item['battery']);
|
|
||||||
|
|
||||||
if (empty($battery))
|
|
||||||
{
|
|
||||||
$error = 'Invalid battery specified.';
|
|
||||||
return $error;
|
|
||||||
}
|
|
||||||
|
|
||||||
// quantity
|
|
||||||
$qty = $item['quantity'];
|
|
||||||
if ($qty < 1)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/*
|
|
||||||
// add to criteria
|
|
||||||
$criteria->addBattery($battery, $qty);
|
|
||||||
*/
|
|
||||||
|
|
||||||
// if this is a trade in, add trade in
|
|
||||||
if (!empty($item['trade_in']) && TradeInType::validate($item['trade_in']))
|
|
||||||
$trade_in = $item['trade_in'];
|
|
||||||
else
|
|
||||||
$trade_in = null;
|
|
||||||
|
|
||||||
$criteria->addEntry($battery, $trade_in, $qty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function generateInvoice(Request $req, InvoiceGeneratorInterface $ic)
|
public function generateInvoice(Request $req, InvoiceGeneratorInterface $ic)
|
||||||
{
|
{
|
||||||
// error_log('generating invoice...');
|
// error_log('generating invoice...');
|
||||||
|
|
@ -763,11 +705,11 @@ class JobOrderController extends Controller
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// TODO: this snippet should be in the invoice generator
|
||||||
$error = $this->invoicePromo($em, $criteria, $promo_id);
|
$error = $ic->invoicePromo($criteria, $promo_id);
|
||||||
|
|
||||||
if (!$error)
|
if (!$error)
|
||||||
$error = $this->invoiceBatteries($em, $criteria, $items);
|
$error = $ic->invoiceBatteries($criteria, $items);
|
||||||
|
|
||||||
if ($error)
|
if ($error)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
13
src/Ramcar/CMBTradeInType.php
Normal file
13
src/Ramcar/CMBTradeInType.php
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Ramcar;
|
||||||
|
|
||||||
|
class CMBTradeInType extends NameValue
|
||||||
|
{
|
||||||
|
const REGULAR = 'regular';
|
||||||
|
|
||||||
|
const COLLECTION = [
|
||||||
|
'regular' => 'Regular',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -9,7 +9,7 @@ use Doctrine\ORM\EntityManagerInterface;
|
||||||
|
|
||||||
use App\Ramcar\InvoiceCriteria;
|
use App\Ramcar\InvoiceCriteria;
|
||||||
use App\Ramcar\InvoiceStatus;
|
use App\Ramcar\InvoiceStatus;
|
||||||
use App\Ramcar\TradeInType;
|
use App\Ramcar\CMBTradeInType;
|
||||||
use App\Ramcar\DiscountApply;
|
use App\Ramcar\DiscountApply;
|
||||||
use App\Ramcar\ServiceType;
|
use App\Ramcar\ServiceType;
|
||||||
use App\Ramcar\FuelType;
|
use App\Ramcar\FuelType;
|
||||||
|
|
@ -66,7 +66,6 @@ class CMBInvoiceGenerator implements InvoiceGeneratorInterface
|
||||||
$stype = $criteria->getServiceType();
|
$stype = $criteria->getServiceType();
|
||||||
$cv = $criteria->getCustomerVehicle();
|
$cv = $criteria->getCustomerVehicle();
|
||||||
$has_coolant = $criteria->hasCoolant();
|
$has_coolant = $criteria->hasCoolant();
|
||||||
// error_log($stype);
|
|
||||||
switch ($stype)
|
switch ($stype)
|
||||||
{
|
{
|
||||||
case ServiceType::JUMPSTART_TROUBLESHOOT:
|
case ServiceType::JUMPSTART_TROUBLESHOOT:
|
||||||
|
|
@ -216,18 +215,16 @@ class CMBInvoiceGenerator implements InvoiceGeneratorInterface
|
||||||
|
|
||||||
switch ($trade_in)
|
switch ($trade_in)
|
||||||
{
|
{
|
||||||
case TradeInType::MOTOLITE:
|
// TODO: for now, REGULAR uses getTIPriceMotolite.
|
||||||
|
// Might need to modify later
|
||||||
|
case CMBTradeInType::REGULAR:
|
||||||
return $size->getTIPriceMotolite();
|
return $size->getTIPriceMotolite();
|
||||||
case TradeInType::PREMIUM:
|
|
||||||
return $size->getTIPricePremium();
|
|
||||||
case TradeInType::OTHER:
|
|
||||||
return $size->getTIPriceOther();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function invoicePromo(InvoiceCriteria $criteria, $promo_id)
|
public function invoicePromo(InvoiceCriteria $criteria, $promo_id)
|
||||||
{
|
{
|
||||||
// return error if there's a problem, false otherwise
|
// return error if there's a problem, false otherwise
|
||||||
// check service type
|
// check service type
|
||||||
|
|
@ -251,7 +248,7 @@ class CMBInvoiceGenerator implements InvoiceGeneratorInterface
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function invoiceBatteries(InvoiceCriteria $criteria, $items)
|
public function invoiceBatteries(InvoiceCriteria $criteria, $items)
|
||||||
{
|
{
|
||||||
// check service type
|
// check service type
|
||||||
$stype = $criteria->getServiceType();
|
$stype = $criteria->getServiceType();
|
||||||
|
|
@ -283,7 +280,7 @@ class CMBInvoiceGenerator implements InvoiceGeneratorInterface
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// if this is a trade in, add trade in
|
// if this is a trade in, add trade in
|
||||||
if (!empty($item['trade_in']) && TradeInType::validate($item['trade_in']))
|
if (!empty($item['trade_in']) && CMBTradeInType::validate($item['trade_in']))
|
||||||
$trade_in = $item['trade_in'];
|
$trade_in = $item['trade_in'];
|
||||||
else
|
else
|
||||||
$trade_in = null;
|
$trade_in = null;
|
||||||
|
|
@ -382,7 +379,7 @@ class CMBInvoiceGenerator implements InvoiceGeneratorInterface
|
||||||
// add item
|
// add item
|
||||||
$item = new InvoiceItem();
|
$item = new InvoiceItem();
|
||||||
$item->setInvoice($invoice)
|
$item->setInvoice($invoice)
|
||||||
->setTitle('Trade-in ' . TradeInType::getName($ti['trade_in']) . ' ' . $ti['size']->getName() . ' battery')
|
->setTitle('Trade-in ' . CMBTradeInType::getName($ti['trade_in']) . ' ' . $ti['size']->getName() . ' battery')
|
||||||
->setQuantity($qty)
|
->setQuantity($qty)
|
||||||
->setPrice($ti_rate * -1);
|
->setPrice($ti_rate * -1);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -225,7 +225,7 @@ class ResqInvoiceGenerator implements InvoiceGeneratorInterface
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function invoicePromo(InvoiceCriteria $criteria, $promo_id)
|
public function invoicePromo(InvoiceCriteria $criteria, $promo_id)
|
||||||
{
|
{
|
||||||
// return error if there's a problem, false otherwise
|
// return error if there's a problem, false otherwise
|
||||||
// check service type
|
// check service type
|
||||||
|
|
@ -249,7 +249,7 @@ class ResqInvoiceGenerator implements InvoiceGeneratorInterface
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function invoiceBatteries(InvoiceCriteria $criteria, $items)
|
public function invoiceBatteries(InvoiceCriteria $criteria, $items)
|
||||||
{
|
{
|
||||||
// check service type
|
// check service type
|
||||||
$stype = $criteria->getServiceType();
|
$stype = $criteria->getServiceType();
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ use App\Entity\JORejection;
|
||||||
|
|
||||||
use App\Ramcar\InvoiceCriteria;
|
use App\Ramcar\InvoiceCriteria;
|
||||||
use App\Ramcar\ServiceType;
|
use App\Ramcar\ServiceType;
|
||||||
use App\Ramcar\TradeInType;
|
use App\Ramcar\CMBTradeInType;
|
||||||
use App\Ramcar\JOEventType;
|
use App\Ramcar\JOEventType;
|
||||||
use App\Ramcar\JOStatus;
|
use App\Ramcar\JOStatus;
|
||||||
use App\Ramcar\WarrantyClass;
|
use App\Ramcar\WarrantyClass;
|
||||||
|
|
@ -1937,6 +1937,17 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface
|
||||||
return $params;
|
return $params;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getTwigTemplate($id)
|
||||||
|
{
|
||||||
|
if (isset($this->template_hash[$id]))
|
||||||
|
{
|
||||||
|
return $this->template_hash[$id];
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
protected function fillDropdownParameters(&$params)
|
protected function fillDropdownParameters(&$params)
|
||||||
{
|
{
|
||||||
$em = $this->em;
|
$em = $this->em;
|
||||||
|
|
@ -1954,14 +1965,14 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the first two service types for POC
|
// get the first two service types for POC
|
||||||
$scount = 0;
|
$scount = 1;
|
||||||
$selected_stypes = [];
|
$selected_stypes = [];
|
||||||
$stypes = ServiceType::getCollection();
|
$stypes = ServiceType::getCollection();
|
||||||
|
|
||||||
foreach ($stypes as $stype)
|
foreach ($stypes as $key => $data)
|
||||||
{
|
{
|
||||||
if ($scount < 2)
|
if ($scount < 2)
|
||||||
$selected_stypes[] = $stype;
|
$selected_stypes[$key] = $data;
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
@ -1969,13 +1980,13 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface
|
||||||
}
|
}
|
||||||
|
|
||||||
// name values
|
// name values
|
||||||
// $params['service_types'] = ServiceType::getCollection();
|
//$params['service_types'] = ServiceType::getCollection();
|
||||||
$params['service_types'] = $selected_stypes;
|
$params['service_types'] = $selected_stypes;
|
||||||
$params['warranty_classes'] = WarrantyClass::getCollection();
|
$params['warranty_classes'] = WarrantyClass::getCollection();
|
||||||
$params['modes_of_payment'] = ModeOfPayment::getCollection();
|
$params['modes_of_payment'] = ModeOfPayment::getCollection();
|
||||||
$params['statuses'] = JOStatus::getCollection();
|
$params['statuses'] = JOStatus::getCollection();
|
||||||
$params['discount_apply'] = DiscountApply::getCollection();
|
$params['discount_apply'] = DiscountApply::getCollection();
|
||||||
$params['trade_in_types'] = TradeInType::getCollection();
|
$params['trade_in_types'] = CMBTradeInType::getCollection();
|
||||||
$params['facilitated_types'] = FacilitatedType::getCollection();
|
$params['facilitated_types'] = FacilitatedType::getCollection();
|
||||||
$params['facilitated_hubs'] = $fac_hubs;
|
$params['facilitated_hubs'] = $fac_hubs;
|
||||||
$params['sources'] = TransactionOrigin::getCollection();
|
$params['sources'] = TransactionOrigin::getCollection();
|
||||||
|
|
@ -2043,16 +2054,6 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface
|
||||||
$this->template_hash['jo_list_all'] = 'job-order/list.all.html.twig';
|
$this->template_hash['jo_list_all'] = 'job-order/list.all.html.twig';
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getTwigTemplate($id)
|
|
||||||
{
|
|
||||||
if (isset($this->template_hash[$id]))
|
|
||||||
{
|
|
||||||
return $this->template_hash[$id];
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function checkTier($tier)
|
protected function checkTier($tier)
|
||||||
{
|
{
|
||||||
// check specified tier
|
// check specified tier
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ use FPDF;
|
||||||
|
|
||||||
class ResqJobOrderHandler implements JobOrderHandlerInterface
|
class ResqJobOrderHandler implements JobOrderHandlerInterface
|
||||||
{
|
{
|
||||||
const COUNTRY_CODE_PREFIX = '+63';
|
const COUNTRY_CODE_PREFIX = '+60';
|
||||||
|
|
||||||
protected $em;
|
protected $em;
|
||||||
protected $ic;
|
protected $ic;
|
||||||
|
|
@ -1937,6 +1937,17 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
|
||||||
return $params;
|
return $params;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getTwigTemplate($id)
|
||||||
|
{
|
||||||
|
if (isset($this->template_hash[$id]))
|
||||||
|
{
|
||||||
|
return $this->template_hash[$id];
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
protected function fillDropdownParameters(&$params)
|
protected function fillDropdownParameters(&$params)
|
||||||
{
|
{
|
||||||
$em = $this->em;
|
$em = $this->em;
|
||||||
|
|
@ -1953,24 +1964,8 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
|
||||||
$fac_hubs[$hub->getID()] = $hub->getName() . ' - ' . $hub->getBranch();
|
$fac_hubs[$hub->getID()] = $hub->getName() . ' - ' . $hub->getBranch();
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the first two service types for POC
|
|
||||||
$scount = 0;
|
|
||||||
$selected_stypes = [];
|
|
||||||
$stypes = ServiceType::getCollection();
|
|
||||||
|
|
||||||
foreach ($stypes as $stype)
|
|
||||||
{
|
|
||||||
if ($scount < 2)
|
|
||||||
$selected_stypes[] = $stype;
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
|
|
||||||
$scount++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// name values
|
// name values
|
||||||
// $params['service_types'] = ServiceType::getCollection();
|
$params['service_types'] = ServiceType::getCollection();
|
||||||
$params['service_types'] = $selected_stypes;
|
|
||||||
$params['warranty_classes'] = WarrantyClass::getCollection();
|
$params['warranty_classes'] = WarrantyClass::getCollection();
|
||||||
$params['modes_of_payment'] = ModeOfPayment::getCollection();
|
$params['modes_of_payment'] = ModeOfPayment::getCollection();
|
||||||
$params['statuses'] = JOStatus::getCollection();
|
$params['statuses'] = JOStatus::getCollection();
|
||||||
|
|
@ -2043,16 +2038,6 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
|
||||||
$this->template_hash['jo_list_all'] = 'job-order/list.all.html.twig';
|
$this->template_hash['jo_list_all'] = 'job-order/list.all.html.twig';
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getTwigTemplate($id)
|
|
||||||
{
|
|
||||||
if (isset($this->template_hash[$id]))
|
|
||||||
{
|
|
||||||
return $this->template_hash[$id];
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function checkTier($tier)
|
protected function checkTier($tier)
|
||||||
{
|
{
|
||||||
// check specified tier
|
// check specified tier
|
||||||
|
|
|
||||||
|
|
@ -75,4 +75,7 @@ interface JobOrderHandlerInterface
|
||||||
|
|
||||||
// generate pdf form for job order
|
// generate pdf form for job order
|
||||||
public function generatePDFForm(Request $req, int $id, string $proj_path);
|
public function generatePDFForm(Request $req, int $id, string $proj_path);
|
||||||
|
|
||||||
|
// get template to display
|
||||||
|
public function getTwigTemplate(string $id);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue