add out of stock

This commit is contained in:
NyanLinHtut
2019-12-13 10:07:20 +06:30
parent 7a9e270627
commit c6c605bb01
20 changed files with 1041 additions and 44 deletions

View File

@@ -1483,7 +1483,8 @@ $(function() {
instances = menu_items[field].instances; instances = menu_items[field].instances;
$(instances).each(function(i){ $(instances).each(function(i){
if (instances[i].is_default == true) { if (instances[i].is_default == true) {
price = parseFloat(instances[i].price).toFixed(2); price = parseFloat(instances[i].price).toFixed(2);
out_of_stock = instances[i].out_of_stock;
}else{ }else{
price = 0; price = 0;
} }
@@ -1510,18 +1511,28 @@ $(function() {
item_attributes = instances[i].values; item_attributes = instances[i].values;
promotion_price = instances[i].promotion_price; promotion_price = instances[i].promotion_price;
code = instances[i].code; code = instances[i].code;
out_of_stock = instances[i].out_of_stock;
} }
}); });
} }
if (menu_items[field].image) { if (menu_items[field].image) {
if (modify_order) { if (modify_order) {
image_path = "../../"+menu_items[field].image; image_path = "../../"+menu_items[field].image;
}else{ }else{
image_path = menu_items[field].image; image_path = menu_items[field].image;
} }
if (out_of_stock === true) {
// oos_item = out_of_stock_item
oos_item = '<div class="card custom-card testimonial-card fadeInRight" style="height:100%;background-image:url(../../'+image_path+');background-repeat: no-repeat;pointer-events: none;opacity: 0.4;">'
oos_header = '<div style="position: absolute;z-index: 5;top: 0;left: 0;right: 0;text-align: center;background: #fb483a;margin: auto;color: #fff;padding: 8px;font-weight: bolder;">OUT OF STOCK</div>'
}else{
oos_item = '<div class="card custom-card testimonial-card fadeInRight" style="height:100%;background-image:url(../../'+image_path+');background-repeat: no-repeat;">'
oos_header = ''
}
row = '<div class="col-md-6 col-sm-6 col-lg-3">' row = '<div class="col-md-6 col-sm-6 col-lg-3">'
+'<div class="card custom-card testimonial-card fadeInRight" style="height:100%;background-image:url(../../'+image_path+');background-repeat: no-repeat;">' + oos_item + oos_header
+'<div class="custom-card-head card-head row" style="line-height:14px;margin:0px;" >' +'<div class="custom-card-head card-head row" style="line-height:14px;margin:0px;" >'
+'<div class="col-md-10 " style="padding:0px !important;">'+ menu_items[field].name +'</div>' +'<div class="col-md-10 " style="padding:0px !important;">'+ menu_items[field].name +'</div>'
@@ -1564,8 +1575,16 @@ $(function() {
+'</div>' +'</div>'
+'</div>'; ; +'</div>'; ;
}else{ }else{
if (out_of_stock === true) {
// oos_item = out_of_stock_item
oos_item = '<div class="card custom-card testimonial-card fadeInRight" style="height:100%; pointer-events: none;opacity: 0.4;">'
oos_header = '<div style="position: absolute;z-index: 5;top: 0;left: 0;right: 0;text-align: center;background: #fb483a;margin: auto;color: #fff;padding: 8px;font-weight: bolder;">OUT OF STOCK</div>'
}else{
oos_item = '<div class="card custom-card testimonial-card fadeInRight" style="height:100%;">'
oos_header = ''
}
row = '<div class="col-md-6 col-sm-6 col-lg-3 mt-1">' row = '<div class="col-md-6 col-sm-6 col-lg-3 mt-1">'
+'<div class="card custom-card testimonial-card fadeInRight" style="height:100%;">' + oos_item + oos_header
+'<div class="custom-card-no-img-head card-head '+add_icon+' " style="margin:0px;display:flex;!important "' +'<div class="custom-card-no-img-head card-head '+add_icon+' " style="margin:0px;display:flex;!important "'
+" data-item-code='"+ menu_items[field].code +"' " +" data-item-code='"+ menu_items[field].code +"' "
+" data-name='" + menu_items[field].name +"' " +" data-name='" + menu_items[field].name +"' "
@@ -1621,6 +1640,7 @@ $(function() {
+'</div>' +'</div>'
+'</div>'; +'</div>';
} }
$('.menu_items_list').append(row); $('.menu_items_list').append(row);

View File

@@ -63,7 +63,7 @@ $(document).on('turbolinks:load', function() {
' <img src="{data}" class="file-preview-image" title="{caption}" alt="{caption}" style="width: 200px;height: 200px;">\n' + ' <img src="{data}" class="file-preview-image" title="{caption}" alt="{caption}" style="width: 200px;height: 200px;">\n' +
'</div>\n', '</div>\n',
} }
}); });
$('.datetimepicker').bootstrapMaterialDatePicker({ $('.datetimepicker').bootstrapMaterialDatePicker({
format: 'DD-MM-YYYY - HH:mm', format: 'DD-MM-YYYY - HH:mm',
@@ -128,11 +128,11 @@ $(document).on('turbolinks:load', function() {
type: "POST", type: "POST",
url: "/origami/" + unique_id, url: "/origami/" + unique_id,
data: { 'booking_id' : unique_id }, data: { 'booking_id' : unique_id },
success:function(result){ success:function(result){
for (i = 0; i < result.length; i++) { for (i = 0; i < result.length; i++) {
var data = JSON.stringify(result[i]); var data = JSON.stringify(result[i]);
var parse_data = JSON.parse(data); var parse_data = JSON.parse(data);
var show_date = ""; var show_date = "";
// Receipt Header // Receipt Header
receipt_no = result[i].receipt_no; receipt_no = result[i].receipt_no;
@@ -140,14 +140,14 @@ $(document).on('turbolinks:load', function() {
if(result[i].receipt_date != null){ if(result[i].receipt_date != null){
receipt_date = new Date(result[i].receipt_date); receipt_date = new Date(result[i].receipt_date);
show_date = receipt_date.getDate() + "-" + receipt_date.getMonth() + "-" + receipt_date.getFullYear() + ' ' + receipt_date.getHours()+ ':' + receipt_date.getMinutes() show_date = receipt_date.getDate() + "-" + receipt_date.getMonth() + "-" + receipt_date.getFullYear() + ' ' + receipt_date.getHours()+ ':' + receipt_date.getMinutes()
} }
//Receipt Charges //Receipt Charges
sub_total += parseFloat(parse_data.price); sub_total += parseFloat(parse_data.price);
discount_amount = parse_data.discount_amount == null? '0.0' : parse_data.discount_amount; discount_amount = parse_data.discount_amount == null? '0.0' : parse_data.discount_amount;
tax_amount = parse_data.tax_amount; tax_amount = parse_data.tax_amount;
grand_total_amount = parse_data.grand_total_amount; grand_total_amount = parse_data.grand_total_amount;
// Ordered Items // Ordered Items
var order_items_rows = "<tr>" + var order_items_rows = "<tr>" +
@@ -234,7 +234,7 @@ $(document).on('turbolinks:load', function() {
window.location.href = "/origami/cashier/credit_sales/"+sale_id; window.location.href = "/origami/cashier/credit_sales/"+sale_id;
}else{ }else{
window.location.href = "/origami/quick_service/credit_sales/"+sale_id; window.location.href = "/origami/quick_service/credit_sales/"+sale_id;
} }
}); });
}); });
@@ -385,7 +385,7 @@ function resCardSaleTrans(card_sale_trans_id,cmd_type,payment_type, bnk_bill_amo
}else{ }else{
payment_type = "Master"; payment_type = "Master";
} }
$("#loading_wrapper").hide(); $("#loading_wrapper").hide();
swal({ swal({
title: 'Oops', title: 'Oops',
@@ -512,7 +512,7 @@ if (!String.prototype.formatUnicorn) {
} }
var t=typeof arguments[0],n="string"==t||"number"==t?Array.prototype.slice.call(arguments):arguments[0]; var t=typeof arguments[0],n="string"==t||"number"==t?Array.prototype.slice.call(arguments):arguments[0];
for(var i in n){ for(var i in n){
e=e.replace(new RegExp("\\{"+i+"\\}","gi"),n[i]==null?'':n[i]); e=e.replace(new RegExp("\\{"+i+"\\}","gi"),n[i]==null?'':n[i]);
} }
return e; return e;
}; };
@@ -523,7 +523,7 @@ if (!String.prototype.formatUnicorn) {
function timeFormat(date){ function timeFormat(date){
var isPM = date.getHours() >= 12; var isPM = date.getHours() >= 12;
var isMidday = date.getHours() == 12; var isMidday = date.getHours() == 12;
var time = [(date.getHours()>10? date.getHours() : '0'+date.getHours()) - (isPM && !isMidday ? 12 : 0), var time = [(date.getHours()>10? date.getHours() : '0'+date.getHours()) - (isPM && !isMidday ? 12 : 0),
(date.getMinutes()>10? date.getMinutes() : '0'+date.getMinutes()) || '00'].join(':') + (date.getMinutes()>10? date.getMinutes() : '0'+date.getMinutes()) || '00'].join(':') +
(isPM ? ' PM' : ' AM'); (isPM ? ' PM' : ' AM');
return time; return time;
@@ -589,4 +589,4 @@ function getCreditSales(filter, customer, cashier_type){
} }
}); });
} }
//End of credit sales function //End of credit sales function

