diff --git a/config/routes/ticket.yaml b/config/routes/ticket.yaml index a1d6bdff..6e4d5343 100644 --- a/config/routes/ticket.yaml +++ b/config/routes/ticket.yaml @@ -10,18 +10,20 @@ ticket_rows: methods: [POST] ticket_create: - path: /tickets/create/{customer_id} + path: /tickets/create/{customer_id}/{job_order_id} controller: App\Controller\TicketController::addForm methods: [GET] defaults: customer_id: false + job_order_id: false ticket_create_submit: - path: /tickets/create/{customer_id} + path: /tickets/create/{customer_id}/{job_order_id} controller: App\Controller\TicketController::addSubmit methods: [POST] defaults: customer_id: false + job_order_id: false ticket_update: path: /tickets/{id} diff --git a/src/Controller/TicketController.php b/src/Controller/TicketController.php index 5a307c2c..f8a2d3e0 100644 --- a/src/Controller/TicketController.php +++ b/src/Controller/TicketController.php @@ -7,6 +7,7 @@ use App\Ramcar\TicketType; use App\Ramcar\TicketStatus; use App\Entity\Ticket; use App\Entity\Customer; +use App\Entity\JobOrder; use Doctrine\ORM\Query; use Symfony\Component\HttpFoundation\Request; @@ -99,6 +100,7 @@ class TicketController extends BaseController $row['contact_num'] = $orow->getContactNumber(); $row['status'] = $ticket_statuses[$orow->getStatus()]; $row['ticket_type'] = $ticket_types[$orow->getTicketType()]; + $row['plate_number'] = $orow->getPlateNumber(); // add row metadata $row['meta'] = [ @@ -122,7 +124,7 @@ class TicketController extends BaseController ]); } - public function addForm(Request $req, $customer_id) + public function addForm(Request $req, $customer_id, $job_order_id) { $this->denyAccessUnlessGranted('ticket.add', null, 'No access.'); @@ -130,6 +132,7 @@ class TicketController extends BaseController $params['obj'] = new Ticket(); $params['mode'] = 'create'; $params['customer'] = false; + $params['job_order'] = false; $customer = false; // get customer data @@ -143,6 +146,18 @@ class TicketController extends BaseController // add to view $params['customer'] = $customer; + + // get job order data + if ($job_order_id) { + $job_order = $em->getRepository(JobOrder::class)->find($job_order_id); + + // make sure this row exists + if (empty($job_order)) + throw $this->createNotFoundException('This job order does not exist'); + + // add to view + $params['job_order'] = $job_order; + } } // get parent associations @@ -159,13 +174,21 @@ class TicketController extends BaseController if ($referer == $cust_update_url) $params['redirect_url'] = $cust_update_url; + + if ($job_order) + { + $job_order_url = $this->generateUrl('jo_proc_form', ['id' => $job_order->getID()], UrlGeneratorInterface::ABSOLUTE_URL); + + if ($referer == $job_order_url) + $params['redirect_url'] = $job_order_url; + } } // response return $this->render('ticket/form.html.twig', $params); } - public function addSubmit(Request $req, ValidatorInterface $validator, $customer_id) + public function addSubmit(Request $req, ValidatorInterface $validator, $customer_id, $job_order_id) { $this->denyAccessUnlessGranted('ticket.add', null, 'No access.'); @@ -189,6 +212,15 @@ class TicketController extends BaseController if (count($mobile_numbers) > 0) { $contact_num = $mobile_numbers[0]->getID(); } + + // get job order data + if ($job_order_id) { + $job_order = $em->getRepository(JobOrder::class)->find($job_order_id); + + // make sure this row exists + if (empty($job_order)) + throw $this->createNotFoundException('This job order does not exist'); + } } else { // get values directly from form $first_name = $req->request->get('first_name'); @@ -216,6 +248,7 @@ class TicketController extends BaseController ->setOtherTicketType($other_ticket_type) ->setSubject($req->request->get('subject')) ->setDetails($req->request->get('details')) + ->setPlateNumber($req->request->get('plate_number')) ->setDateCreate(new DateTime()) ->setCreatedBy($this->getUser()); @@ -224,6 +257,11 @@ class TicketController extends BaseController $obj->setCustomer($customer); } + // if linked to job order, set association + if ($job_order_id) { + $obj->setJobOrder($job_order); + } + // initialize error list $error_array = []; @@ -277,9 +315,11 @@ class TicketController extends BaseController $em = $this->getDoctrine()->getManager(); $customer = $obj->getCustomer(); + $job_order = $obj->getJobOrder(); // get parent associations $params['customer'] = $customer; + $params['job_order'] = $job_order; $params['ticket_types'] = TicketType::getCollection(); $params['statuses'] = TicketStatus::getCollection(); $params['other_ticket_type'] = TicketType::OTHER; @@ -348,7 +388,8 @@ class TicketController extends BaseController ->setTicketType($ticket_type) ->setOtherTicketType($other_ticket_type) ->setSubject($req->request->get('subject')) - ->setDetails($req->request->get('details')); + ->setDetails($req->request->get('details')) + ->setPlateNumber($req->request->get('plate_number')); // initialize error list $error_array = []; diff --git a/src/Entity/JobOrder.php b/src/Entity/JobOrder.php index 2cbac875..053c98e9 100644 --- a/src/Entity/JobOrder.php +++ b/src/Entity/JobOrder.php @@ -173,6 +173,12 @@ class JobOrder */ protected $cancel_reason; + // tickets associated with job order + /** + * @ORM\OneToMany(targetEntity="Ticket", mappedBy="job_order") + */ + protected $tickets; + public function __construct() { $this->date_create = new DateTime(); @@ -435,4 +441,9 @@ class JobOrder { return $this->cancel_reason; } + + public function getTickets() + { + return $this->tickets; + } } diff --git a/src/Entity/Ticket.php b/src/Entity/Ticket.php index 2ed8ac5f..38faf2be 100644 --- a/src/Entity/Ticket.php +++ b/src/Entity/Ticket.php @@ -83,6 +83,12 @@ class Ticket */ protected $details; + // plate number + /** + * @ORM\Column(type="string", length=10, nullable=true) + */ + protected $plate_number; + // user that created the ticket /** * @ORM\ManyToOne(targetEntity="User", inversedBy="tickets") @@ -97,6 +103,13 @@ class Ticket */ protected $customer; + // job order associated with the ticket (optional) + /** + * @ORM\ManyToOne(targetEntity="JobOrder", inversedBy="tickets") + * @ORM\JoinColumn(name="job_order_id", referencedColumnName="id", nullable=true) + */ + protected $job_order; + public function __construct() { $this->date_create = new DateTime(); @@ -222,6 +235,17 @@ class Ticket return $this->details; } + public function setPlateNumber($plate_number) + { + $this->plate_number = $plate_number; + return $this; + } + + public function getPlateNumber() + { + return $this->plate_number; + } + public function setCreatedBy(User $created_by) { $this->created_by = $created_by; @@ -243,4 +267,15 @@ class Ticket { return $this->customer; } + + public function setJobOrder(JobOrder $job_order) + { + $this->job_order = $job_order; + return $this; + } + + public function getJobOrder() + { + return $this->job_order; + } } diff --git a/src/Ramcar/TicketType.php b/src/Ramcar/TicketType.php index 8483d25b..0e1fd865 100644 --- a/src/Ramcar/TicketType.php +++ b/src/Ramcar/TicketType.php @@ -4,17 +4,20 @@ namespace App\Ramcar; class TicketType extends NameValue { - const COMPLAINT = 'complaint'; - const QUESTION = 'question'; - const ORDERS = 'orders'; - const BILLING = 'billing'; - const OTHER = 'other'; + const COMPLAINT = 'complaint'; + const INQUIRY = 'inquiry'; + const ORDERS = 'orders'; + const BILLING = 'billing'; + const OTHER = 'other'; + const FOR_FOLLOW_UP = 'for_follow_up'; const COLLECTION = [ 'complaint' => 'Complaint', - 'question' => 'Question', + 'inquiry' => 'Inquiry', 'orders' => 'Orders', 'billing' => 'Billing', 'other' => 'Other', + 'for_follow_up' => 'For follow-up', + ]; } diff --git a/templates/job-order/form.html.twig b/templates/job-order/form.html.twig index a651990a..d395a52b 100644 --- a/templates/job-order/form.html.twig +++ b/templates/job-order/form.html.twig @@ -376,7 +376,7 @@ {% if mode == 'update-processing' %}
-