252 lines
12 KiB
PHP
252 lines
12 KiB
PHP
@extends('layouts.app')
|
|
|
|
@section('title', 'Create Stock Transfer')
|
|
|
|
@section('content')
|
|
<div class="container-fluid">
|
|
<div class="row">
|
|
<div class="col-12">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h3 class="card-title">Create Stock Transfer</h3>
|
|
</div>
|
|
<div class="card-body">
|
|
<form action="{{ route('stock-transfers.store') }}" method="POST" id="stock-transfer-form">
|
|
@csrf
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<div class="form-group">
|
|
<label for="source_branch_id">Source Branch <span class="text-danger">*</span></label>
|
|
<select name="source_branch_id" id="source_branch_id" class="form-control select2" required>
|
|
<option value="">Select Source Branch</option>
|
|
@foreach($branches as $branch)
|
|
<option value="{{ $branch->id }}">{{ $branch->name }}</option>
|
|
@endforeach
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="form-group">
|
|
<label for="destination_branch_id">Destination Branch <span class="text-danger">*</span></label>
|
|
<select name="destination_branch_id" id="destination_branch_id" class="form-control select2" required>
|
|
<option value="">Select Destination Branch</option>
|
|
@foreach($branches as $branch)
|
|
<option value="{{ $branch->id }}">{{ $branch->name }}</option>
|
|
@endforeach
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<div class="form-group">
|
|
<label for="transfer_date">Transfer Date <span class="text-danger">*</span></label>
|
|
<input type="date" name="transfer_date" id="transfer_date" class="form-control" value="{{ date('Y-m-d') }}" required>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="form-group">
|
|
<label for="note">Note</label>
|
|
<textarea name="note" id="note" class="form-control" rows="1"></textarea>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row mt-4">
|
|
<div class="col-12">
|
|
<div class="table-responsive">
|
|
<table class="table table-bordered" id="transfer-items-table">
|
|
<thead>
|
|
<tr>
|
|
<th>Product <span class="text-danger">*</span></th>
|
|
<th>Batch <span class="text-danger">*</span></th>
|
|
<th>Available Quantity</th>
|
|
<th>Transfer Quantity <span class="text-danger">*</span></th>
|
|
<th>Action</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>
|
|
<select name="items[0][product_id]" class="form-control select2 product-select" required>
|
|
<option value="">Select Product</option>
|
|
@foreach($products as $product)
|
|
<option value="{{ $product->id }}">{{ $product->name }}</option>
|
|
@endforeach
|
|
</select>
|
|
</td>
|
|
<td>
|
|
<select name="items[0][product_batch_id]" class="form-control select2 batch-select" required disabled>
|
|
<option value="">Select Batch</option>
|
|
</select>
|
|
</td>
|
|
<td>
|
|
<span class="available-quantity">0</span>
|
|
</td>
|
|
<td>
|
|
<input type="number" name="items[0][quantity]" class="form-control transfer-quantity" min="1" required disabled>
|
|
</td>
|
|
<td>
|
|
<button type="button" class="btn btn-danger btn-sm remove-row">
|
|
<i class="bi bi-trash"></i>
|
|
</button>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<button type="button" class="btn btn-success" id="add-row">
|
|
<i class="bi bi-plus"></i> Add Item
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row mt-4">
|
|
<div class="col-12">
|
|
<button type="submit" class="btn btn-primary">Create Transfer</button>
|
|
<a href="{{ route('stock-transfers.index') }}" class="btn btn-secondary">Cancel</a>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@endsection
|
|
|
|
@push('scripts')
|
|
<script>
|
|
$(document).ready(function() {
|
|
let rowCount = 1;
|
|
|
|
// Initialize Select2
|
|
$('.select2').select2();
|
|
|
|
// Add new row
|
|
$('#add-row').click(function() {
|
|
const newRow = `
|
|
<tr>
|
|
<td>
|
|
<select name="items[${rowCount}][product_id]" class="form-control select2 product-select" required>
|
|
<option value="">Select Product</option>
|
|
@foreach($products as $product)
|
|
<option value="{{ $product->id }}">{{ $product->name }}</option>
|
|
@endforeach
|
|
</select>
|
|
</td>
|
|
<td>
|
|
<select name="items[${rowCount}][product_batch_id]" class="form-control select2 batch-select" required disabled>
|
|
<option value="">Select Batch</option>
|
|
</select>
|
|
</td>
|
|
<td>
|
|
<span class="available-quantity">0</span>
|
|
</td>
|
|
<td>
|
|
<input type="number" name="items[${rowCount}][quantity]" class="form-control transfer-quantity" min="1" required disabled>
|
|
</td>
|
|
<td>
|
|
<button type="button" class="btn btn-danger btn-sm remove-row">
|
|
<i class="bi bi-trash"></i>
|
|
</button>
|
|
</td>
|
|
</tr>
|
|
`;
|
|
$('#transfer-items-table tbody').append(newRow);
|
|
initializeRow(rowCount);
|
|
rowCount++;
|
|
});
|
|
|
|
// Remove row
|
|
$(document).on('click', '.remove-row', function() {
|
|
$(this).closest('tr').remove();
|
|
});
|
|
|
|
// Initialize row elements
|
|
function initializeRow(index) {
|
|
$(`select[name="items[${index}][product_id]"]`).select2();
|
|
$(`select[name="items[${index}][product_batch_id]"]`).select2();
|
|
}
|
|
|
|
// Handle product selection
|
|
$(document).on('change', '.product-select', function() {
|
|
const row = $(this).closest('tr');
|
|
const productId = $(this).val();
|
|
const batchSelect = row.find('.batch-select');
|
|
const quantityInput = row.find('.transfer-quantity');
|
|
const availableQuantity = row.find('.available-quantity');
|
|
|
|
if (productId) {
|
|
const sourceBranchId = $('#source_branch_id').val();
|
|
if (!sourceBranchId) {
|
|
toastr.error('Please select source branch first');
|
|
$(this).val('').trigger('change');
|
|
return;
|
|
}
|
|
|
|
// Fetch batches for the selected product and branch
|
|
$.get(`/stock-transfers/batches/${productId}/${sourceBranchId}`, function(data) {
|
|
batchSelect.empty().append('<option value="">Select Batch</option>');
|
|
data.forEach(batch => {
|
|
batchSelect.append(`<option value="${batch.id}" data-quantity="${batch.quantity}">${batch.batch_number}</option>`);
|
|
});
|
|
batchSelect.prop('disabled', false).trigger('change');
|
|
});
|
|
} else {
|
|
batchSelect.empty().prop('disabled', true).trigger('change');
|
|
quantityInput.prop('disabled', true).val('');
|
|
availableQuantity.text('0');
|
|
}
|
|
});
|
|
|
|
// Handle batch selection
|
|
$(document).on('change', '.batch-select', function() {
|
|
const row = $(this).closest('tr');
|
|
const quantityInput = row.find('.transfer-quantity');
|
|
const availableQuantity = row.find('.available-quantity');
|
|
const selectedOption = $(this).find('option:selected');
|
|
|
|
if (selectedOption.val()) {
|
|
const quantity = selectedOption.data('quantity');
|
|
availableQuantity.text(quantity);
|
|
quantityInput.prop('disabled', false).attr('max', quantity);
|
|
} else {
|
|
quantityInput.prop('disabled', true).val('');
|
|
availableQuantity.text('0');
|
|
}
|
|
});
|
|
|
|
// Form submission
|
|
$('#stock-transfer-form').submit(function(e) {
|
|
e.preventDefault();
|
|
|
|
// Validate source and destination branches are different
|
|
const sourceBranch = $('#source_branch_id').val();
|
|
const destinationBranch = $('#destination_branch_id').val();
|
|
|
|
if (sourceBranch === destinationBranch) {
|
|
toastr.error('Source and destination branches cannot be the same');
|
|
return;
|
|
}
|
|
|
|
// Validate quantities
|
|
let isValid = true;
|
|
$('.transfer-quantity').each(function() {
|
|
const quantity = parseInt($(this).val());
|
|
const max = parseInt($(this).attr('max'));
|
|
if (quantity > max) {
|
|
toastr.error('Transfer quantity cannot exceed available quantity');
|
|
isValid = false;
|
|
return false;
|
|
}
|
|
});
|
|
|
|
if (isValid) {
|
|
this.submit();
|
|
}
|
|
});
|
|
});
|
|
</script>
|
|
@endpush
|