840 lines
33 KiB
Twig
840 lines
33 KiB
Twig
{% extends 'base.html.twig' %}
|
|
|
|
{% block body %}
|
|
<!-- BEGIN: Subheader -->
|
|
<div class="m-subheader">
|
|
<div class="d-flex align-items-center">
|
|
<div class="mr-auto">
|
|
<h3 class="m-subheader__title">Job Order</h3>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- END: Subheader -->
|
|
<div class="m-content">
|
|
<!--Begin::Section-->
|
|
<div class="row">
|
|
<div class="col-xl-12">
|
|
<div class="m-portlet m-portlet--mobile">
|
|
<div class="m-portlet__head">
|
|
<div class="m-portlet__head-caption">
|
|
<div class="m-portlet__head-title">
|
|
<span class="m-portlet__head-icon">
|
|
<i class="flaticon-transport"></i>
|
|
</span>
|
|
<h3 class="m-portlet__head-text">
|
|
{% if mode == 'update' %}
|
|
Processing
|
|
<small>{{ obj.getID() }}</small>
|
|
{% else %}
|
|
Incoming
|
|
{% endif %}
|
|
</h3>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<form id="row-form" class="m-form m-form--fit m-form--label-align-right" method="post" action="{{ mode == 'update' ? url('jo_proc_submit', {'id': obj.getId()}) : url('jo_in_submit') }}">
|
|
<div class="m-portlet__body">
|
|
|
|
{% if mode == 'create' %}
|
|
<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="customer_vehicle">Select a vehicle:</label>
|
|
<select class="form-control m-select2" id="customer-vehicle" name="customer_vehicle"></select>
|
|
<div class="form-control-feedback hide" data-field="customer_vehicle"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<div class="m-form__section{{ mode == 'update' ? ' m-form__section--first' }}">
|
|
<div class="m-form__heading">
|
|
<h3 class="m-form__heading-title">
|
|
Customer Details
|
|
</h3>
|
|
</div>
|
|
<div class="form-group m-form__group row">
|
|
<div class="col-lg-6">
|
|
<label data-field="customer_first_name">First Name:</label>
|
|
<input type="text" name="customer_first_name" id="customer-first-name" class="form-control m-input" value="{{ obj.getCustomer ? obj.getCustomer.getFirstName }}" placeholder="Select a vehicle first" data-vehicle-field="1" disabled>
|
|
<div class="form-control-feedback hide" data-field="customer_first_name"></div>
|
|
</div>
|
|
<div class="col-lg-6">
|
|
<label data-field="customer_last_name">Last Name:</label>
|
|
<input type="text" name="customer_last_name" id="customer-last-name" class="form-control m-input" value="{{ obj.getCustomer ? obj.getCustomer.getLastName }}" placeholder="Select a vehicle first" data-vehicle-field="1" disabled>
|
|
<div class="form-control-feedback hide" data-field="customer_last_name"></div>
|
|
</div>
|
|
</div>
|
|
<div class="form-group m-form__group row">
|
|
<div class="col-lg-6">
|
|
<label data-field="customer_mobile_numbers">Mobile Numbers:</label>
|
|
<textarea name="customer_mobile_numbers" id="customer-mobile-numbers" class="form-control m-input" placeholder="Select a vehicle first" data-vehicle-field="1" rows="4" disabled>{{ obj.getCustomer ? obj.getCustomer.getMobileNumberList|join("\r\n") }}</textarea>
|
|
<div class="form-control-feedback hide" data-field="customer_mobile_numbers"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="m-form__section">
|
|
<div class="m-form__heading">
|
|
<h3 class="m-form__heading-title">
|
|
Vehicle Details
|
|
</h3>
|
|
</div>
|
|
<div class="form-group m-form__group row">
|
|
<div class="col-lg-3">
|
|
<label data-field="vmfg">Vehicle Manufacturer:</label>
|
|
<input type="text" name="vmfg" id="vmfg" class="form-control m-input" value="{{ obj.getCustomerVehicle ? obj.getCustomerVehicle.getVehicle.getManufacturer.getName }}" placeholder="Select a vehicle first" data-vehicle-field="1" disabled>
|
|
<div class="form-control-feedback hide" data-field="vmfg"></div>
|
|
</div>
|
|
<div class="col-lg-3">
|
|
<label data-field="vehicle_make">Vehicle Make:</label>
|
|
<input type="text" name="vehicle_make" id="vehicle-make" class="form-control m-input" value="{{ obj.getCustomerVehicle ? obj.getCustomerVehicle.getVehicle.getMake }}" placeholder="Select a vehicle first" data-vehicle-field="1" disabled>
|
|
<div class="form-control-feedback hide" data-field="vehicle_make"></div>
|
|
</div>
|
|
<div class="col-lg-3">
|
|
<label data-field="vehicle_year">Vehicle Model Year:</label>
|
|
<input type="text" name="vehicle_year" id="vehicle-year" class="form-control m-input" value="{{ obj.getCustomerVehicle ? obj.getCustomerVehicle.getModelYear }}" placeholder="Select a vehicle first" data-vehicle-field="1" disabled>
|
|
<div class="form-control-feedback hide" data-field="vehicle_year"></div>
|
|
</div>
|
|
<div class="col-lg-3">
|
|
<label data-field="vehicle_color">Vehicle Color:</label>
|
|
<input type="text" name="vehicle_color" id="vehicle-color" class="form-control m-input" value="{{ obj.getCustomerVehicle ? obj.getCustomerVehicle.getColor }}" placeholder="Select a vehicle first" data-vehicle-field="1" disabled>
|
|
<div class="form-control-feedback hide" data-field="vehicle_color"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="m-form__section">
|
|
<div class="m-form__heading">
|
|
<h3 class="m-form__heading-title">
|
|
Battery Details
|
|
</h3>
|
|
</div>
|
|
<div class="form-group m-form__group row">
|
|
<div class="col-lg-3">
|
|
<label data-field="current_battery">Current Battery:</label>
|
|
<input type="text" name="current_battery" id="current-battery" class="form-control m-input" value="{{ obj.getCustomerVehicle and obj.getCustomerVehicle.getCurrentBattery ? obj.getCustomerVehicle.getCurrentBattery.getManufacturer.getName ~ ' ' ~ obj.getCustomerVehicle.getCurrentBattery.getModel.getName ~ ' ' ~ obj.getCustomerVehicle.getCurrentBattery.getSize.getName ~ ' (' ~ obj.getCustomerVehicle.getCurrentBattery.getProductCode ~ ')' }}" placeholder="Select a vehicle first" data-vehicle-field="1" disabled>
|
|
<div class="form-control-feedback hide" data-field="current_battery"></div>
|
|
</div>
|
|
<div class="col-lg-3">
|
|
<label data-field="warranty_code">Warranty Code:</label>
|
|
<input type="text" name="warranty_code" id="warranty-code" class="form-control m-input" value="{{ obj.getCustomerVehicle ? obj.getCustomerVehicle.getWarrantyCode }}" placeholder="Select a vehicle first" data-vehicle-field="1" disabled>
|
|
<div class="form-control-feedback hide" data-field="warranty_code"></div>
|
|
</div>
|
|
<div class="col-lg-3">
|
|
<label data-field="warranty_expiration">Warranty Expiration Date:</label>
|
|
<input type="text" name="warranty_expiration" id="warranty-expiration" class="form-control m-input" value="{{ obj.getCustomerVehicle ? obj.getCustomerVehicle.getWarrantyExpiration|date("d M Y") }}" placeholder="Select a vehicle first" data-vehicle-field="1" disabled>
|
|
<div class="form-control-feedback hide" data-field="warranty_expiration"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="m-form__seperator m-form__seperator--dashed"></div>
|
|
<div class="m-form__section m-form__section">
|
|
<div class="m-form__heading flex-row">
|
|
<h3 class="m-form__heading-title">
|
|
Transaction Details
|
|
</h3>
|
|
<span class="m-switch m-switch--icon block-switch">
|
|
<label>
|
|
<input type="checkbox" name="flag_advance" id="flag-advance" value="1"{{ obj.isAdvanceOrder ? ' checked' }}>
|
|
<label class="switch-label">This is an advance order</label>
|
|
<span></span>
|
|
</label>
|
|
</span>
|
|
</div>
|
|
<div class="form-group m-form__group row">
|
|
<div class="col-lg-6">
|
|
<label data-field="service_type">Service Type:</label>
|
|
<select class="form-control m-input" name="service_type">
|
|
<!--<option value=""></option>-->
|
|
{% for key, service in service_types %}
|
|
<option value="{{ key }}"{{ obj.getServiceType == service ? ' selected' }}>{{ service }}</option>
|
|
{% endfor %}
|
|
</select>
|
|
<div class="form-control-feedback hide" data-field="service_type"></div>
|
|
</div>
|
|
</div>
|
|
<div class="form-group m-form__group row">
|
|
<div class="col-lg-6">
|
|
<label>Transaction Date:</label>
|
|
<input type="text" name="date_transaction" class="form-control m-input" value="{{ "now"|date('d M Y') }}" disabled>
|
|
<div class="form-control-feedback hide" data-field="date_transaction"></div>
|
|
</div>
|
|
<div class="col-lg-3">
|
|
<label data-field="date_schedule">Scheduled Date:</label>
|
|
<div class="input-group date dp">
|
|
<input type="text" name="date_schedule_date" class="form-control m-input" data-default-value="{{ obj.getDateSchedule ? obj.getDateSchedule|date('Y-m-d') : "now"|date('Y-m-d') }}" value="{{ obj.getDateSchedule ? obj.getDateSchedule|date('d M Y') : "now"|date('d M Y') }}" readonly placeholder="Select a date" disabled>
|
|
<span class="input-group-addon">
|
|
<i class="la la-calendar glyphicon-th"></i>
|
|
</span>
|
|
</div>
|
|
<div class="form-control-feedback hide" data-field="date_schedule_date"></div>
|
|
</div>
|
|
<div class="col-lg-3">
|
|
<label data-field="date_schedule">Scheduled Time:</label>
|
|
<div class="input-group">
|
|
<input type="text" name="date_schedule_time" class="form-control m-input tp" data-default-value="{{ obj.getDateSchedule ? obj.getDateSchedule|date('g:i A') : "now"|date('g:i A') }}" value="{{ obj.getDateSchedule ? obj.getDateSchedule|date('g:i A') : "now"|date('g:i A') }}" readonly placeholder="Select a time" disabled>
|
|
<span class="input-group-addon">
|
|
<i class="la la-clock-o glyphicon-th"></i>
|
|
</span>
|
|
</div>
|
|
<div class="form-control-feedback hide" data-field="date_schedule_time"></div>
|
|
</div>
|
|
</div>
|
|
<div class="form-group m-form__group row">
|
|
<div class="col-lg-6">
|
|
<label data-field="delivery_instructions">Delivery Instructions:</label>
|
|
<textarea name="delivery_instructions" class="form-control m-input" rows="4">{{ obj.getDeliveryInstructions }}</textarea>
|
|
<div class="form-control-feedback hide" data-field="delivery_instructions"></div>
|
|
</div>
|
|
<div class="col-lg-6">
|
|
<label data-field="agent_notes">Agent Notes:</label>
|
|
<textarea name="agent_notes" class="form-control m-input" rows="4">{{ obj.getAgentNotes }}</textarea>
|
|
<div class="form-control-feedback hide" data-field="agent_notes"></div>
|
|
</div>
|
|
</div>
|
|
<div class="form-group m-form__group row">
|
|
<div class="col-lg-6">
|
|
<label data-field="status">Status:</label>
|
|
<select class="form-control m-input" name="status">
|
|
<!--<option value=""></option>-->
|
|
{% for key, status in statuses %}
|
|
<option value="{{ key }}"{{ obj.getStatus == status ? ' selected' }}>{{ status }}</option>
|
|
{% endfor %}
|
|
</select>
|
|
<div class="form-control-feedback hide" data-field="status"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="m-form__seperator m-form__seperator--dashed"></div>
|
|
<div class="m-form__section">
|
|
<div class="m-form__heading">
|
|
<h3 class="m-form__heading-title">
|
|
Location
|
|
</h3>
|
|
</div>
|
|
<div class="form-group m-form__group row">
|
|
<div class="col-lg-6">
|
|
<label data-field="delivery_address">Delivery Address:</label>
|
|
<textarea name="delivery_address" class="form-control m-input" rows="4">{{ obj.getDeliveryAddress }}</textarea>
|
|
<div class="form-control-feedback hide" data-field="delivery_address"></div>
|
|
</div>
|
|
</div>
|
|
<div class="form-group m-form__group row">
|
|
<div class="col-lg-12">
|
|
<label name="coordinates" data-field="coordinates">Coordinates:</label>
|
|
<input type="hidden" id="map_lat" name="coord_lat" value="">
|
|
<input type="hidden" id="map_lng" name="coord_lng" value="">
|
|
<div class="input-group">
|
|
<input type="text" class="form-control" id="m_gmap_address" placeholder="Search">
|
|
<span class="input-group-btn">
|
|
<button class="btn btn-primary" id="m_gmap_btn">
|
|
<i class="fa fa-search"></i>
|
|
</button>
|
|
</span>
|
|
</div>
|
|
<div id="m_gmap" style="height:600px;"></div>
|
|
<div class="form-control-feedback hide" data-field="coordinates"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="m-form__seperator m-form__seperator--dashed"></div>
|
|
<div class="m-form__section{{ mode == 'create' ? ' m-form__section--last' }}">
|
|
<div class="m-form__heading">
|
|
<h3 class="m-form__heading-title">
|
|
Invoice
|
|
</h3>
|
|
</div>
|
|
<div class="form-group m-form__group row">
|
|
<div class="col-lg-3">
|
|
<label>Amount:</label>
|
|
<input type="text" id="invoice-amount" class="form-control m-input text-right" value="0.00" disabled>
|
|
</div>
|
|
<div class="col-lg-3">
|
|
<label>Tax:</label>
|
|
<input type="text" id="invoice-tax" class="form-control m-input text-right" value="0.00" disabled>
|
|
</div>
|
|
<div class="col-lg-3">
|
|
<label>Discount:</label>
|
|
<input type="text" id="invoice-discount" class="form-control m-input text-right" value="0.00" disabled>
|
|
</div>
|
|
<div class="col-lg-3">
|
|
<label>Final Amount:</label>
|
|
<input type="text" id="invoice-final-amount" class="form-control m-input text-right" value="0.00" disabled>
|
|
</div>
|
|
</div>
|
|
<div class="form-group m-form__group row">
|
|
<div class="col-lg-12">
|
|
<table id="invoice-table" class="table table-compact m-table">
|
|
<thead>
|
|
<tr>
|
|
<th>Item</th>
|
|
<th class="text-right">Quantity</th>
|
|
<th>Price Level</th>
|
|
<th class="text-right">Res Price<br>(w/ Tax)</th>
|
|
<th class="text-right">Total Price Adj.</th>
|
|
<th>Final Amount</th>
|
|
<th>No Trade-in Item?</th>
|
|
<th>Battery Class</th>
|
|
<th>Discount Item</th>
|
|
<th>Percentage</th>
|
|
<th>Converted Rate<br>(in Decimal)</th>
|
|
<th class="text-right">Discount Amount</th>
|
|
<th>Warranty Class</th>
|
|
<th style="width: 50px;"></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr class="placeholder-row">
|
|
<td colspan="14">
|
|
No items to display.
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
<div class="form-group m-form__group row">
|
|
<div class="col-lg-3">
|
|
<select class="form-control m-input" id="invoice-bmfg">
|
|
<option value="">Select a battery manufacturer</option>
|
|
{% for manufacturer in bmfgs %}
|
|
<option value="{{ manufacturer.getID() }}">{{ manufacturer.getName() }}</option>
|
|
{% endfor %}
|
|
</select>
|
|
</div>
|
|
<div class="col-lg-3">
|
|
<select class="form-control m-input" id="invoice-battery" data-value="" disabled>
|
|
<option value="">Select a manufacturer first</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-lg-2">
|
|
<input type="text" id="invoice-quantity" class="form-control m-input text-right" placeholder="Quantity">
|
|
</div>
|
|
<div class="col-lg-4">
|
|
<button type="button" class="btn btn-primary" id="btn-add-to-invoice">Add to Invoice</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{% if mode == 'update' %}
|
|
<div class="m-form__seperator m-form__seperator--dashed"></div>
|
|
<div class="m-form__section m-form__section--last">
|
|
<div class="m-form__heading">
|
|
<h3 class="m-form__heading-title">
|
|
Nearest Outlets
|
|
</h3>
|
|
</div>
|
|
<div class="form-group m-form__group row">
|
|
<div class="col-lg-12">
|
|
<table id="outlets-table" class="table table-compact table-hover table-clickable m-table">
|
|
<thead>
|
|
<tr>
|
|
<th>Name</th>
|
|
<th>Address</th>
|
|
<th>Numbers</th>
|
|
<th>Opening</th>
|
|
<th>Closing</th>
|
|
<th class="text-right">Sales Count</th>
|
|
<th class="text-right">Sales Amount</th>
|
|
<th class="text-right">Service Count</th>
|
|
<th class="text-right">Distance</th>
|
|
<th class="text-right">Travel Time</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr class="placeholder-row{{ outlets|length > 0 ? ' hide' }}">
|
|
<td colspan="10">
|
|
No items to display.
|
|
</td>
|
|
</tr>
|
|
|
|
{% for outlet in outlets %}
|
|
<tr data-id="{{ outlet.outlet.getID }}">
|
|
<td>{{ outlet.outlet.getName }}</td>
|
|
<td>{{ outlet.outlet.getAddress }}</td>
|
|
<td>{{ outlet.outlet.getContactNumbers }}</td>
|
|
<td>{{ outlet.outlet.getTimeOpen|date("g:i A") }}</td>
|
|
<td>{{ outlet.outlet.getTimeClose|date("g:i A") }}</td>
|
|
<td class="text-right">0.00</td>
|
|
<td class="text-right">0.00</td>
|
|
<td class="text-right">0</td>
|
|
<td class="text-right">{{ outlet.distance ? outlet.distance : '-' }}</td>
|
|
<td class="text-right">{{ outlet.duration ? outlet.duration : '-' }}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="outlet_map" style="height:600px;"></div>
|
|
{% endif %}
|
|
|
|
</div>
|
|
<div class="m-portlet__foot m-portlet__foot--fit">
|
|
<div class="m-form__actions m-form__actions--solid m-form__actions--right">
|
|
<div class="row">
|
|
<div class="col-lg-12">
|
|
<button type="submit" class="btn btn-success">Submit</button>
|
|
<a href="{{ url('jo_in') }}" class="btn btn-secondary">Cancel</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|
|
|
|
{% block scripts %}
|
|
<script src="//maps.google.com/maps/api/js?key={{ gmaps_api_key }}" type="text/javascript"></script>
|
|
<script src="/assets/vendors/custom/gmaps/gmaps.js" type="text/javascript"></script>
|
|
|
|
<script>
|
|
$(function() {
|
|
// BEGIN google maps stuff
|
|
function selectPoint(map, latlng) {
|
|
var lat = latlng.lat();
|
|
var lng = latlng.lng();
|
|
|
|
// show it in map
|
|
map.removeMarkers();
|
|
map.setCenter(lat, lng);
|
|
map.addMarker({
|
|
lat: lat,
|
|
lng: lng
|
|
});
|
|
|
|
// set value in hidden input
|
|
$('#map_lat').val(lat);
|
|
$('#map_lng').val(lng);
|
|
}
|
|
|
|
var map = new GMaps({
|
|
div: '#m_gmap',
|
|
lat: 14.6091,
|
|
lng: 121.0223,
|
|
click: function(e) {
|
|
// handle click in map
|
|
selectPoint(map, e.latLng);
|
|
e.stop();
|
|
}
|
|
});
|
|
var handleAction = function() {
|
|
var text = $.trim($('#m_gmap_address').val());
|
|
GMaps.geocode({
|
|
address: text,
|
|
callback: function(results, status) {
|
|
map.removeMarkers();
|
|
if (status == 'OK') {
|
|
selectPoint(map, results[0].geometry.location);
|
|
}
|
|
},
|
|
region: 'ph'
|
|
});
|
|
}
|
|
|
|
$('#m_gmap_btn').click(function(e) {
|
|
e.preventDefault();
|
|
handleAction();
|
|
});
|
|
|
|
$("#m_gmap_address").keypress(function(e) {
|
|
var keycode = (e.keyCode ? e.keyCode : e.which);
|
|
if (keycode == '13') {
|
|
e.preventDefault();
|
|
handleAction();
|
|
}
|
|
});
|
|
|
|
{% if mode == 'update' %}
|
|
// check if we need to set map
|
|
var latlng = new google.maps.LatLng({{ obj.getCoordinates.getLatitude }}, {{ obj.getCoordinates.getLongitude }});
|
|
selectPoint(map, latlng);
|
|
|
|
// display outlet map
|
|
var omap = new GMaps({
|
|
div: '#outlet_map',
|
|
lat: {{ obj.getCoordinates.getLatitude }},
|
|
lng: {{ obj.getCoordinates.getLongitude }}
|
|
});
|
|
|
|
omap.addMarker({
|
|
lat: {{ obj.getCoordinates.getLatitude }},
|
|
lng: {{ obj.getCoordinates.getLongitude }}
|
|
});
|
|
|
|
{% for outlet in outlets %}
|
|
omap.addMarker({
|
|
lat: {{ outlet.outlet.getCoordinates.getLatitude }},
|
|
lng: {{ outlet.outlet.getCoordinates.getLongitude }},
|
|
title: "{{ outlet.outlet.getName }}",
|
|
content: "{{ outlet.outlet.getName }}"
|
|
});
|
|
{% endfor %}
|
|
|
|
{% endif %}
|
|
|
|
|
|
// END google maps stuff
|
|
|
|
$("#row-form").submit(function(e) {
|
|
var form = $(this);
|
|
|
|
// get all fields, including disabled ones
|
|
var disabled = form.find(":input:disabled").prop('disabled', false);
|
|
var fields = form.serializeArray().map(function(x){this[x.name] = x.value; return this;}.bind({}))[0];
|
|
disabled.prop('disabled', true);
|
|
|
|
// add invoice items to data
|
|
fields['invoice_items'] = invoiceItems;
|
|
|
|
{% if mode == 'update' %}
|
|
// add selected outlet to data
|
|
fields['outlet'] = selectedOutlet;
|
|
{% endif %}
|
|
|
|
e.preventDefault();
|
|
|
|
$.ajax({
|
|
method: "POST",
|
|
url: form.prop('action'),
|
|
data: fields
|
|
}).done(function(response) {
|
|
// remove all error classes
|
|
removeErrors();
|
|
swal({
|
|
title: 'Done!',
|
|
text: 'Your changes have been saved!',
|
|
type: 'success',
|
|
onClose: function() {
|
|
window.location.href = "{{ mode == 'create' ? url('jo_in') : url('jo_proc') }}";
|
|
}
|
|
});
|
|
}).fail(function(response) {
|
|
var errors = response.responseJSON.errors;
|
|
var firstfield = false;
|
|
|
|
// remove all error classes first
|
|
removeErrors();
|
|
|
|
// display errors contextually
|
|
$.each(errors, function(field, msg) {
|
|
var formfield = $("[name='" + field + "']");
|
|
var label = $("label[data-field='" + field + "']");
|
|
var msgbox = $(".form-control-feedback[data-field='" + field + "']");
|
|
|
|
// add error classes to bad fields
|
|
formfield.addClass('form-control-danger');
|
|
label.addClass('has-danger');
|
|
msgbox.html(msg).addClass('has-danger').removeClass('hide');
|
|
|
|
// check if this field comes first in DOM
|
|
var domfield = formfield.get(0);
|
|
|
|
if (!firstfield || (firstfield && firstfield.compareDocumentPosition(domfield) === 2)) {
|
|
firstfield = domfield;
|
|
}
|
|
});
|
|
|
|
// focus on first bad field
|
|
firstfield.focus();
|
|
|
|
// scroll to above that field to make it visible
|
|
$('html, body').animate({
|
|
scrollTop: $(firstfield).offset().top - 200
|
|
}, 100);
|
|
});
|
|
});
|
|
|
|
// remove all error classes
|
|
function removeErrors() {
|
|
$(".form-control-danger").removeClass('form-control-danger');
|
|
$("[data-field]").removeClass('has-danger');
|
|
$(".form-control-feedback[data-field]").addClass('hide');
|
|
}
|
|
|
|
// store selected vehicle data
|
|
var vdata;
|
|
|
|
// vehicle selector
|
|
$('#customer-vehicle').select2({
|
|
ajax: {
|
|
url: "{{ url('customer_vehicle_search') }}",
|
|
dataType: 'json',
|
|
delay: 200,
|
|
data: function (params) {
|
|
var query = {
|
|
search: params.term,
|
|
page: params.page || 1
|
|
}
|
|
|
|
return query;
|
|
}
|
|
},
|
|
placeholder: "Select a vehicle"
|
|
}).on('select2:select', function(e) {
|
|
var data = e.params.data;
|
|
|
|
// get info for this customer vehicle
|
|
$.ajax({
|
|
method: "GET",
|
|
url: "{{ url('customer_vehicle_info') }}",
|
|
data: { id: data.id }
|
|
}).done(function(response) {
|
|
vdata = response.data;
|
|
|
|
// reset vehicle fields
|
|
resetVehicleFields();
|
|
|
|
// set form fields
|
|
$("[data-vehicle-field='1']").prop('placeholder', '');
|
|
$("#customer-first-name").val(vdata.customer.first_name);
|
|
$("#customer-last-name").val(vdata.customer.last_name);
|
|
$("#customer-mobile-numbers").val(vdata.customer.mobile_numbers.join("\r\n"));
|
|
$("#vmfg").val(vdata.vehicle.mfg_name);
|
|
$("#vehicle-make").val(vdata.vehicle.make);
|
|
$("#vehicle-year").val(vdata.vehicle.model_year);
|
|
$("#vehicle-color").val(vdata.vehicle.color);
|
|
|
|
if (typeof vdata.battery !== 'undefined') {
|
|
$("#current-battery").val(vdata.battery.mfg_name + " " + vdata.battery.model_name + " " + vdata.battery.size_name + " (" + vdata.battery.prod_code + ")");
|
|
$("#warranty-code").val(vdata.battery.warranty_code).prop('placeholder', '');
|
|
$("#warranty-expiration").val(vdata.battery.warranty_expiration).prop('placeholder', '');
|
|
} else {
|
|
$("#current-battery, #warranty-code, #warranty-expiration").val("No current battery").css('color', '#f4516c');
|
|
}
|
|
})
|
|
}).focus();
|
|
|
|
// reset all vehicle info form fields
|
|
function resetVehicleFields() {
|
|
$("[data-vehicle-field='1']").val("").css('color', '').prop('placeholder', 'Select a vehicle first');
|
|
}
|
|
|
|
// datepicker
|
|
$(".dp").datepicker({
|
|
format: "dd M yyyy",
|
|
todayHighlight: true,
|
|
autoclose: true,
|
|
pickerPosition: 'bottom-left',
|
|
bootcssVer: 3,
|
|
clearBtn: true
|
|
});
|
|
|
|
// timepicker
|
|
$('.tp').timepicker({
|
|
format: "HH:ii P",
|
|
minuteStep: 1,
|
|
showMeridian: true,
|
|
snapToStep: true,
|
|
bootcssVer: 3,
|
|
clearBtn: true,
|
|
todayHighlight: true,
|
|
autoclose: true,
|
|
pickerPosition: 'bottom-left'
|
|
});
|
|
|
|
// toggle advance order fields
|
|
$("#flag-advance").change(function() {
|
|
var dp = $("[name='date_schedule_date']");
|
|
var tp = $("[name='date_schedule_time']");
|
|
var checked = $(this).prop('checked');
|
|
|
|
if (checked) {
|
|
dp.prop('disabled', false);
|
|
tp.prop('disabled', false);
|
|
} else {
|
|
// reset to default values if disabled
|
|
var dateObj = moment(dp.data('default-value'), "YYYY-MM-DD");
|
|
dp.prop('disabled', true).parent().datepicker('setDate', dateObj.toDate());
|
|
tp.prop('disabled', true).timepicker('setTime', tp.data('default-value'));
|
|
}
|
|
}).change();
|
|
|
|
// update battery list when changing manufacturer
|
|
$("#invoice-bmfg").change(function() {
|
|
var id = $(this).val();
|
|
var field = $("#invoice-battery");
|
|
|
|
// no id specified
|
|
if (!id) {
|
|
field.html('<option value="">Select a manufacturer first</option>').prop('disabled', true);
|
|
return true;
|
|
}
|
|
|
|
// get vehicles for this manufacturer
|
|
$.ajax({
|
|
method: "POST",
|
|
url: "{{ url('bmfg_batteries') }}",
|
|
data: {id: id}
|
|
}).done(function(response) {
|
|
if (response.data.length > 0) {
|
|
var html = '';
|
|
|
|
// TODO: Battery unit price is static for now
|
|
var unitPrice = 1000;
|
|
|
|
$.each(response.data, function(index, battery) {
|
|
html += '<option value="' + battery.id + '" data-index="' + index + '" data-unit-price="' + unitPrice + '">' + battery.model_name + ' ' + battery.size_name + ' (' + battery.prod_code + ')</option>';
|
|
});
|
|
|
|
field.html(html).prop('disabled', false);
|
|
} else {
|
|
field.html('<option value="">No batteries found</option>').prop('disabled', true);
|
|
}
|
|
});
|
|
});
|
|
|
|
// mask quantity field
|
|
$("#invoice-quantity").inputmask("mask", {
|
|
mask: "9999999",
|
|
placeholder: ""
|
|
});
|
|
|
|
var invoiceItems = [];
|
|
var invoiceDiscount = 0;
|
|
var invoiceTax = 0;
|
|
var invoiceTotal = 0;
|
|
|
|
// add to invoice
|
|
$("#btn-add-to-invoice").click(function() {
|
|
var bmfg = $("#invoice-bmfg");
|
|
var battery = $("#invoice-battery");
|
|
var qty = $("#invoice-quantity");
|
|
var tbody = $("#invoice-table tbody");
|
|
var unitPrice = parseFloat(battery.find('option:selected').data('unit-price'));
|
|
|
|
if (!bmfg.val() || !battery.val() || !qty.val()) {
|
|
swal({
|
|
title: 'Whoops!',
|
|
text: 'Please fill in all the invoice fields.',
|
|
type: 'warning'
|
|
});
|
|
|
|
return false;
|
|
}
|
|
|
|
if (isNaN(qty.val())) {
|
|
swal({
|
|
title: 'Whoops!',
|
|
text: 'Invalid quantity specified.',
|
|
type: 'warning'
|
|
});
|
|
|
|
return false;
|
|
}
|
|
|
|
var qtyVal = parseInt(qty.val());
|
|
var subtotal = unitPrice * qtyVal;
|
|
|
|
// add to invoice array for form submission
|
|
invoiceItems.push({
|
|
'battery_manufacturer': bmfg.val(),
|
|
'battery': battery.val(),
|
|
'battery_price': unitPrice,
|
|
'quantity': qtyVal,
|
|
'subtotal': subtotal
|
|
});
|
|
|
|
// build row html
|
|
// TODO: Fill with actual data for the rest of the columns
|
|
var html = '<tr>' +
|
|
'<td>' + battery.find('option:selected').text() + '</td>' +
|
|
'<td class="text-right col-quantity">' + qty.val() + '</td>' +
|
|
'<td>Base Price</td>' + // TODO: static for now
|
|
'<td class="col-unit-price">' + (Math.round(unitPrice * 100) / 100).toFixed(2) + '</td>' + // TODO: not sure if this is correct since it says w/ tax
|
|
'<td>0.00</td>' + // TODO: static for now
|
|
'<td>' + (Math.round(subtotal * 100) / 100).toFixed(2) + '</td>' + // TODO: I assumed this is unit price * qty
|
|
'<td><span class="m-badge m-badge--success m-badge--wide">Yes</span></td>' + // TODO: static for now
|
|
'<td>Regular</td>' +
|
|
'<td></td>' +
|
|
'<td></td>' +
|
|
'<td></td>' +
|
|
'<td class="col-discount"></td>' +
|
|
'<td></td>' +
|
|
'<td><button type="button" class="m-portlet__nav-link btn m-btn m-btn--hover-danger m-btn--icon m-btn--icon-only m-btn--pill btn-invoice-delete" title="Delete"><i class="la la-trash"></i></button></td>' +
|
|
'</tr>';
|
|
|
|
// save to invoice table
|
|
tbody.find('.placeholder-row').addClass('hide');
|
|
tbody.append(html);
|
|
|
|
// add to invoice total and recompute
|
|
invoiceTotal += subtotal;
|
|
updateInvoiceFigures();
|
|
});
|
|
|
|
function updateInvoiceFigures() {
|
|
var amountField = $("#invoice-amount");
|
|
var taxField = $("#invoice-tax");
|
|
var discountField = $("#invoice-discount");
|
|
var finalAmountField = $("#invoice-final-amount");
|
|
var finalAmount = invoiceTotal + invoiceTax - invoiceDiscount;
|
|
|
|
amountField.val(parseFloat(Math.round(invoiceTotal * 100) / 100).toFixed(2));
|
|
taxField.val(parseFloat(Math.round(invoiceTax * 100) / 100).toFixed(2));
|
|
discountField.val(parseFloat(Math.round(invoiceDiscount * 100) / 100).toFixed(2));
|
|
finalAmountField.val(parseFloat(Math.round(finalAmount * 100) / 100).toFixed(2));
|
|
}
|
|
|
|
// remove from invoice table
|
|
$(document).on("click", ".btn-invoice-delete", function() {
|
|
var tbody = $("#invoice-table tbody");
|
|
var row = $(this).closest('tr');
|
|
var qty = row.find('.col-quantity').html();
|
|
var unitPrice = row.find('.col-unit-price').html();
|
|
|
|
// set defaults if for whatever reason they are not valid numbers
|
|
if (isNaN(qty)) {
|
|
qty = 1;
|
|
}
|
|
|
|
if (isNaN(unitPrice)) {
|
|
unitPrice = 0;
|
|
}
|
|
|
|
// subtract from totals
|
|
var subtotal = parseFloat(unitPrice) * parseInt(qty);
|
|
invoiceTotal -= subtotal;
|
|
updateInvoiceFigures();
|
|
|
|
// remove from table
|
|
row.remove();
|
|
|
|
// get total item rows and show placeholder if needed
|
|
var visibleRows = tbody.find('tr:not(.placeholder-row)').length;
|
|
|
|
if (visibleRows === 0) {
|
|
tbody.find('.placeholder-row').removeClass('hide');
|
|
}
|
|
});
|
|
|
|
{% if mode == 'update' %}
|
|
|
|
var selectedOutlet = false;
|
|
|
|
$("#outlets-table tbody tr").click(function() {
|
|
var id = $(this).data('id');
|
|
|
|
if (id != selectedOutlet) {
|
|
// highlight this row, set outlet value
|
|
$("#outlets-table").find('.m-table__row--primary').removeClass('m-table__row--primary');
|
|
|
|
$(this).addClass('m-table__row--primary');
|
|
|
|
// set value
|
|
selectedOutlet = id;
|
|
} else {
|
|
// unhighlight this row
|
|
$(this).removeClass('m-table__row--primary');
|
|
|
|
// remove id value
|
|
selectedOutlet = false;
|
|
}
|
|
});
|
|
{% endif %}
|
|
});
|
|
</script>
|
|
{% endblock %}
|