View File

@@ -0,0 +1,8 @@
class Api::Restaurant::OutOfStockController < Api::ApiController
skip_before_action :authenticate
def index
date = params[:date]
@out_of_stock = OutOfStock.where("DATE(date) = ?", date)
end
end

View File

@@ -18,7 +18,7 @@ module LoginVerification
def current_shop def current_shop
begin begin
shop_code ='263' shop_code ='262'
@shop =Shop.find_by_shop_code(shop_code) @shop =Shop.find_by_shop_code(shop_code)
return @shop return @shop
rescue rescue
@@ -42,7 +42,7 @@ module LoginVerification
#Shop Name in Navbor #Shop Name in Navbor
def shop_detail def shop_detail
shop_code ='263' shop_code ='262'
@shop = Shop.find_by_shop_code(shop_code) @shop = Shop.find_by_shop_code(shop_code)
return @shop return @shop
end end

View File

@@ -0,0 +1,64 @@
class Settings::OutOfStockController < ApplicationController
def index
@menu_items = MenuItem.joins(:menu_item_instances).where(menu_item_instances: {is_out_of_stock: true}).select('menu_item_instances.id, menu_item_instances.item_instance_code, menu_items.name, menu_item_instances.is_out_of_stock')
end
def show
end
def new
@menus = Menu.where("shop_code='#{@shop.shop_code}'").order('created_at asc')
@menu = MenuCategory.active.where("menu_id =#{@menus[0].id}").order('order_by asc')
end
def update
items_arr = []
JSON.parse(params[:item_instance_code]).each { |i|
i["item_instance_code"] = i["item_instance_code"].downcase.to_s
items = i["item_instance_code"]
items_arr.push(items)
}
item_instance = MenuItemInstance.where(item_instance_code: [items_arr])
date = DateTime.now
unless item_instance.nil?
item_instance.each do |i|
if i.is_out_of_stock.nil?
item_instance.update(is_out_of_stock: true)
OutOfStock.create_out_of_stock(date,params[:item_code])
elsif i.is_out_of_stock?
item_instance.update(is_out_of_stock: false)
elsif !i.is_out_of_stock?
item_instance.update(is_out_of_stock: true)
OutOfStock.create_out_of_stock(date,params[:item_code])
end
end
end
result = {:status=> true, :message => "Out of Stock was created successfully",:data=> item_instance}
render :json => result.to_json
end
def destroy
item_instance = MenuItemInstance.find_by_id(params[:id])
unless item_instance.nil?
item_instance.update(is_out_of_stock: false)
flash[:message] = 'Out of stock was successfully destroyed.'
render :json => {:status=> "Success", :url => settings_out_of_stock_index_url }.to_json
end
end
def reset_all
item_instance = MenuItemInstance.where(is_out_of_stock: true)
item_instance.update(is_out_of_stock: false)
flash[:message] = 'Out of stock was successfully destroyed.'
render :json => {:status=> "Success", :url => settings_out_of_stock_index_url }.to_json
end
private
# Use callbacks to share common setup or constraints between actions.
def set_menu_item_instance
@item_instance = MenuItemInstance.find_by_item_instance_code(params[:item_code])
end
end

