ultimatepos/resources/views/sale_pos/product_row.blade.php

419 lines
18 KiB
PHP

@php
$common_settings = session()->get('business.common_settings');
$multiplier = 1;
$action = !empty($action) ? $action : '';
@endphp
@foreach($sub_units as $key => $value)
@if(!empty($product->sub_unit_id) && $product->sub_unit_id == $key)
@php
$multiplier = $value['multiplier'];
@endphp
@endif
@endforeach
<tr class="product_row" data-row_index="{{$row_count}}" @if(!empty($so_line)) data-so_id="{{$so_line->transaction_id}}" @endif>
@if(!empty($is_serial_no))
<td class="serial_no" ></td>
@endif
<td>
@if(!empty($so_line))
<input type="hidden"
name="products[{{$row_count}}][so_line_id]"
value="{{$so_line->id}}">
@endif
@php
$product_name = e($product->product_name) . '<br/>' . $product->sub_sku ;
if(!empty($product->brand)){ $product_name .= ' ' . $product->brand ;}
@endphp
@if( ($edit_price || $edit_discount) && empty($is_direct_sell) )
<div title="@lang('lang_v1.pos_edit_product_price_help')" style="display: inline">
<span class="text-link text-info cursor-pointer" data-toggle="modal" data-target="#row_edit_product_price_modal_{{$row_count}}">
{!! $product_name !!}
&nbsp;<i class="fa fa-info-circle"></i>
</span>
</div>
@else
{!! $product_name !!}
@endif
<img src="@if(count($product->media) > 0)
{{$product->media->first()->display_url}}
@elseif(!empty($product->product_image))
{{asset('/uploads/img/' . rawurlencode($product->product_image))}}
@else
{{asset('/img/default.png')}}
@endif" alt="product-img" loading="lazy"style="height:50px;display: inline;margin-left: 3px; border: black;border-radius: 5px; margin-top: 5px; width: 50px;object-fit: cover;">
<input type="hidden" class="enable_sr_no" value="{{$product->enable_sr_no}}">
<input type="hidden"
class="product_type"
name="products[{{$row_count}}][product_type]"
value="{{$product->product_type}}">
@php
$hide_tax = 'hide';
if(session()->get('business.enable_inline_tax') == 1){
$hide_tax = '';
}
$tax_id = $product->tax_id;
$item_tax = !empty($product->item_tax) ? $product->item_tax : 0;
$unit_price_inc_tax = $product->sell_price_inc_tax;
if($hide_tax == 'hide'){
$tax_id = null;
$unit_price_inc_tax = $product->default_sell_price;
}
if(!empty($so_line) && $action !== 'edit') {
$tax_id = $so_line->tax_id;
$item_tax = $so_line->item_tax;
$unit_price_inc_tax = $so_line->unit_price_inc_tax;
}
$discount_type = !empty($product->line_discount_type) ? $product->line_discount_type : 'fixed';
$discount_amount = !empty($product->line_discount_amount) ? $product->line_discount_amount : 0;
if(!empty($discount)) {
$discount_type = $discount->discount_type;
$discount_amount = $discount->discount_amount;
}
if(!empty($so_line) && $action !== 'edit') {
$discount_type = $so_line->line_discount_type;
$discount_amount = $so_line->line_discount_amount;
}
$sell_line_note = '';
if(!empty($product->sell_line_note)){
$sell_line_note = $product->sell_line_note;
}
if(!empty($so_line)){
$sell_line_note = $so_line->sell_line_note;
}
@endphp
@if(!empty($discount))
{!! Form::hidden("products[$row_count][discount_id]", $discount->id); !!}
@endif
@php
$warranty_id = !empty($action) && $action == 'edit' && !empty($product->warranties->first()) ? $product->warranties->first()->id : $product->warranty_id;
if($discount_type == 'fixed') {
$discount_amount = $discount_amount * $multiplier;
}
@endphp
@if(empty($is_direct_sell))
<div class="modal fade row_edit_product_price_model" id="row_edit_product_price_modal_{{$row_count}}" tabindex="-1" role="dialog">
@include('sale_pos.partials.row_edit_product_price_modal')
</div>
@endif
<br>
<small class="text-muted p-1">
@if($product->enable_stock)
{{ @num_format($product->qty_available) }} {{$product->unit}} @lang('lang_v1.in_stock')
@else
--
@endif
</small>
<!-- Description modal end -->
@if(in_array('modifiers' , $enabled_modules))
<div class="modifiers_html">
@if(!empty($product->product_ms))
@include('restaurant.product_modifier_set.modifier_for_product', array('edit_modifiers' => true, 'row_count' => $loop->index, 'product_ms' => $product->product_ms ) )
@endif
</div>
@endif
@php
$max_quantity = $product->qty_available;
$formatted_max_quantity = $product->formatted_qty_available;
if(!empty($action) && $action == 'edit') {
if(!empty($so_line)) {
$qty_available = $so_line->quantity - $so_line->so_quantity_invoiced + $product->quantity_ordered;
$max_quantity = $qty_available;
$formatted_max_quantity = number_format($qty_available, session('business.quantity_precision', 2), session('currency')['decimal_separator'], session('currency')['thousand_separator']);
}
} else {
if(!empty($so_line) && $so_line->qty_available <= $max_quantity) {
$max_quantity = $so_line->qty_available;
$formatted_max_quantity = $so_line->formatted_qty_available;
}
}
$max_qty_rule = $max_quantity;
$max_qty_msg = __('validation.custom-messages.quantity_not_available', ['qty'=> $formatted_max_quantity, 'unit' => $product->unit ]);
@endphp
@if( session()->get('business.enable_lot_number') == 1 || session()->get('business.enable_product_expiry') == 1)
@php
$lot_enabled = session()->get('business.enable_lot_number');
$exp_enabled = session()->get('business.enable_product_expiry');
$lot_no_line_id = '';
if(!empty($product->lot_no_line_id)){
$lot_no_line_id = $product->lot_no_line_id;
}
@endphp
@if(!empty($product->lot_numbers) && empty($is_sales_order))
<select class="form-control lot_number input-sm" name="products[{{$row_count}}][lot_no_line_id]" @if(!empty($product->transaction_sell_lines_id)) disabled @endif>
<option value="">@lang('lang_v1.lot_n_expiry')</option>
@foreach($product->lot_numbers as $lot_number)
@php
$selected = "";
if($lot_number->purchase_line_id == $lot_no_line_id){
$selected = "selected";
$max_qty_rule = $lot_number->qty_available;
$max_qty_msg = __('lang_v1.quantity_error_msg_in_lot', ['qty'=> $lot_number->qty_formated, 'unit' => $product->unit ]);
}
$expiry_text = '';
if($exp_enabled == 1 && !empty($lot_number->exp_date)){
if( \Carbon::now()->gt(\Carbon::createFromFormat('Y-m-d', $lot_number->exp_date)) ){
$expiry_text = '(' . __('report.expired') . ')';
}
}
//preselected lot number if product searched by lot number
if(!empty($purchase_line_id) && $purchase_line_id == $lot_number->purchase_line_id) {
$selected = "selected";
$max_qty_rule = $lot_number->qty_available;
$max_qty_msg = __('lang_v1.quantity_error_msg_in_lot', ['qty'=> $lot_number->qty_formated, 'unit' => $product->unit ]);
}
@endphp
<option value="{{$lot_number->purchase_line_id}}" data-qty_available="{{$lot_number->qty_available}}" data-msg-max="@lang('lang_v1.quantity_error_msg_in_lot', ['qty'=> $lot_number->qty_formated, 'unit' => $product->unit ])" {{$selected}}>@if(!empty($lot_number->lot_number) && $lot_enabled == 1){{$lot_number->lot_number}} @endif @if($lot_enabled == 1 && $exp_enabled == 1) - @endif @if($exp_enabled == 1 && !empty($lot_number->exp_date)) @lang('product.exp_date'): @format_date($lot_number->exp_date) @endif {{$expiry_text}}</option>
@endforeach
</select>
@endif
@endif
@if(!empty($is_direct_sell))
<br>
<textarea class="form-control" name="products[{{$row_count}}][sell_line_note]" rows="2">{{$sell_line_note}}</textarea>
<p class="help-block"><small>@lang('lang_v1.sell_line_description_help')</small></p>
@endif
</td>
<td>
{{-- If edit then transaction sell lines will be present --}}
@if(!empty($product->transaction_sell_lines_id))
<input type="hidden" name="products[{{$row_count}}][transaction_sell_lines_id]" class="form-control" value="{{$product->transaction_sell_lines_id}}">
@endif
<input type="hidden" name="products[{{$row_count}}][product_id]" class="form-control product_id" value="{{$product->product_id}}">
<input type="hidden" value="{{$product->variation_id}}"
name="products[{{$row_count}}][variation_id]" class="row_variation_id">
<input type="hidden" value="{{$product->enable_stock}}"
name="products[{{$row_count}}][enable_stock]">
@if(empty($product->quantity_ordered))
@php
$product->quantity_ordered = 1;
@endphp
@endif
@php
$allow_decimal = true;
if($product->unit_allow_decimal != 1) {
$allow_decimal = false;
}
@endphp
@foreach($sub_units as $key => $value)
@if(!empty($product->sub_unit_id) && $product->sub_unit_id == $key)
@php
$max_qty_rule = $max_qty_rule / $multiplier;
$unit_name = $value['name'];
$max_qty_msg = __('validation.custom-messages.quantity_not_available', ['qty'=> $max_qty_rule, 'unit' => $unit_name ]);
if(!empty($product->lot_no_line_id)){
$max_qty_msg = __('lang_v1.quantity_error_msg_in_lot', ['qty'=> $max_qty_rule, 'unit' => $unit_name ]);
}
if($value['allow_decimal']) {
$allow_decimal = true;
}
@endphp
@endif
@endforeach
<div class="input-group input-number">
<span class="input-group-btn"><button type="button" class="btn btn-default btn-flat quantity-down"><i class="fa fa-minus text-danger"></i></button></span>
<input type="text" data-min="1" style="width: auto"
class="form-control pos_quantity input_number mousetrap input_quantity"
value="{{@format_quantity($product->quantity_ordered)}}" name="products[{{$row_count}}][quantity]" data-allow-overselling="@if(empty($pos_settings['allow_overselling'])){{'false'}}@else{{'true'}}@endif"
@if($allow_decimal)
data-decimal=1
@else
data-decimal=0
data-rule-abs_digit="true"
data-msg-abs_digit="@lang('lang_v1.decimal_value_not_allowed')"
@endif
data-rule-required="true"
data-msg-required="@lang('validation.custom-messages.this_field_is_required')"
@if($product->enable_stock && empty($pos_settings['allow_overselling']) && empty($is_sales_order) )
data-rule-max-value="{{$max_qty_rule}}" data-qty_available="{{$product->qty_available}}" data-msg-max-value="{{$max_qty_msg}}"
data-msg_max_default="@lang('validation.custom-messages.quantity_not_available', ['qty'=> $product->formatted_qty_available, 'unit' => $product->unit ])"
@endif
>
<span class="input-group-btn"><button type="button" class="btn btn-default btn-flat quantity-up"><i class="fa fa-plus text-success"></i></button></span>
</div>
<input type="hidden" name="products[{{$row_count}}][product_unit_id]" value="{{$product->unit_id}}">
@if(count($sub_units) > 0)
<br>
<select name="products[{{$row_count}}][sub_unit_id]" class="form-control input-sm sub_unit">
@foreach($sub_units as $key => $value)
<option value="{{$key}}" data-multiplier="{{$value['multiplier']}}" data-unit_name="{{$value['name']}}" data-allow_decimal="{{$value['allow_decimal']}}" @if(!empty($product->sub_unit_id) && $product->sub_unit_id == $key) selected @endif>
{{$value['name']}}
</option>
@endforeach
</select>
@else
{{$product->unit}}
@endif
@if(!empty($product->second_unit))
<br>
<span style="white-space: nowrap;">
@lang('lang_v1.quantity_in_second_unit', ['unit' => $product->second_unit])*:</span><br>
<input type="text"
name="products[{{$row_count}}][secondary_unit_quantity]"
value="{{@format_quantity($product->secondary_unit_quantity)}}"
class="form-control input-sm input_number"
required>
@endif
<input type="hidden" class="base_unit_multiplier" name="products[{{$row_count}}][base_unit_multiplier]" value="{{$multiplier}}">
<input type="hidden" class="hidden_base_unit_sell_price" value="{{$product->default_sell_price / $multiplier}}">
{{-- Hidden fields for combo products --}}
@if($product->product_type == 'combo'&& !empty($product->combo_products))
@foreach($product->combo_products as $k => $combo_product)
@if(isset($action) && $action == 'edit')
@php
$combo_product['qty_required'] = $combo_product['quantity'] / $product->quantity_ordered;
$qty_total = $combo_product['quantity'];
@endphp
@else
@php
$qty_total = $combo_product['qty_required'];
@endphp
@endif
<input type="hidden"
name="products[{{$row_count}}][combo][{{$k}}][product_id]"
value="{{$combo_product['product_id']}}">
<input type="hidden"
name="products[{{$row_count}}][combo][{{$k}}][variation_id]"
value="{{$combo_product['variation_id']}}">
<input type="hidden"
class="combo_product_qty"
name="products[{{$row_count}}][combo][{{$k}}][quantity]"
data-unit_quantity="{{$combo_product['qty_required']}}"
value="{{$qty_total}}">
@if(isset($action) && $action == 'edit')
<input type="hidden"
name="products[{{$row_count}}][combo][{{$k}}][transaction_sell_lines_id]"
value="{{$combo_product['id']}}">
@endif
@endforeach
@endif
</td>
@if(!empty($is_direct_sell))
@if(!empty($pos_settings['inline_service_staff']))
<td>
<div class="form-group">
<div class="input-group">
{!! Form::select("products[" . $row_count . "][res_service_staff_id]", $waiters, !empty($product->res_service_staff_id) ? $product->res_service_staff_id : null, ['class' => 'form-control select2 order_line_service_staff', 'placeholder' => __('restaurant.select_service_staff'), 'required' => (!empty($pos_settings['is_service_staff_required']) && $pos_settings['is_service_staff_required'] == 1) ? true : false ]); !!}
</div>
</div>
</td>
@endif
@php
$pos_unit_price = !empty($product->unit_price_before_discount) ? $product->unit_price_before_discount : $product->default_sell_price;
if(!empty($so_line) && $action !== 'edit') {
$pos_unit_price = $so_line->unit_price_before_discount;
}
@endphp
<td class="@if(!auth()->user()->can('edit_product_price_from_sale_screen')) hide @endif">
<input type="text" name="products[{{$row_count}}][unit_price]" class="form-control pos_unit_price input_number mousetrap" value="{{@num_format($pos_unit_price)}}" @if(!empty($pos_settings['enable_msp'])) data-rule-min-value="{{$pos_unit_price}}" data-msg-min-value="{{__('lang_v1.minimum_selling_price_error_msg', ['price' => @num_format($pos_unit_price)])}}" @endif>
@if(!empty($last_sell_line))
<br>
<small class="text-muted">@lang('lang_v1.prev_unit_price'): @format_currency($last_sell_line->unit_price_before_discount)</small>
@endif
</td>
<td @if(!$edit_discount) class="hide" @endif>
{!! Form::text("products[$row_count][line_discount_amount]", @num_format($discount_amount), ['class' => 'form-control input_number row_discount_amount']); !!}<br>
{!! Form::select("products[$row_count][line_discount_type]", ['fixed' => __('lang_v1.fixed'), 'percentage' => __('lang_v1.percentage')], $discount_type , ['class' => 'form-control row_discount_type']); !!}
@if(!empty($discount))
<p class="help-block">{!! __('lang_v1.applied_discount_text', ['discount_name' => $discount->name, 'starts_at' => $discount->formated_starts_at, 'ends_at' => $discount->formated_ends_at]) !!}</p>
@endif
@if(!empty($last_sell_line))
<br>
<small class="text-muted">
@lang('lang_v1.prev_discount'):
@if($last_sell_line->line_discount_type == 'percentage')
{{@num_format($last_sell_line->line_discount_amount)}}%
@else
@format_currency($last_sell_line->line_discount_amount)
@endif
</small>
@endif
</td>
<td class="text-center {{$hide_tax}}">
{!! Form::hidden("products[$row_count][item_tax]", @num_format($item_tax), ['class' => 'item_tax']); !!}
{!! Form::select("products[$row_count][tax_id]", $tax_dropdown['tax_rates'], $tax_id, ['placeholder' => 'Select', 'class' => 'form-control tax_id'], $tax_dropdown['attributes']); !!}
</td>
@else
@if(!empty($pos_settings['inline_service_staff']))
<td>
<div class="form-group">
<div class="input-group">
{!! Form::select("products[" . $row_count . "][res_service_staff_id]", $waiters, !empty($product->res_service_staff_id) ? $product->res_service_staff_id : null, ['class' => 'form-control select2 order_line_service_staff', 'placeholder' => __('restaurant.select_service_staff'), 'required' => (!empty($pos_settings['is_service_staff_required']) && $pos_settings['is_service_staff_required'] == 1) ? true : false ]); !!}
</div>
</div>
</td>
@endif
@endif
<td class="{{$hide_tax}}">
<input type="text" style="width: auto" name="products[{{$row_count}}][unit_price_inc_tax]" class="form-control pos_unit_price_inc_tax input_number" value="{{@num_format($unit_price_inc_tax)}}" @if(!$edit_price) readonly @endif @if(!empty($pos_settings['enable_msp'])) data-rule-min-value="{{$unit_price_inc_tax}}" data-msg-min-value="{{__('lang_v1.minimum_selling_price_error_msg', ['price' => @num_format($unit_price_inc_tax)])}}" @endif>
</td>
@if(!empty($common_settings['enable_product_warranty']) && !empty($is_direct_sell))
<td>
{!! Form::select("products[$row_count][warranty_id]", $warranties, $warranty_id, ['placeholder' => __('messages.please_select'), 'class' => 'form-control']); !!}
</td>
@endif
<td class="text-center">
@php
$subtotal_type = !empty($pos_settings['is_pos_subtotal_editable']) ? 'text' : 'hidden';
@endphp
<input style="width: auto" type="{{$subtotal_type}}" class="form-control pos_line_total @if(!empty($pos_settings['is_pos_subtotal_editable'])) input_number @endif" value="{{@num_format($product->quantity_ordered*$unit_price_inc_tax )}}">
<span class="display_currency pos_line_total_text @if(!empty($pos_settings['is_pos_subtotal_editable'])) hide @endif" data-currency_symbol="true">{{$product->quantity_ordered*$unit_price_inc_tax}}</span>
</td>
<td class="text-center v-center">
<i class="fa fa-times text-danger pos_remove_row cursor-pointer" aria-hidden="true"></i>
</td>
</tr>