Resolve "Job Order form changes" #833
4 changed files with 144 additions and 1 deletions
|
|
@ -80,3 +80,8 @@ jo_fulfill_submit:
|
|||
path: /job-order/fulfillment/{id}
|
||||
controller: App\Controller\JobOrderController::fulfillmentSubmit
|
||||
methods: [POST]
|
||||
|
||||
jo_search:
|
||||
path: /job-order/search
|
||||
controller: App\Controller\JobOrderController::getJobOrders
|
||||
methods: [GET]
|
||||
|
|
@ -157,6 +157,11 @@ span.has-danger,
|
|||
font-size: 14px !important;
|
||||
}
|
||||
|
||||
.select2-container--default .select2-selection--single .select2-selection__rendered .select2-selection__clear {
|
||||
margin-top: -0.95rem;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
@media (min-width: 995px) {
|
||||
.modal-lg {
|
||||
max-width: 1024px;
|
||||
|
|
|
|||
|
|
@ -38,6 +38,87 @@ use DateTime;
|
|||
|
||||
class JobOrderController extends BaseController
|
||||
{
|
||||
public function getJobOrders(Request $req)
|
||||
{
|
||||
if (!$this->isGranted('jo_in.list')) {
|
||||
$exception = $this->createAccessDeniedException('No access.');
|
||||
throw $exception;
|
||||
}
|
||||
|
||||
// get search term
|
||||
$term = $req->query->get('search');
|
||||
|
||||
// get querybuilder
|
||||
$qb = $this->getDoctrine()
|
||||
->getRepository(JobOrder::class)
|
||||
->createQueryBuilder('q');
|
||||
|
||||
// build expression now since we're reusing it
|
||||
$jo_label = $qb->expr()->concat($qb->expr()->literal('#'), 'q.id', $qb->expr()->literal(' - '), 'c.first_name', $qb->expr()->literal(' '), 'c.last_name', $qb->expr()->literal(' (Plate No: '), 'v.plate_number', $qb->expr()->literal(')'));
|
||||
|
||||
// count total records
|
||||
$tquery = $qb->select('COUNT(q)')
|
||||
->join('q.customer', 'c')
|
||||
->join('q.cus_vehicle', 'v');
|
||||
|
||||
// add filters to count query
|
||||
if (!empty($term)) {
|
||||
$tquery->where($jo_label . ' LIKE :filter')
|
||||
->setParameter('filter', '%' . $term . '%');
|
||||
}
|
||||
|
||||
$total = $tquery->getQuery()
|
||||
->getSingleScalarResult();
|
||||
|
||||
// pagination vars
|
||||
$page = $req->query->get('page') ?? 1;
|
||||
$perpage = 20;
|
||||
$offset = ($page - 1) * $perpage;
|
||||
$pages = ceil($total / $perpage);
|
||||
$has_more_pages = $page < $pages ? true : false;
|
||||
|
||||
// build main query
|
||||
$query = $qb->select('q')
|
||||
->addSelect($jo_label . ' as jo_label')
|
||||
->addSelect('c.first_name as cust_first_name')
|
||||
->addSelect('c.last_name as cust_last_name')
|
||||
->addSelect('v.plate_number as vehicle_plate_number');
|
||||
|
||||
// add filters if needed
|
||||
if (!empty($term)) {
|
||||
$query->where($jo_label . ' LIKE :filter')
|
||||
->setParameter('filter', '%' . $term . '%');
|
||||
}
|
||||
|
||||
// get rows
|
||||
$obj_rows = $query->orderBy('q.id', 'asc')
|
||||
->setFirstResult($offset)
|
||||
->setMaxResults($perpage)
|
||||
->getQuery()
|
||||
->getResult();
|
||||
|
||||
// build job order array
|
||||
$job_orders = [];
|
||||
|
||||
foreach ($obj_rows as $jo) {
|
||||
$service_type = ServiceType::getName($jo[0]->getServiceType());
|
||||
|
||||
$job_orders[] = [
|
||||
'id' => $jo[0]->getID(),
|
||||
'text' => $jo['jo_label'] . ' - ' . $service_type
|
||||
];
|
||||
}
|
||||
|
||||
// response
|
||||
return $this->json([
|
||||
'success' => true,
|
||||
'results' => $job_orders,
|
||||
'pagination' => [
|
||||
'more' => $has_more_pages
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
public function incomingForm()
|
||||
{
|
||||
$this->denyAccessUnlessGranted('jo_in.list', null, 'No access.');
|
||||
|
|
@ -113,6 +194,18 @@ class JobOrderController extends BaseController
|
|||
->setAgentNotes($req->request->get('agent_notes'))
|
||||
->setDeliveryAddress($req->request->get('delivery_address'));
|
||||
|
||||
// check if reference JO is set and validate
|
||||
if (!empty($req->request->get('ref_jo'))) {
|
||||
// get reference JO
|
||||
$ref_jo = $em->getRepository(JobOrder::class)->find($req->request->get('ref_jo'));
|
||||
|
||||
if (empty($ref_jo)) {
|
||||
$error_array['ref_jo'] = 'Invalid reference job order specified.';
|
||||
} else {
|
||||
$obj->setReferenceJO($ref_jo);
|
||||
}
|
||||
}
|
||||
|
||||
// instantiate invoice criteria
|
||||
$criteria = new InvoiceCriteria();
|
||||
|
||||
|
|
|
|||
|
|
@ -48,9 +48,30 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="m-form__section">
|
||||
<div class="form-group m-form__group row">
|
||||
<div class="col-lg-6">
|
||||
<label data-field="ref_jo">Reference Job Order:</label>
|
||||
<select class="form-control m-select2" id="ref-jo" name="ref_jo"></select>
|
||||
<div class="form-control-feedback hide" data-field="ref_jo"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="m-form__section{{ mode != 'create' ? ' m-form__section--first' }}">
|
||||
{% if mode != 'create' and obj.getReferenceJO %}
|
||||
<div class="m-form__section m-form__section--first">
|
||||
<div class="form-group m-form__group row">
|
||||
<div class="col-lg-6">
|
||||
<label data-field="ref_jo">Reference Job Order:</label>
|
||||
<input type="text" name="ref_jo" id="ref-jo" class="form-control m-input" value="{{ '#' ~ obj.getReferenceJO.getID ~ ' - ' ~ obj.getReferenceJO.getCustomer.getFirstName ~ ' ' ~ obj.getReferenceJO.getCustomer.getLastName ~ ' (Plate No: ' ~ obj.getReferenceJO.getCustomerVehicle.getPlateNumber ~ ') - ' ~ service_types[obj.getReferenceJO.getServiceType] }}" disabled>
|
||||
<div class="form-control-feedback hide" data-field="ref_jo"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="m-form__section{{ mode != 'create' and not obj.getReferenceJO ? ' m-form__section--first' }}">
|
||||
<div class="m-form__heading">
|
||||
<h3 class="m-form__heading-title">
|
||||
Customer Details
|
||||
|
|
@ -856,6 +877,25 @@ $(function() {
|
|||
})
|
||||
}).focus();
|
||||
|
||||
// reference job order selector
|
||||
$('#ref-jo').select2({
|
||||
ajax: {
|
||||
url: "{{ url('jo_search') }}",
|
||||
dataType: 'json',
|
||||
delay: 200,
|
||||
data: function (params) {
|
||||
var query = {
|
||||
search: params.term,
|
||||
page: params.page || 1
|
||||
}
|
||||
|
||||
return query;
|
||||
}
|
||||
},
|
||||
placeholder: "Select a job order",
|
||||
allowClear: true
|
||||
});
|
||||
|
||||
// reset all vehicle info form fields
|
||||
function resetVehicleFields() {
|
||||
$("[data-vehicle-field='1']").val("").css('color', '').prop('placeholder', 'Select a vehicle first');
|
||||
|
|
|
|||
Loading…
Reference in a new issue