View File

@@ -0,0 +1,8 @@
class OutOfStock < ApplicationRecord
def self.create_out_of_stock(date,item_instance_code)
OutOfStock.create(
date: date,
item_instance_code: item_instance_code
)
end
end

View File

@@ -1,9 +1,9 @@
# Format for attributes json # Format for attributes json
attr_format = [] attr_format = []
# Format for attributes json # Format for attributes json
if item.is_available if item.is_available
if item.item_attributes.count > 0 if item.item_attributes.count > 0
item.item_attributes.each do|attr_id| item.item_attributes.each do|attr_id|
menu_attr = MenuItemAttribute.find(attr_id) menu_attr = MenuItemAttribute.find(attr_id)
if attr_format.count == 0 if attr_format.count == 0
attr_format.push({ type: menu_attr.attribute_type, values: [menu_attr.name] }) attr_format.push({ type: menu_attr.attribute_type, values: [menu_attr.name] })
@@ -15,20 +15,20 @@ if item.is_available
if menu_attr.attribute_type == af[:type] if menu_attr.attribute_type == af[:type]
af[:values].push(menu_attr.name) af[:values].push(menu_attr.name)
end end
else else
new_attr = {type: menu_attr.attribute_type, values: [ menu_attr.name ] } new_attr = {type: menu_attr.attribute_type, values: [ menu_attr.name ] }
attr_format.push(new_attr) attr_format.push(new_attr)
break break
end end
end end
end end
end end
# Format for option json # Format for option json
opt_format = [] opt_format = []
# Format for attributes json # Format for attributes json
if item.item_options.count > 0 if item.item_options.count > 0
item.item_options.each do|opt| item.item_options.each do|opt|
menu_opt = MenuItemOption.find(opt) menu_opt = MenuItemOption.find(opt)
if opt_format.count == 0 if opt_format.count == 0
opt_format.push({ type: menu_opt.option_type, values: [menu_opt.name] }) opt_format.push({ type: menu_opt.option_type, values: [menu_opt.name] })
@@ -40,12 +40,12 @@ if item.is_available
if menu_opt.option_type == of[:type] if menu_opt.option_type == of[:type]
of[:values].push(menu_opt.name) of[:values].push(menu_opt.name)
end end
else else
new_opt = {type: menu_opt.option_type, values: [ menu_opt.name ] } new_opt = {type: menu_opt.option_type, values: [ menu_opt.name ] }
opt_format.push(new_opt) opt_format.push(new_opt)
break break
end end
end end
end end
end end
@@ -68,7 +68,7 @@ if item.is_available
json.is_sub_item item.is_sub_item json.is_sub_item item.is_sub_item
json.unit item.unit json.unit item.unit
# Item Sets of Menu Item # Item Sets of Menu Item
json.item_sets item.item_sets do |its| json.item_sets item.item_sets do |its|
json.id its.id json.id its.id
json.name its.name json.name its.name
@@ -78,7 +78,7 @@ if item.is_available
json.instances its.menu_item_instances do |i| json.instances its.menu_item_instances do |i|
json.id i.id json.id i.id
end end
end end
json.attributes attr_format json.attributes attr_format
json.options opt_format json.options opt_format
@@ -105,7 +105,7 @@ if item.is_available
mItemAttr = MenuItemAttribute.find(ia).name mItemAttr = MenuItemAttribute.find(ia).name
instance_attr.push(mItemAttr) instance_attr.push(mItemAttr)
end end
json.id is.id json.id is.id
json.code is.item_instance_code json.code is.item_instance_code
json.name is.item_instance_name json.name is.item_instance_name
@@ -115,6 +115,7 @@ if item.is_available
json.is_on_promotion is.is_on_promotion json.is_on_promotion is.is_on_promotion
json.promotion_price is.promotion_price json.promotion_price is.promotion_price
json.values instance_attr json.values instance_attr
json.out_of_stock is.is_out_of_stock
# json.item_sets is.item_sets # json.item_sets is.item_sets
end end
end end
@@ -125,4 +126,4 @@ if item.is_available
# json.partial! 'api/restaurant/menu/menu_item', item: item # json.partial! 'api/restaurant/menu/menu_item', item: item
# end # end
# end # end
end end

View File

@@ -0,0 +1,4 @@
out_of_stock_json = json.array! @out_of_stock do |oos|
json.date oos.date
json.item_instance_code oos.item_instance_code
end

View File

@@ -371,6 +371,12 @@
</a> </a>
</li> </li>
<% end %> <% end %>
<li>
<a href="<%= settings_out_of_stock_index_path %>">
<i class="material-icons col-pink">donut_large</i>
<span style="margin-left: 0"><%= t :out_of_stock %></span>
</a>
</li>
<% if can? :menage, Employee %> <% if can? :menage, Employee %>
<li> <li>
<a href="<%= settings_employees_path %>"> <a href="<%= settings_employees_path %>">

View File

@@ -122,20 +122,20 @@
<% else %> <% else %>
<% if @table.get_current_checkout_booking.nil? %> <% if @table.get_current_checkout_booking.nil? %>
<% if !menu.code.include? "SPL" %> <% if !menu.code.include? "SPL" %>
<div class="card custom-card testimonial-card animated fadeInRight menu_category sub_click" data-id="<%=menu.id%>"> <div class="card custom-card testimonial-card animated fadeInRight menu_category sub_click" data-id="<%=menu.id%>">
<div class='card-block custom-card-block'> <div class='card-block custom-card-block'>
<p><%=menu.name%> <p> <p><%=menu.name%> <p>
<p><%=menu.code%> <p> <p><%=menu.code%> <p>
</div>
</div> </div>
<% end%> </div>
<% else %> <% end%>
<% else %>
<div class="card custom-card testimonial-card animated fadeInRight menu_category sub_click" data-id="<%=menu.id%>"> <div class="card custom-card testimonial-card animated fadeInRight menu_category sub_click" data-id="<%=menu.id%>">
<div class='card-block custom-card-block'> <div class='card-block custom-card-block'>
<p><%=menu.name%> <p> <p><%=menu.name%> <p>
<p><%=menu.code%> <p> <p><%=menu.code%> <p>
</div> </div>
</div> </div>
<% end%> <% end%>
<!-- end quick_service or cashier for table --> <!-- end quick_service or cashier for table -->
<% end %> <% end %>

