partial update transaction work with stock product

This commit is contained in:
2025-06-24 19:42:19 +07:00
parent 33502e905d
commit c3233ea6b2
20 changed files with 3432 additions and 239 deletions

View File

@@ -268,6 +268,65 @@ use Illuminate\Support\Facades\Auth;
width: 100% !important;
max-width: 100%;
}
/* Style for placeholder options */
select option[disabled] {
color: #6c757d;
font-style: italic;
background-color: #f8f9fa;
}
/* Prevent auto-selection of first option */
select:focus option:first-child {
background-color: #f8f9fa;
}
/* Required field styling */
.form-control[required]:not(:placeholder-shown):valid {
border-color: #28a745;
box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
}
.form-control[required]:not(:placeholder-shown):invalid {
border-color: #dc3545;
box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
}
/* Required field indicator */
.form-control[required]::placeholder {
color: #6c757d;
}
/* Service Advisor required styling */
select[name="user_sa_id"][required] option:first-child {
color: #6c757d;
font-style: italic;
}
/* Required field labels */
.form-group label:after {
content: " *";
color: #dc3545;
font-weight: bold;
}
/* Required field focus styling */
.form-control[required]:focus {
border-color: #5d78ff;
box-shadow: 0 0 0 0.2rem rgba(93, 120, 255, 0.25);
}
/* Invalid field styling */
.form-control.is-invalid {
border-color: #dc3545;
box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
}
/* Valid field styling */
.form-control.is-valid {
border-color: #28a745;
box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
}
</style>
@endsection
@@ -364,9 +423,31 @@ use Illuminate\Support\Facades\Auth;
<input type="hidden" name="form" value="work">
<input type="hidden" name="mechanic_id" value="{{ $mechanic->id }}">
<input type="hidden" name="dealer_id" value="{{ $mechanic->dealer_id }}">
<!-- Stock Error Display -->
@if($errors->has('stock'))
<div class="alert alert-warning alert-dismissible fade show" role="alert">
<strong><i class="fa fa-exclamation-triangle"></i> Peringatan Stock:</strong>
<br>{!! $errors->first('stock') !!}
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
@endif
@if($errors->has('error'))
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<strong><i class="fa fa-times-circle"></i> Error:</strong>
{{ $errors->first('error') }}
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
@endif
<div class="form-group row">
<div class="col-6">
<input type="text" name="spk_no" class="form-control @if(old('form') == 'work') @error('spk_no') is-invalid @enderror @endif" value="{{ old('spk_no') }}" placeholder="No. SPK">
<label>No. SPK</label>
<input type="text" name="spk_no" class="form-control @if(old('form') == 'work') @error('spk_no') is-invalid @enderror @endif" value="{{ old('spk_no') }}" placeholder="No. SPK" required>
@if(old('form') == 'work')
@error('spk_no')
@@ -377,7 +458,8 @@ use Illuminate\Support\Facades\Auth;
@endif
</div>
<div class="col-6">
<input type="text" name="police_number" class="form-control @if(old('form') == 'work') @error('police_number') is-invalid @enderror" @endif value="{{ old('police_number') }}" placeholder="No. Polisi">
<label>No. Polisi</label>
<input type="text" name="police_number" class="form-control @if(old('form') == 'work') @error('police_number') is-invalid @enderror" @endif value="{{ old('police_number') }}" placeholder="No. Polisi" required>
@if(old('form') == 'work')
@error('police_number')
<span class="invalid-feedback" role="alert">
@@ -389,6 +471,7 @@ use Illuminate\Support\Facades\Auth;
</div>
<div class="form-group row">
<div class="col-6">
<label>Warranty</label>
<select name="warranty" class="form-control @if(old('form') == 'work') @error('warranty') is-invalid @enderror @endif">
<option selected>Warranty</option>
<option value="1" @if(old('form') == 'work') @if(old('warranty') == 1) selected @endif @endif>Ya</option>
@@ -403,6 +486,7 @@ use Illuminate\Support\Facades\Auth;
@endif
</div>
<div class="col-6">
<label>Tanggal Pekerjaan</label>
<input type="text" name="date" id="date-work" required class="form-control @if(old('form') == 'work') @error('date') is-invalid @enderror @endif" placeholder="Tanggal Pekerjaan">
@if(old('form') == 'work')
@error('date')
@@ -414,7 +498,8 @@ use Illuminate\Support\Facades\Auth;
</div>
</div>
<div class="form-group mt-4">
<select name="user_sa_id" class="form-control @if(old('form') == 'work') @error('user_sa_id') is-invalid @enderror @endif">
<label>Service Advisor</label>
<select name="user_sa_id" class="form-control @if(old('form') == 'work') @error('user_sa_id') is-invalid @enderror @endif" required>
<option value="" selected>Service Advisor</option>
@foreach ($user_sas as $user_sa)
<option @if(old('form') == 'work') @if($user_sa->id == old('user_sa_id')) selected @enderror @endif value="{{ $user_sa->id }}">{{ $user_sa->name }}</option>
@@ -436,10 +521,10 @@ use Illuminate\Support\Facades\Auth;
@for ($i = 0; $i < count(old('work_id')); $i++)
<div class="form-group row" id="work_field{{ $i+1 }}">
<div class="col-6">
<select name="work_id[]" id="work_work{{ $i+1 }}" class="form-control @error('work_id.'.$i)" is-invalid @enderror>
<option selected disabled>Pekerjaan</option>
<select name="work_id[]" id="work_work{{ $i+1 }}" class="form-control @error('work_id.'.$i) is-invalid @enderror">
<option value="" disabled>Pekerjaan</option>
@foreach ($work_works as $work)
<option value="{{ $work->id }}" @if($work->id == old('work_id.'.$i)) selected @endif>{{ $work->name }}</option>
<option value="{{ $work->id }}" @if($work->id == old('work_id.'.$i)) selected @endif>{{ $work->name }}</option>
@endforeach
</select>
@@ -467,7 +552,7 @@ use Illuminate\Support\Facades\Auth;
<div class="form-group row" id="work_field1">
<div class="col-6">
<select name="work_id[]" id="work_work1" class="form-control">
<option selected disabled>Pekerjaan</option>
<option value="" selected disabled>Pekerjaan</option>
@foreach ($work_works as $work)
<option value="{{ $work->id }}">{{ $work->name }}</option>
@endforeach
@@ -483,7 +568,7 @@ use Illuminate\Support\Facades\Auth;
<div class="form-group row" id="work_field2">
<div class="col-6">
<select name="work_id[]" id="work_work2" class="form-control">
<option selected disabled>Pekerjaan</option>
<option value="" selected disabled>Pekerjaan</option>
@foreach ($work_works as $work)
<option value="{{ $work->id }}">{{ $work->name }}</option>
@endforeach
@@ -499,7 +584,7 @@ use Illuminate\Support\Facades\Auth;
<div class="form-group row" id="work_field3">
<div class="col-6">
<select name="work_id[]" id="work_work3" class="form-control">
<option selected disabled>Pekerjaan</option>
<option value="" selected disabled>Pekerjaan</option>
@foreach ($work_works as $work)
<option value="{{ $work->id }}">{{ $work->name }}</option>
@endforeach
@@ -515,7 +600,7 @@ use Illuminate\Support\Facades\Auth;
<div class="form-group row" id="work_field4">
<div class="col-6">
<select name="work_id[]" id="work_work4" class="form-control">
<option selected disabled>Pekerjaan</option>
<option value="" selected disabled>Pekerjaan</option>
@foreach ($work_works as $work)
<option value="{{ $work->id }}">{{ $work->name }}</option>
@endforeach
@@ -531,7 +616,7 @@ use Illuminate\Support\Facades\Auth;
<div class="form-group row" id="work_field5">
<div class="col-6">
<select name="work_id[]" id="work_work5" class="form-control">
<option selected disabled>Pekerjaan</option>
<option value="" selected disabled>Pekerjaan</option>
@foreach ($work_works as $work)
<option value="{{ $work->id }}">{{ $work->name }}</option>
@endforeach
@@ -548,7 +633,7 @@ use Illuminate\Support\Facades\Auth;
<div class="row">
<div class="col-10"></div>
<div class="col-2">
<button class="btn mb-4 btn-sm btn-primary float-right btn-add-field-work" style="width: 100%;" onclick="addFormField('work'); return false;">+</button>
<button class="btn mb-4 btn-sm btn-primary float-right btn-add-field-work" style="width: 100%;" onclick="addFormFieldWithStockCheck('work'); return false;">+</button>
</div>
</div>
</div>
@@ -565,7 +650,8 @@ use Illuminate\Support\Facades\Auth;
<input type="hidden" name="dealer_id" value="{{ $mechanic->dealer_id }}">
<div class="form-group row">
<div class="col-6">
<input type="text" name="spk_no" class="form-control @if(old('form') == 'wash') @error('spk_no') is-invalid @enderror @endif" value="{{ old('spk_no') }}" placeholder="No. SPK">
<label>No. SPK</label>
<input type="text" name="spk_no" class="form-control @if(old('form') == 'wash') @error('spk_no') is-invalid @enderror @endif" value="{{ old('spk_no') }}" placeholder="No. SPK" required>
@if(old('form') == 'wash')
@error('spk_no')
<span class="invalid-feedback" role="alert">
@@ -575,7 +661,8 @@ use Illuminate\Support\Facades\Auth;
@endif
</div>
<div class="col-6">
<input type="text" name="police_number" class="form-control @if(old('form') == 'wash') @error('police_number') is-invalid @enderror @endif" value="{{ old('police_number') }}" placeholder="No. Polisi">
<label>No. Polisi</label>
<input type="text" name="police_number" class="form-control @if(old('form') == 'wash') @error('police_number') is-invalid @enderror @endif" value="{{ old('police_number') }}" placeholder="No. Polisi" required>
@if(old('form') == 'wash')
@error('police_number')
<span class="invalid-feedback" role="alert">
@@ -587,6 +674,7 @@ use Illuminate\Support\Facades\Auth;
</div>
<div class="form-group row">
<div class="col-6">
<label>Warranty</label>
<select name="warranty" class="form-control @if(old('form') == 'wash') @error('warranty') is-invalid @enderror @endif">
<option selected>Warranty</option>
<option value="1" @if(old('form') == 'wash') @if(old('warranty') == 1) selected @endif @endif>Ya</option>
@@ -599,7 +687,8 @@ use Illuminate\Support\Facades\Auth;
@enderror
</div>
<div class="col-6">
<input type="text" id="date-wash" name="date" class="form-control @if(old('form') == 'wash') @error('date') is-invalid @enderror @endif" placeholder="Tanggal Pekerjaan">
<label>Tanggal Pekerjaan</label>
<input type="text" id="date-wash" name="date" class="form-control @if(old('form') == 'wash') @error('date') is-invalid @enderror @endif" placeholder="Tanggal Pekerjaan" required>
@if(old('form') == 'wash')
@error('date')
<span class="invalid-feedback" role="alert">
@@ -610,8 +699,9 @@ use Illuminate\Support\Facades\Auth;
</div>
</div>
<div class="form-group mt-4">
<select name="user_sa_id" class="form-control @if(old('form') == 'wash') @error('user_sa_id') is-invalid @enderror @endif">
<option selected>Service Advisor</option>
<label>Service Advisor</label>
<select name="user_sa_id" class="form-control @if(old('form') == 'wash') @error('user_sa_id') is-invalid @enderror @endif" required>
<option value="" selected>Service Advisor</option>
@foreach ($user_sas as $user_sa)
<option @if(old('form') == 'wash') @if($user_sa->id == old('user_sa_id')) selected @enderror @endif value="{{ $user_sa->id }}">{{ $user_sa->name }}</option>
@endforeach
@@ -896,7 +986,114 @@ use Illuminate\Support\Facades\Auth;
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
});
// Global variables for stock checking
let dealerId = {{ $mechanic->dealer_id }};
let stockWarnings = {};
// Function to check stock availability for selected work
function checkStockAvailability(workId, quantity, callback) {
if (!workId || !quantity || quantity < 1) {
if (callback) callback(null);
return;
}
$.ajax({
url: "{{ route('transaction.check-stock') }}",
method: 'POST',
data: {
work_id: workId,
dealer_id: dealerId,
quantity: quantity,
_token: $('meta[name="csrf-token"]').attr('content')
},
success: function(response) {
if (callback) callback(response.data);
},
error: function(xhr) {
console.error('Error checking stock:', xhr);
if (callback) callback(null);
}
});
}
// Function to display stock warning
function displayStockWarning(fieldId, stockData) {
// Remove existing warning
$(`#stock-warning-${fieldId}`).remove();
if (!stockData || stockData.available) {
return; // No warning needed
}
let warningHtml = `
<div id="stock-warning-${fieldId}" class="alert alert-warning mt-2 mb-0" style="font-size: 12px;">
<strong><i class="fa fa-exclamation-triangle"></i> Peringatan Stock:</strong> ${stockData.message}
<ul class="mb-0 mt-1" style="font-size: 11px;">
`;
stockData.details.forEach(function(detail) {
if (!detail.is_available) {
warningHtml += `
<li>${detail.product_name}: Butuh ${detail.required_quantity}, Tersedia ${detail.available_stock}</li>
`;
}
});
warningHtml += `
</ul>
</div>
`;
$(`#work_field${fieldId.replace('work_work', '')}`).append(warningHtml);
}
// Function to handle work selection change
function handleWorkSelectionChange(selectElement) {
let workId = $(selectElement).val();
let fieldId = $(selectElement).attr('id');
let quantityInput = $(selectElement).closest('.form-group').find('input[name="quantity[]"]');
let quantity = parseInt(quantityInput.val()) || 1;
if (workId) {
checkStockAvailability(workId, quantity, function(stockData) {
displayStockWarning(fieldId, stockData);
// Store warning data for form submission validation
if (stockData && !stockData.available) {
stockWarnings[fieldId] = stockData;
} else {
delete stockWarnings[fieldId];
}
});
} else {
// Remove warning when no work selected
$(`#stock-warning-${fieldId}`).remove();
delete stockWarnings[fieldId];
}
}
// Function to handle quantity change
function handleQuantityChange(quantityInput) {
let workSelect = $(quantityInput).closest('.form-group').find('select[name="work_id[]"]');
let workId = workSelect.val();
let quantity = parseInt($(quantityInput).val()) || 1;
if (workId && quantity > 0) {
let fieldId = workSelect.attr('id');
checkStockAvailability(workId, quantity, function(stockData) {
displayStockWarning(fieldId, stockData);
// Store warning data for form submission validation
if (stockData && !stockData.available) {
stockWarnings[fieldId] = stockData;
} else {
delete stockWarnings[fieldId];
}
});
}
}
function logout(event){
event.preventDefault();
@@ -973,23 +1170,296 @@ use Illuminate\Support\Facades\Auth;
function getWork(ajax_work_url, form, id) {
$.get(ajax_work_url, function(res) {
var $select = $(`#${form}_work${id}`);
// Clear existing options except the first one (placeholder)
$select.find('option:not(:first)').remove();
// Add new options
$.each(res.data, function (i, item) {
$(`#${form}_work${id}`).append($('<option>', {
$select.append($('<option>', {
value: item.id,
text : item.name
}));
});
// Ensure placeholder is still properly set
var $placeholder = $select.find('option:first');
if ($placeholder.length) {
$placeholder.prop('disabled', true).prop('selected', true).val('');
}
})
}
// Add event listeners for existing fields
$(document).ready(function() {
// Initial fields (work1, work2, etc.)
$('select[name="work_id[]"]').on('change', function() {
handleWorkSelectionChange(this);
});
$('input[name="quantity[]"]').on('input', function() {
handleQuantityChange(this);
});
// Check stock for pre-filled fields
$('select[name="work_id[]"]').each(function() {
if ($(this).val()) {
handleWorkSelectionChange(this);
}
});
// Ensure placeholder options are properly disabled and not selectable
$('select[name="work_id[]"]').each(function() {
var $select = $(this);
var $placeholder = $select.find('option:first');
// Make sure placeholder is disabled and has empty value
if ($placeholder.length) {
$placeholder.prop('disabled', true).prop('selected', true).val('');
}
// Prevent auto-selection of first non-disabled option
$select.on('focus', function() {
if (!$(this).val()) {
$(this).find('option:first').prop('selected', true);
}
});
});
// Handle form errors - ensure work selections are maintained
@if($errors->any() && (old('form') == 'work' || old('form') == 'wash'))
// When there are form errors, ensure the correct work selections are maintained
// The old values are already handled by the Blade template in the HTML
// We just need to ensure proper placeholder handling
$('select[name="work_id[]"]').each(function() {
var $select = $(this);
// If no value is selected, ensure placeholder is selected
if (!$select.val() || $select.val() === '') {
var $placeholder = $select.find('option:first');
if ($placeholder.length) {
$placeholder.prop('selected', true);
}
} else {
// Trigger change event to update any dependent fields
$select.trigger('change');
}
});
@endif
});
// Override addFormField function to include event listeners
function addFormFieldWithStockCheck(form) {
addFormField(form); // Call original function
// Add event listeners to new field
setTimeout(function() {
var id = $(`.${form}_field_counter`).val();
var $newSelect = $(`#${form}_work${id}`);
// Ensure placeholder is properly set
var $placeholder = $newSelect.find('option:first');
if ($placeholder.length) {
$placeholder.prop('disabled', true).prop('selected', true).val('');
}
$newSelect.on('change', function() {
handleWorkSelectionChange(this);
});
$newSelect.closest('.form-group').find('input[name="quantity[]"]').on('input', function() {
handleQuantityChange(this);
});
// Prevent auto-selection of first non-disabled option
$newSelect.on('focus', function() {
if (!$(this).val()) {
$(this).find('option:first').prop('selected', true);
}
});
}, 100);
}
$("#workForm").submit(function(e) {
$(".button-save").attr("disabled");
// Validate required fields
var spkNo = $('input[name="spk_no"]').val().trim();
var policeNumber = $('input[name="police_number"]').val().trim();
var userSaId = $('select[name="user_sa_id"]').val();
var date = $('input[name="date"]').val().trim();
var errorMessages = [];
if (!spkNo) {
errorMessages.push('No. SPK harus diisi');
$('input[name="spk_no"]').addClass('is-invalid');
} else {
$('input[name="spk_no"]').removeClass('is-invalid');
}
if (!policeNumber) {
errorMessages.push('No. Polisi harus diisi');
$('input[name="police_number"]').addClass('is-invalid');
} else {
$('input[name="police_number"]').removeClass('is-invalid');
}
if (!userSaId || userSaId === '') {
errorMessages.push('Service Advisor harus dipilih');
$('select[name="user_sa_id"]').addClass('is-invalid');
} else {
$('select[name="user_sa_id"]').removeClass('is-invalid');
}
if (!date) {
errorMessages.push('Tanggal Pekerjaan harus diisi');
$('input[name="date"]').addClass('is-invalid');
} else {
$('input[name="date"]').removeClass('is-invalid');
}
if (errorMessages.length > 0) {
e.preventDefault();
Swal.fire({
title: 'Validasi Gagal',
html: `
<div class="text-left">
<p class="mb-3">Mohon lengkapi field berikut:</p>
<ul class="text-left">
${errorMessages.map(msg => '<li>' + msg + '</li>').join('')}
</ul>
</div>
`,
icon: 'warning',
confirmButtonText: 'OK'
});
return false;
}
// Validate that at least one work is selected
var hasSelectedWork = false;
$('select[name="work_id[]"]').each(function() {
if ($(this).val() && $(this).val() !== '') {
hasSelectedWork = true;
return false; // break loop
}
});
if (!hasSelectedWork) {
e.preventDefault();
Swal.fire({
title: 'Peringatan',
text: 'Minimal pilih satu pekerjaan sebelum menyimpan!',
icon: 'warning',
confirmButtonText: 'OK'
});
return false;
}
// Check if there are stock warnings
if (Object.keys(stockWarnings).length > 0) {
e.preventDefault();
let warningMessages = [];
Object.values(stockWarnings).forEach(function(warning) {
warningMessages.push(warning.message);
warning.details.forEach(function(detail) {
if (!detail.is_available) {
warningMessages.push(`- ${detail.product_name}: Butuh ${detail.required_quantity}, Tersedia ${detail.available_stock}`);
}
});
});
Swal.fire({
title: 'Peringatan Stock Tidak Mencukupi',
html: `
<div class="text-left">
<p class="mb-3">Ada beberapa pekerjaan yang memerlukan produk dengan stock tidak mencukupi:</p>
<div class="alert alert-warning text-left">
${warningMessages.join('<br>')}
</div>
<p class="mb-0"><strong>Apakah Anda yakin ingin melanjutkan?</strong></p>
<small class="text-muted">Transaksi akan tetap dibuat, namun stock akan menjadi negatif.</small>
</div>
`,
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#ffc107',
cancelButtonColor: '#6c757d',
confirmButtonText: 'Lanjutkan',
cancelButtonText: 'Batal'
}).then((result) => {
if (result.isConfirmed) {
$(".button-save").attr("disabled", true);
$(".button-save").addClass("disabled");
$("#workForm")[0].submit(); // Submit the form
}
});
return false;
}
$(".button-save").attr("disabled", true);
$(".button-save").addClass("disabled");
return true;
})
$("#washForm").submit(function(e) {
$(".button-save").attr("disabled");
// Validate required fields
var spkNo = $('input[name="spk_no"]').val().trim();
var policeNumber = $('input[name="police_number"]').val().trim();
var userSaId = $('select[name="user_sa_id"]').val();
var date = $('input[name="date"]').val().trim();
var errorMessages = [];
if (!spkNo) {
errorMessages.push('No. SPK harus diisi');
$('input[name="spk_no"]').addClass('is-invalid');
} else {
$('input[name="spk_no"]').removeClass('is-invalid');
}
if (!policeNumber) {
errorMessages.push('No. Polisi harus diisi');
$('input[name="police_number"]').addClass('is-invalid');
} else {
$('input[name="police_number"]').removeClass('is-invalid');
}
if (!userSaId || userSaId === '') {
errorMessages.push('Service Advisor harus dipilih');
$('select[name="user_sa_id"]').addClass('is-invalid');
} else {
$('select[name="user_sa_id"]').removeClass('is-invalid');
}
if (!date) {
errorMessages.push('Tanggal Pekerjaan harus diisi');
$('input[name="date"]').addClass('is-invalid');
} else {
$('input[name="date"]').removeClass('is-invalid');
}
if (errorMessages.length > 0) {
e.preventDefault();
Swal.fire({
title: 'Validasi Gagal',
html: `
<div class="text-left">
<p class="mb-3">Mohon lengkapi field berikut:</p>
<ul class="text-left">
${errorMessages.map(msg => '<li>' + msg + '</li>').join('')}
</ul>
</div>
`,
icon: 'warning',
confirmButtonText: 'OK'
});
return false;
}
$(".button-save").attr("disabled", true);
$(".button-save").addClass("disabled");
return true;
})
@@ -1280,28 +1750,31 @@ use Illuminate\Support\Facades\Auth;
}
})
$("#date-work").datepicker({
format: 'yyyy-mm-dd',
autoclose: true,
todayHighlight: true
})
$("#date-wash").datepicker({
format: 'yyyy-mm-dd',
autoclose: true,
todayHighlight: true
})
$("#date-opname").datepicker({
format: 'yyyy-mm-dd',
autoclose: true,
todayHighlight: true,
startDate: '-30d',
endDate: '+0d'
})
$("#date-mutasi").datepicker({
format: 'yyyy-mm-dd',
autoclose: true,
todayHighlight: true
})
// Initialize datepickers when document is ready
$(document).ready(function() {
$("#date-work").datepicker({
format: 'yyyy-mm-dd',
autoclose: true,
todayHighlight: true
});
$("#date-wash").datepicker({
format: 'yyyy-mm-dd',
autoclose: true,
todayHighlight: true
});
$("#date-opname").datepicker({
format: 'yyyy-mm-dd',
autoclose: true,
todayHighlight: true,
startDate: '-30d',
endDate: '+0d'
});
$("#date-mutasi").datepicker({
format: 'yyyy-mm-dd',
autoclose: true,
todayHighlight: true
});
});
// Calculate difference for opname
$(document).on('input change keyup', '.physical-stock', function() {
@@ -1393,6 +1866,15 @@ use Illuminate\Support\Facades\Auth;
$(this).removeClass('is-invalid');
});
// Remove invalid styling when user starts typing in required fields
$(document).on('input', 'input[name="spk_no"], input[name="police_number"], input[name="date"]', function() {
$(this).removeClass('is-invalid');
});
$(document).on('change', 'select[name="user_sa_id"]', function() {
$(this).removeClass('is-invalid');
});
// Handle server-side errors - scroll to first error and highlight
$(document).ready(function() {
// Set default date for opname if empty
@@ -1431,6 +1913,18 @@ use Illuminate\Support\Facades\Auth;
initReceiveMutationsTable();
}, 200);
}, 100);
@elseif($errors->any() && old('form') == 'work')
// Activate transaksi tab and form kerja sub-tab when there are work form errors
$('.nav-link[href="#transaksi"]').tab('show');
setTimeout(function() {
$('.nav-link[href="#form-kerja"]').tab('show');
}, 100);
@elseif($errors->any() && old('form') == 'wash')
// Activate transaksi tab and form cuci sub-tab when there are wash form errors
$('.nav-link[href="#transaksi"]').tab('show');
setTimeout(function() {
$('.nav-link[href="#form-cuci"]').tab('show');
}, 100);
@endif
@endif