View File

@@ -100,6 +100,7 @@ if (menu.menu_categories)
json.is_default is.is_default json.is_default is.is_default
json.is_on_promotion is.is_on_promotion json.is_on_promotion is.is_on_promotion
json.promotion_price is.promotion_price json.promotion_price is.promotion_price
json.out_of_stock is.is_out_of_stock
json.values instance_attr json.values instance_attr
end end
end end

View File

@@ -0,0 +1,742 @@
<%= stylesheet_link_tag 'addorder', media: 'all', 'data-turbolinks-track': 'reload' %>
<div class="container-fluid " style="padding:0px 3px 0px 3px;">
<div id="oqs_loading_wrapper" style="display:none;">
<div id="oqs_loading"></div>
</div>
<div class="row m-t--20">
<div class="col-lg-2 col-md-2 col-sm-2 hidden" id="menu_data">
<li class="list-menu">
<a href="javascript:void(0);" class="menu-toggle dropdown-toggle toggled my-toggle " style="">
<span class="main_menu" id="main_menu menu_name" >
<%if @menu.present? %>
<%=@menus[0].name%>
<% end%>
</span>
</a>
<ul class="ml-menu menu_list aria-hidden " style="border-top: 1px solid #fff">
<% @menus.each do |menu| %>
<li class="nav-item menu_click" data-name="<%=menu.name%>" data-id="<%=menu.id%>" style="">
<a class="nav-link" data-toggle="tab" href="" role="tab" style="text-transform: lowercase;"><%=menu.name%></a>
</li>
<%end%>
</ul>
</li>
<div id="menu1-slimscroll" data-height="0">
<ul class="nav nav-tabs flex-column category_list" role="tablist" id="ul-navbar">
<li class="nav-item product" data-ref="<%= origami_get_all_product_path %>">
<a class="nav-link" data-toggle="tab" href="" role="tab">Products</a>
</li>
<% @menu.each do |menu| %>
<% if !menu.valid_time.nil? %>
<% if menu.menu_category_id.nil? %>
<!--if type quick_service or cashier for table -->
<% if !menu.code.include? "SPL" %>
<li class="nav-item ">
<p class="hidden menu-id"><%= menu.id %></p>
<a class="nav-link menu_category sub_click first_<%=menu.id%>" data-toggle="tab" href="" role="tab" data-id="<%=menu.id%>" data-sub-id="<%=menu.get_sub_category%>"> <%= menu.name%>
</a>
<ul class=" sub_category_list hidden fadeInTop animated" id="sub_category_list"></ul>
</li>
<% end%>
<% end%>
<% end %>
<%end %>
</ul>
</div>
</div>
<div class="col-lg-2 col-md-2 col-sm-2 hidden" id="menu_cache">
<li class="list-menu">
<a href="javascript:void(0);" class="menu-toggle dropdown-toggle toggled my-toggle " style="">
<span class="main_menu menu_cache_name" id="main_menu menu_cache_name"></span>
</a>
<ul class="ml-menu menu_list aria-hidden menu_cache_list" style="border-top: 1px solid #fff">
</ul>
</li>
<div id="menu-slimscroll" data-height="0">
<ul class="nav nav-tabs flex-column category_list category_cache_list" role="tablist" id="ul-navbar">
<li class="nav-item product" data-ref="<%= origami_get_all_product_path %>">
<a class="nav-link" data-toggle="tab" href="" role="tab">Products</a>
</li>
</ul>
</div>
</div>
<div class="col-md-7 col-lg-7 col-sm-7 m-t-10" >
<div class="card">
<div class="card-block" style="">
<div class="card-text" id="custom-slimscroll">
<div class="row menu_items_list" style="margin:0px 1px 0px 1px ;">
<!-- append data -->
</div>
</div>
</div>
</div>
</div>
<div class="col-lg-3 col-md-3 col-sm-3" >
<button type="button" class="btn btn-lg btn-block btn-default waves-effect m-t-5" id='back'>
<i class="material-icons">reply</i>Back
</button>
<div class="card-block">
<div class="card-text" id="order-detail-slimscroll" data-height="140">
<table class="table table-striped summary-items" id="order-items-table" >
<thead>
<tr>
<th>#</th>
<th class="item-name">Items</th>
<!-- <th class="item-qty">Min Qty</th>
<th class="item-attr">Max Qty</th> -->
<!-- <th></th> -->
</tr>
</thead>
<tbody class="font-13" >
</tbody>
</table>
</div>
</div>
<div class="card-footer">
<button type="button" class="btn btn-lg btn-block btn-primary waves-effect m-t-5" id='add_out_of_stock' disabled="disabled">
Add Out Of Stock
</button>
</div>
</div>
</div>
</div>
<!-- <div class="item-modal modal sx_item_detailModal" id="sx_item_detailModal" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" aria-hidden="true">
<div class="modal-dialog custom-modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header" style="background-color: #54A5AF;padding-top:10px !important;">
<h4 class="modal-title" style="color:#fff;" id="title_name"></h4>
<button type="button" class="close" id="close" data-dismiss="modal" aria-hidden="true" style="font-size: 20px;color:#fff;">&times;</button>
</div>
<div class="modal-body">
<div class="form-inputs">
<div class="form-group">
<div class="form-group">
<label class="control-label" for="attribute">Menu Item</label>
<input class="form-control col-md-6" type="text" value="" id="item_name" readonly="true">
</div>
<input type="hidden" name="item_code" id="instance_code">
<div class="form-group">
<label class="control-label" for="attribute">Instances</label>
<div class="attributes-list col-md-6"></div>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<div class="row">
<div class="col-md-4">
<button type="button" class="btn btn-default " data-dismiss="modal" id="close">Close</button>
</div>
<div class="col-md-6">
<button type="button" class="btn btn-primary submit " data-dismiss="modal" id="submit">Submit</button>
</div>
</div>
</div>
</div>
</div>
</div> -->
<style type="text/css">
.fadeInRight{
-webkit-animation-duration: 350ms !important;
}
</style>
<script>
var cashier_type = $('#cashier_type').val();
jQuery(function(){
var menus = JSON.parse(localStorage.getItem("menus"));
if (menus != null) {
var id = menus[0]["categories"][0]["id"];
// console.log(id);
}else{
var id = 1;
}
jQuery('.first_'+id).click();
});
$(document).ready(function () {
var menus = JSON.parse(localStorage.getItem("menus"));
if (menus != null) {
menu_cache_append(menus);
}else{
$("#menu_data").removeClass("hidden");
}
function menu_cache_append(menus){
$("#menu_cache").removeClass("hidden");
$(".menu_cache_name").text(menus[0]["name"])
for(var i in menus) {
menu_list_template(menus[i]);
}
var category = menus[0]["categories"];
for(var ii in category) {
if (category[ii]["is_available"]== true){
if (category[ii]["valid_time"]== true){
if (category[ii]["parent_id"] == null ){
if (category[ii]["code"].includes("SPL") != true) {
category_list_template(category[ii]);
}
}
}
}
}
}
});
$(document).on('click', '.menu_click', function(event){
$('.my-toggle').removeClass('toggled');
$('.menu_list').css('display', 'none');
var menu_id = $(this).attr("data-id");
var name = $(this).attr("data-name");
var menus = JSON.parse(localStorage.getItem("menus"));
if (menus != null) {
console.log("hi")
menu_click_cache_append(name,menus,menu_id);
}else{
console.log("sssdfdf")
var url = "/origami/addorders/get_menu/"+menu_id;
show_menu_cat_list(name, url);
}
});
//End menu category Click
function menu_click_cache_append(name,menus,menu_id) {
var menu_list = $('.menu_items_list');
menu_list.empty();
var menu_cat = $('.category_list');
menu_cat.empty();
$(".main_menu").text(name);
for(var i in menus) {
if (menu_id == menus[i]["id"] && menus[i]["is_active"] == true) {
// menu_list_template(menus[i]);
var category = menus[i]["categories"];
for(var ii in category) {
if (category[ii]["is_available"]== true){
if (category[ii]["valid_time"]== true){
if (category[ii]["parent_id"] == null ){
if (category[ii]["code"].includes("SPL") != true) {
category_list_template(category[ii]);
}
}
}
}
}
}
}
}
function category_list_template(menu) {
row = '<li class="nav-item">'
+'<p class="hidden menu-id">'+menu.id+'</p> '
+'<a class="nav-link menu_category sub_click first_'+menu.id+'" '
+'data-toggle="tab" href="" role="tab" data-id="'+menu.id+'" '
+'data-sub-id="'+menu.sub_category+'">'+menu.name+''
+'</a>'
+'<ul class="sub_category_list hidden fadeInTop animated" '
+'id="sub_category_list">'
+'</ul>'
+' </li>';
$(".category_cache_list").append(row);
}
function menu_list_template(menu) {
row = '<li class="nav-item menu_click" data-name="'+menu.name+'" '
+' data-id="'+menu.id+'" style="">'
+' <a class="nav-link" data-toggle="tab" href="" role="tab"'
+' style="text-transform: lowercase;">'+menu.name+'</a>'
+'</li>';
$(".menu_cache_list").append(row);
}
//show menu item list when click menu category
function show_menu_cat_list(name, url_item){
var menu_list = $('.menu_items_list');
menu_list.empty();
var menu_cat = $('.category_list');
menu_cat.empty();
$(".main_menu").text(name);
//Start Ajax
$.ajax({
type: "GET",
url: url_item,
data: {},
dataType: "json",
success: function(data) {
for(var i in data) {
if (data[i].is_available == true) {
list = '<li class="nav-item menu_category sub_click" data-id="'+ data[i].id +'">'
+'<p class="hidden menu-id">'+ data[i].id +'</p> '
+'<a class="nav-link" data-toggle="tab" href="" role="tab"> '+ data[i].name +''
+'<ul class=" sub_category_list hidden fadeInTop animated"'
+'id="sub_category_list">'
+'</ul>'
+'</a>'
+'</li>';
$('.category_list').append(list);
}
}
}
});
//end Ajax
}
//end show list function
//click menu sidebar menu category
$(document).on('click', '.menu_category', function(e){
e.preventDefault();
$('.sub_category_list').addClass("hidden");
var menu_id = $(this).attr("data-id");
var url = "/inventory/get_menu_category/"+menu_id;
show_menu_item_list(url,menu_id);
var sub_id = $(this).attr("data-sub-id");
if (sub_id == "true") {
var sub_url = "/inventory/get_menu_sub_category/"+menu_id;
sub_category = $(this).siblings('.sub_category_list');
show_sub_category_list(sub_url,sub_category,menu_id);
}
});
//End menu category Click
//click menu sidebar menu category
$(document).on('click', '.menu_sub_category', function(event){
// event.preventDefault();
// $(".menu_sub_category").on("click", function(){
$('.sub_category_list').addClass("hidden");
var menu_id = $(this).attr("data-id");
var url = "/inventory/get_menu_category/"+menu_id;
show_menu_item_list(url,menu_id);
});
//End menu category Click
//show menu item list when click menu category
function show_menu_item_list(url_item,menu_id){
var menu_list = $('.menu_items_list');
menu_list.empty();
menus = JSON.parse(localStorage.getItem("menus"));
if (menus != null) {
for(var i in menus) {
var categories = menus[i]["categories"];
for(var ii in categories) {
if (categories[ii]["id"] == menu_id) {
var menu_items = categories[ii]["items"];
show_menu_list(menu_items);
}
}
}
}else{
//Start Ajax
$.ajax({
type: "GET",
url: url_item,
data: {},
dataType: "json",
success: function(data) {
var menu_items_list = $('.menu_items_list');
menu_items_list.empty();
menu_items = data.menu_items;
show_menu_list(menu_items);
}
});
//end Ajax
}
}
//end show list function
function show_menu_list(menu_items) {
var menu_list = $('.menu_items_list');
menu_list.empty();
for(var field in menu_items) {
if (menu_items[field].is_sub_item == false) {
instances = menu_items[field].instances ;
if (!instances.length > 0) {
swal("Hello Please Check!","Does not have instance item in this menu items ("+ menu_items[field].name+")","warning");
}
if (instances.length > 0) {
qty = 1;
options = [];
price = 0;
fa_plus = 'material-icons';
add = 'view_list'
menu_item_box = 'menu_item_box';
data_target = 'sx_item_detailModal';
data_modal = ''
add_icon = "add_icon"
$(instances).each(function(i){
if (instances[i].is_default === true) {
code = instances[i].code;
name = instances[i].name;
price = parseFloat(instances[i].price).toFixed(2);
is_available = instances[i].is_available ;
is_on_promotion = instances[i].is_on_promotion;
item_attributes = instances[i].values;
promotion_price = instances[i].promotion_price;
code = instances[i].code;
out_of_stock = instances[i].out_of_stock;
}
});
if (menu_items[field].image) {
image_path = menu_items[field].image;
}else{
image_path = "image/logo.png";
}
if (out_of_stock === true) {
// oos_item = out_of_stock_item
oos_item = '<div class="card custom-card testimonial-card fadeInRight card-box"'
+'data-toggle="modal" data-target=".'+data_target+'" '
+'style="height:100%;background-image:url(../../'+image_path+');background-repeat: no-repeat; pointer-events: none;opacity: 0.4;">'
}else{
oos_item = '<div class="card custom-card testimonial-card fadeInRight card-box"'
+'data-toggle="modal" data-target=".'+data_target+'" '
+'style="height:100%;background-image:url(../../'+image_path+');background-repeat: no-repeat;">'
}
row = '<div class="col-md-3">'
+ oos_item
+'<div class="custom-card-head card-head row" style="line-height:14px;margin:0px;" style="">'
+'<div class="col-md-10 " style="padding:0px !important;">'+ menu_items[field].name +'</div>'
+"<div class='col-md-2 "+menu_item_box+" ' data-item-code='"
+ menu_items[field].code +"' data-instance = '"
+JSON.stringify(menu_items[field].instances)+"' data-id = '"
+JSON.stringify(menu_items[field].attributes)+"' data-item = '"
+JSON.stringify(item_attributes)+"' data-option = '"
+JSON.stringify(menu_items[field].options)+"'data-opt = '"
+JSON.stringify(menu_items[field].options)+"' data-item-sets = '"
+JSON.stringify(menu_items[field].item_sets)+"' data-toggle='modal' data-target='."+data_target+"' style='padding:0px 5px 0px 5px'>"
+"<i class='m-l--5 fa "+fa_plus+" '>"
+add+ '</i>'
+'</div>'
+'</div>'
+"<div class='"+add_icon+" p-t-65 m-r-' data-item-code='"
+ menu_items[field].code +"' data-name='"
+ menu_items[field].name +"' data-qty = '"+ qty +"' data-price = '"
+ price +"' data-instance-code = '"+ code +"' data-instance = '"
+ name +"' data-promotion-price = '"+ promotion_price +"' data-attributes = '"
+ JSON.stringify(item_attributes) +"' data-options = '"
+ JSON.stringify(menu_items[field].options) +"' data-opt = '"
+ JSON.stringify(menu_items[field].options) +"' data-image='"+image_path+"' data-toggle='"
+data_modal+"' data-target='."+data_target+"' data-item-sets = '"
+JSON.stringify(menu_items[field].item_sets)+"'data-instances = '"
+JSON.stringify(menu_items[field].instances)+"'>"
// +"<div class='card-block custom-card-block'>"
// +"<img id='logo' height='' src='"+image_path+"'>"
// +"</div>"
+'</div>'
+'</div>'; ;
$('.menu_items_list').append(row);
}
//end instances in menu-items alest 1 instance
}
//end is_sub_item false
}
}
//click item row for add order
$(document).on('click', '.card-box', function(event){
// item_data = $(this).children().siblings('.add_icon');
var disable_item = $(this);
var item_data = $(this).children().last();
item_instance_name = item_data.attr('data-name');
item_instance_code = item_data.attr('data-instance-code');
// $('#item_code').val(item_data.attr('data-item-code'));
// $('#item_name').val(item_data.attr('data-name'));
// $('#instance_code').val(item_data.attr('data-instance-code'));
// $('.attributes-list').empty();
// data = $(this).children().children('.menu_item_box');
// data = $(this).parent().siblings('.add_icon');
// attributes = $(data).data('id');
// selected_item = $(data).data('item');
// instances = $(data).data('instance');
instance_attributes = []
for(var field in instances) {
value = instances[field].values;
$(value).each(function(i){
options = value[i];
instance_attributes.push(options);
});
}
var rowCount = $('.summary-items tbody tr').length+1;
var item_row = $('.summary-items tbody tr');
$(item_row).each(function(i){
item_name = $(item_row[i]).attr('data-item-name');
instance_code = $(item_row[i]).attr('data-instance-code');
r_option = $(item_row[i]).attr('data-opt');
if (item_name == item_data.attr('data-name') && instance_code == item_data.attr('data-instance-code')) {
}else{
}
});
row ="<tr class='item_box' data-instance-code='"
+item_data.attr('data-instance-code')+"' data-item-name='"
+item_data.attr('data-name')+"' data-row='"
+rowCount+"'>"
+'<td class="">'+rowCount+'</td>'
+'<td class="hidden" id="item_instance_code">' + item_instance_code +'</td>'
+'<td class="">' + item_instance_name +'</td>'
+'</tr>';
$(".summary-items tbody").append(row);
$(disable_item).css({"pointer-events": "none", "opacity": "0.4"});
if ($('.summary-items tbody tr').length > 0) {
$('#add_out_of_stock').removeAttr("disabled", false);
}else{
$('#add_out_of_stock').attr("disabled", true);
}
// for(var field in attributes) {
// value = attributes[field]["values"];
// type = attributes[field]["type"]
// row = "";
//
// $(value).each(function(i){
// disabled = ""
// status ="";
// if(parseInt(jQuery.inArray(value[i], selected_item)) !== -1){
// status = "selected-attribute";
// }
// if(parseInt(jQuery.inArray(value[i], instance_attributes)) == -1){
// disabled = "disabled";
// }
// row +="<button type='button' id='selected-attribute' data-instances='"+JSON.stringify(instances)+"' data-type='"
// +type+"' data-value='"+value[i]+"' class='btn btn- waves-effect attribute_btn "
// + status +" "+ type +" '"+ disabled +" >"
// +value[i]
// +"</button>";
// });
// $(".attributes-list").append(row);
// }
});
$('#add_out_of_stock').on('click', function () {
$(this).attr('disabled', 'disabled');
var oos_items = JSON.stringify(get_order_item_rows());
console.log(oos_items);
var params = {'item_instance_code': oos_items};
var ajax_url = '../out_of_stock/update';
$.ajax({
type: "PATCH",
url: ajax_url,
data: params,
dataType: "json",
success:function(result){
if (result.status) {
swal("Success",result.message,"success");
}else{
swal("Opps",result.message,"warning");
}
}
});
function get_order_item_rows(){
var order_items = [];
var item_row = $('.summary-items tbody tr');
$(item_row).each(function(i){
var order_item = {};
// order_item.item_name = $(item_row[i]).attr('data-item-name');
order_item.item_instance_code = $(item_row[i]).attr('data-instance-code');
order_items.push(order_item);
});
return order_items;
}
// click select option icon for add
$(document).on('click', '.attribute_btn', function(event){
// $('.change_qty').val(1);
value = $(this).data('value');
type = $(this).data('type');
instances = $(this).data('instances');
attributes = $(".attribute_btn");
$(attributes).each(function(i){
if ($(attributes[i]).attr('data-type')==type){
$('.'+type).removeClass("selected-attribute");
}
});
$(this).addClass('selected-attribute');
var selected_attr = get_selected_attributes('selected-attribute');
for(var field in instances) {
item_attr = instances[field].values;
if(JSON.stringify(item_attr) == JSON.stringify(selected_attr)){
$('#instance_code').val(instances[field].code);
}
}
}); //End selecct attribute buttom
// Get Selected Class
function get_selected_attributes(selected_class) {
var item_row = $('.'+selected_class);
var attribute_arr = [];
$(item_row).each(function(i){
value = $(item_row[i]).attr('data-value');
str = value;
attribute_arr.push(str);
});
return attribute_arr;
}
$(document).on('click', '.cashier_number', function(event){
if(event.handled !== true) {
var original_value;
original_value = $('#modal-qty').attr('data-value');
original_qty = $('#modal-qty').val();
var input_type = $(this).attr("data-type");
switch (input_type) {
case 'num':
var input_value = $(this).attr("data-value");
if (original_value == "0"){
$('#modal-qty').val(input_value);
$('#modal-qty').attr('data-value',input_value);
// update_total_amount();
}else{
$('#modal-qty').val(original_qty + input_value);
$('#modal-qty').attr('data-value',original_qty + input_value);
// update_total_amount();
}
break;
case 'add':
case 'del' :
case 'clr':
$('#modal-qty').val(1);
$('#modal-qty').attr('data-value',0);
// update_total_amount();
break;
}
event.handled = true;
} else {
return false;
}
});
// click select option icon for add
$(document).on('click', '.submit', function(event){
var item_code = $("#instance_code").val();
var min_qty = $("#min_qty").val();
var max_qty = $("#max_qty").val();
var item_name = $("#item_name").val();
console.log(item_code);
console.log(min_qty);
console.log(max_qty);
var params = {'item_code': item_code};
var ajax_url = 'settings_update_menu_items_path';
$.ajax({
type: "POST",
url: ajax_url,
data: params,
dataType: "json",
success:function(result){
if (result.status) {
var rowCount = $('.summary-items tbody tr').length+1;
row ="<tr class=''>"
+'<td class="">'+rowCount+'</td>'
+'<td class="hidden" id="itemCodeee">' + item_code +'</td>'
+'<td class="">' + item_name +'</td>'
+'</tr>';
$(".summary-items tbody").append(row);
swal("Success",result.message,"success");
}else{
swal("Opps",result.message,"warning");
}
}
});
// +'<td class="" onClick="remove()"><i class="material-icons"style="cursor: pointer;">delete_forever</i></td>'
});
$('#back').on('click', function () {
window.location.href = '/settings/out_of_stock';
});
$('#stock_taking').on('click', function () {
window.location.href = '/inventory/stock_checks';
});
});
// $('.remove_row').on('click', function(){
// window.location.href = '/inventory';
// console.log('remove row!!!!!');
// alert('Are you suer?');
// });
// function remove(){
// var itemCode = $("#itemCodeee").text();
//
// var params = {'item_code': itemCode};
// var ajax_url = '<%=inventory_inventory_definitions_path%>';
// $.ajax({
// type: "POST",
// url: ajax_url,
// data: params,
// dataType: "json",
// success:function(result){
// if (result.status) {
// var rowCount = $('.summary-items tbody tr').length+1;
// row =
// $(".summary-items tbody").append(row);
// swal("Success",result.message,"success");
// }else{
// swal("Opps",result.message,"warning");
// }
// }
// });
//
// console.log('remove row!!!!!');
// console.log(itemCode);
// }
</script>

View File

@@ -0,0 +1,73 @@
<table class="table table-striped">
<tr>
<th><%= t("views.right_panel.detail.product") %></th>
<th><%= t("views.right_panel.detail.status") %></th>
<th><%= t("views.right_panel.detail.action") %></th>
</tr>
<% cate_arr = Array.new %>
<%
count = 0
@menu_items.each do |item|
count += 1
%>
<tr>
<td><%= item.name rescue '-' %></td>
<td>
<% if item.is_out_of_stock %>
<div class="badge badge-success">Active</div>
<% else %>
<div class="badge badge-danger">Inactive</div>
<% end %>
</td>
<td>
<button type="button" class="delete btn btn-danger btn-sm waves-effect" data-ref="<%= settings_out_of_stock_path(item) %>" data-method="delete">
<%= t("views.btn.reset") %>
</button>
<span class="hidden" id="delete_text">
<h6>Are you sure you want to delete this row ?</h6>
<h6>This action can't be undo. </h6>
</span>
</td>
</tr>
<% end %>
</table>
<script>
$('.show_track').on('click', function () {
var ID = $(this).attr("data-value");
window.location.href = '/inventory/'+ID+'/show';
});
$(document).on('click', '.update', function(event){
var item_code = $("#instance_code").val();
var min_qty = $("#min_qty").val();
var max_qty = $("#max_qty").val();
var item_name = $("#item_name").val();
console.log(item_code);
console.log(min_qty);
console.log(max_qty);
var params = {'item_code': item_code,
'min_order_level': min_qty,
'max_stock_level': max_qty};
var ajax_url = 'settings_update_menu_items_path';
$.ajax({
type: "PATCH",
url: ajax_url,
data: params,
dataType: "json",
success:function(result){
if (result.status) {
swal("Success",result.message,"success");
}else{
swal("Opps",result.message,"warning");
}
}
});
});
</script>

View File

@@ -0,0 +1,45 @@
<div class="page-header">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="<%= dashboard_path %>"><%= t("views.right_panel.button.home") %></a></li>
<li class="breadcrumb-item active"><%= t :out_of_stock %></li>
<span class="float-right">
<%= link_to t('.back', :default => t("views.btn.back")), dashboard_path %>
</span>
</ol>
</div>
<div class="row ">
<div class="col-lg-4 col-md-4 col-sm-4" style="padding-left: 17px;">
<%= form_tag inventory_path, :id => "filter_form", :method => :get do %>
<input type="text" class="form-control" name="filter" id="Product" type="text" placeholder="Product" style="height: 32px;">
</div>
<div class="col-lg-2 col-md-2 col-sm-2 text-">
<input type="submit" value="Filter" class='btn btn-primary'>
</div>
<% end %>
<div class="col-lg-6 col-md-6 col-sm-6" style="padding-right: 15px;">
<button type="button" class="delete btn btn-danger btn-sm float-right waves-effect" style='margin-left:5px;' data-ref="<%= settings_reset_all_path %>" data-method="delete">
<%= t("views.btn.reset_all") %>
</button>
<button id='new_out_of_stock' class='btn btn-primary float-right waves-effect' style='margin-left:5px;'><%= (t :new_out_of_stock) +" " %> <%= t("views.right_panel.detail.item") %></button>
</div>
</div>
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
<div class="card">
<%= render 'out_of_stock_list' %>
</div>
</div>
</div>
<script>
$('#new_out_of_stock').on('click',function(){
window.location.href = '/settings/out_of_stock/new';
});
</script>

View File

@@ -0,0 +1,2 @@
<br>
<%= render 'form'%>

View File

@@ -43,7 +43,7 @@ scope "(:locale)", locale: /en|mm/ do
#Session Login and Logout #Session Login and Logout
post 'authenticate' => "authenticate#create" post 'authenticate' => "authenticate#create"
delete 'authenticate' => "authenticate#destroy" delete 'authenticate' => "authenticate#destroy"
resources :shops, only: [:index, :show] resources :shops, only: [:index, :show]
resources :verifications, only: [:new] resources :verifications, only: [:new]
post 'verifications/update' => "verifications#update" post 'verifications/update' => "verifications#update"
@@ -57,9 +57,10 @@ scope "(:locale)", locale: /en|mm/ do
resources :menu_item_options, only: [:index] resources :menu_item_options, only: [:index]
resources :menu_sold_out, only: [:index] resources :menu_sold_out, only: [:index]
resources :menu_item_instances, only: [:show] resources :menu_item_instances, only: [:show]
resources :out_of_stock, only: [:index]
get "item_sets" => "item_sets#index" get "item_sets" => "item_sets#index"
end end
namespace :payment do namespace :payment do
post 'mobilepayment/:cashier_id/:receipt_no/cash' =>"mobilepayment#cash" post 'mobilepayment/:cashier_id/:receipt_no/cash' =>"mobilepayment#cash"
end end
@@ -508,6 +509,9 @@ scope "(:locale)", locale: /en|mm/ do
get '/get_transactions_by_commissioner' => 'commissioners#get_transaction_by_commissioner', as:'get_transaction_by_commissioner' get '/get_transactions_by_commissioner' => 'commissioners#get_transaction_by_commissioner', as:'get_transaction_by_commissioner'
# get 'menu_item_instances/get_instance/:id' => 'menu_item_instances#get_instance',:as => "show_instance" # get 'menu_item_instances/get_instance/:id' => 'menu_item_instances#get_instance',:as => "show_instance"
resources :out_of_stock
# post "update_out_of_stock" => 'out_of_stock#update'
delete "out_of_stock" => 'out_of_stock#reset_all', as: :reset_all
end end
#--------- Transactions Sections ------------# #--------- Transactions Sections ------------#

View File

@@ -0,0 +1,5 @@
class AddIsOutOfStockToMenuItemInstaces < ActiveRecord::Migration[5.1]
def change
add_column :menu_item_instances, :is_out_of_stock, :boolean
end
end

View File

@@ -0,0 +1,10 @@
class CreateOutOfStocks < ActiveRecord::Migration[5.1]
def change
create_table :out_of_stocks do |t|
t.datetime :date
t.string :item_instance_code
t.timestamps
end
end
end

View File

@@ -1 +0,0 @@
25205

View File

@@ -0,0 +1,5 @@
require 'rails_helper'
RSpec.describe OutOfStock, type: :model do
pending "add some examples to (or delete) #{__FILE__}"
end