Merge branch 'master' of ssh://bitbucket.org/code2lab/sxrestaurant

This commit is contained in:
Min Zeya Phyo
2017-06-06 12:05:06 +06:30
68 changed files with 880 additions and 272 deletions

View File

@@ -91,3 +91,5 @@ end
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
gem 'httparty', '~> 0.15.5'

View File

@@ -1,6 +1,6 @@
GIT
remote: git://github.com/amatsuda/kaminari.git
revision: c3c853a944cd2bff072ae05e48c563b2c9a29597
revision: bc52ae73d41386d344b5d1b18e689e5a988f1a03
branch: master
specs:
kaminari (1.0.1)
@@ -92,7 +92,9 @@ GEM
railties (>= 3.2, < 5.2)
globalid (0.4.0)
activesupport (>= 4.2.0)
i18n (0.8.1)
httparty (0.15.5)
multi_xml (>= 0.5.2)
i18n (0.8.4)
jbuilder (2.6.4)
activesupport (>= 3.0.0)
multi_json (>= 1.2)
@@ -114,6 +116,7 @@ GEM
mini_portile2 (2.1.0)
minitest (5.10.2)
multi_json (1.12.1)
multi_xml (0.6.0)
mysql2 (0.4.6)
nio4r (2.1.0)
nokogiri (1.7.2)
@@ -124,7 +127,7 @@ GEM
ttfunk (~> 1.5)
prawn-table (0.2.2)
prawn (>= 1.3.0, < 3.0.0)
puma (3.8.2)
puma (3.9.1)
rack (2.0.3)
rack-cors (0.4.1)
rack-protection (2.0.0)
@@ -247,6 +250,7 @@ DEPENDENCIES
factory_girl_rails (~> 4.0)
faker
font-awesome-rails
httparty (~> 0.15.5)
jbuilder (~> 2.5)
jquery-rails
kaminari!

View File

@@ -0,0 +1,113 @@
// $(document).on('touchstart click', '.keypad', function(event){
// event.stopPropagation();
// event.preventDefault();
// if(event.handled !== true) {
//
// // Do your magic here.
// var input_value = $(this).attr("data-value");
// switch (input_value) {
//
// case 'delete':
// process_delete_payment();
// break;
//
// case 'foc':
// remove_input_action();
// $(".foc").attr("data-action","true");
// if(customerName.toString() != " "){ //if already chosen customer
// if($("#foc_reason_lists").attr("foc_reason") == ' '){
// alert("Please! Choose or Add FOC reason");
// foc_additional_form();
// }
// else{
// process_foc_payment();
// }
// }
// else{
// alert("Please! Choose or Save Customer");
// foc_additional_form();
// }
// break;
//
// case 'nett':
// remove_input_action();
// $(".nett").attr("data-action","true");
// if($(".credit_note_payment").hasClass("payment_selected")){
// if(customerName == " "){
// alert("Please! Choose or Save Customer");
// showCustomer();
// }
// else{
// $("#accept_payment_btn").attr("data-payment","credit");
// process_nett_payment();
// }
// }
// else{
// process_nett_payment();
// }
// break;
//
// case 'edit':
// process_edit_invoice();
// break;
//
// case 'cancel':
// remove_input_action();
// var status = $("#label_amountdue").attr("data-status");
// if (status != 'completed' && status != 'void'){
// $(".cancel").attr("data-action","true");
// var message = confirm("Are you sure to void? Please, add reason!");
// if (message == true) {
// $(".additional_form").hide();
// $("#void_sale_additional_form").show();
// process_cancel_payment();
// }
// }
// else{
// $(".cancel").addClass("dim");
// }
// break;
//
// case 'ent':
// amount_due = parseFloat($("#label_amountdue").attr("data-original"));
// other_amt = parseFloat($("#label_cash_amount").attr("data-value"));
// credit_amount = parseFloat($("#label_credit_note").text());
// if ($(".credit_note_payment").hasClass("payment_selected") && credit_amount > 0){
// if(customerName.toString() != " "){
// if(credit_amount > (amount_due - other_amt)){
// alert("You shouldn't exceed the amount due.");
// }
// else{
// $("#accept_payment_btn").attr("data-payment","credit");
// update_balance_due();
// }
// }
// else{
// alert("Please! Choose or Save Customer");
// }
// }
// else{
// update_balance_due();
// }
//
// break;
// case 'clear':
// process_clear_payment();
// break;
//
// default:
//
// var existing_value = $(".payment_selected span").text();
//
// if (existing_value == "0" || existing_value == "0.00") { existing_value = ""; }
// existing_value = existing_value + input_value;
// $(".payment_selected span").text(existing_value);
//
// }
//
//
// event.handled = true;
// } else {
// return false;
// }
// });

View File

@@ -7,3 +7,21 @@
// min-height: 75rem;
// padding-top: 4.5rem;
// }
.cashier_number{
height:76px;
line-height:80px;
text-align:center;
background:#54A5AF;
float:left;
margin:2px;
font-size:20px;
color:white;
cursor:pointer;
}
.cashier_number:hover{
background:#A9F5F2;
}
.long{
width:100%
}

View File

@@ -10,7 +10,7 @@ class Api::BillController < Api::ApiController
if (params[:booking_id])
@sale = Sale.new
@status = @sale.generate_invoice_from_booking(params[:booking_id], current_login_employee.name)
elsif (params[:order_id])
@sale = Sale.new
@status = @sale.generate_invoice_from_order(params[:order_id], current_login_employee.name)

View File

@@ -28,7 +28,7 @@ class Api::OrdersController < Api::ApiController
@order = Order.new
@order.source = params[:order_source]
@order.order_type = params[:order_type]
@order.customer_id = params[:customer_id]
@order.customer_id = params[:customer_id] == ""? "CUS-000000000001" : params[:customer_id] # for no customer id from mobile
@order.items = params[:order_items]
@order.guest = params[:guest_info]
@order.table_id = params[:table_id]

View File

@@ -4,7 +4,7 @@ class Crm::CustomersController < ApplicationController
# GET /crm/customers
# GET /crm/customers.json
def index
@crm_customers = Crm::Customer.all
@crm_customers = Customer.all
end
# GET /crm/customers/1
@@ -14,7 +14,8 @@ class Crm::CustomersController < ApplicationController
# GET /crm/customers/new
def new
@crm_customer = Crm::Customer.new
@crm_customer = Customer.new
@membership = Customer.get_member_group
end
# GET /crm/customers/1/edit
@@ -24,7 +25,7 @@ class Crm::CustomersController < ApplicationController
# POST /crm/customers
# POST /crm/customers.json
def create
@crm_customer = Crm::Customer.new(crm_customer_params)
@crm_customer = Customer.new(crm_customer_params)
respond_to do |format|
if @crm_customer.save
@@ -64,7 +65,7 @@ class Crm::CustomersController < ApplicationController
private
# Use callbacks to share common setup or constraints between actions.
def set_crm_customer
@crm_customer = Crm::Customer.find(params[:id])
@crm_customer = Customer.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.

View File

@@ -35,15 +35,15 @@ class Oqs::HomeController < BaseOqsController
# Query for OQS with status
def queue_items_query(status)
AssignedOrderItem.select("assigned_order_items.id, oqs.station_name, oqs.is_active, df.name as zone, odt.item_code, odt.item_name, odt.price, odt.qty, odt.item_order_by, cus.name as customer_name, odt.created_at")
.joins("join order_queue_process_by_zones as oqpz ON oqpz.order_queue_station_id = assigned_order_items.order_queue_station_id
AssignedOrderItem.select("assigned_order_items.assigned_order_item_id, oqs.station_name, oqs.is_active, df.name as zone, odt.item_code, odt.item_name, odt.price, odt.qty, odt.item_order_by, cus.name as customer_name, odt.created_at")
.joins(" left join order_queue_process_by_zones as oqpz ON oqpz.order_queue_station_id = assigned_order_items.order_queue_station_id
left join dining_facilities as df on df.zone_id = oqpz.zone_id
left join order_queue_stations as oqs ON oqs.id = assigned_order_items.order_queue_station_id
left join orders as od ON od.id = assigned_order_items.order_id
left join orders as od ON od.order_id = assigned_order_items.order_id
left join order_items as odt ON odt.item_code = assigned_order_items.item_code
left join customers as cus ON cus.id = od.customer_id")
left join customers as cus ON cus.customer_id = od.customer_id")
.where("assigned_order_items.delivery_status = #{status}")
.group("assigned_order_items.id")
.group("assigned_order_items.assigned_order_item_id")
.order("odt.item_name DESC")
end
end

View File

@@ -2,7 +2,7 @@ class Oqs::PrintController < ApplicationController
def print
unique_code="OrderItemPdf"
assigned_item_id=params[:id]
assigned_order_item=AssignedOrderItem.select("order_id, item_code").where('id='+assigned_item_id)
assigned_order_item=AssignedOrderItem.select("order_id, item_code").where("assigned_order_item_id='" + assigned_item_id + "'")
print_settings=PrintSetting.find_by_unique_code(unique_code)
order_queue_printer= Printer::OrderQueuePrinter.new(print_settings)
@@ -17,7 +17,7 @@ class Oqs::PrintController < ApplicationController
def print_order_summary
unique_code="OrderSummaryPdf"
assigned_item_id=params[:id]
assigned_order_item=AssignedOrderItem.select("order_id").where('id='+assigned_item_id)
assigned_order_item=AssignedOrderItem.select("order_id").where('assigned_order_item_id='+assigned_item_id)
print_settings=PrintSetting.find_by_unique_code(unique_code)
order_queue_printer= Printer::OrderQueuePrinter.new(print_settings)

View File

@@ -1,15 +1,26 @@
class Origami::HomeController < BaseOrigamiController
def index
@order_table = Order.get_order_table()
@order_rooms = Order.get_order_rooms()
@booking_orders = Order.get_booking_order_table()
@booking_rooms = Order.get_booking_order_rooms()
@orders = Order.get_orders()
end
def show
str = []
@order_details = OrderItem.get_order_items_details(params[:order_id])
@order_details.each do |ord_detail|
str.push(ord_detail)
end
render :json => str.to_json
if !params[:sale_id].nil?
@order_details = SaleItem.get_order_items_details(params[:sale_id])
@order_details.each do |ord_detail|
str.push(ord_detail)
end
render :json => str.to_json
else
@order_details = OrderItem.get_order_items_details(params[:order_id])
@order_details.each do |ord_detail|
str.push(ord_detail)
end
render :json => str.to_json
end
end
end

View File

@@ -1,6 +1,14 @@
class Origami::PaymentsController < BaseOrigamiController
def index
end
def create
end
def show
end
end

View File

@@ -1,22 +1,37 @@
class Origami::RequestBillsController < BaseOrigamiController
def show
def create
@sale = Sale.new
check_order = Order.find_by_id(params[:id])
if check_order
@order_details = OrderItem.get_order_items_details(check_order.id)
@order_details = OrderItem.get_order_items_details(check_order.id)
@status, @sale_id = @sale.generate_invoice_from_order(check_order.id, nil,current_login_employee.name)
@sale_data = Sale.find_by_id(@sale_id)
@sale_items = SaleItem.where("sale_id=?",@sale_id)
end
booking_id = params[:id]
check_booking = Booking.find_by_booking_id(booking_id)
if check_booking.sale_id.nil?
#check if it doesn't exist
@status = @sale.generate_invoice_from_booking(check_booking.id,current_login_employee.name)
@sale_data = Sale.find_by_sale_id(check_booking.sale_id)
@sale_items = SaleItem.where("sale_id=?",check_booking.sale_id)
else
@sale_data = Sale.find_by_sale_id(check_booking.sale_id)
@sale_items = SaleItem.where("sale_id=?",check_booking.sale_id)
end
unique_code="ReceiptBillPdf"
print_settings=PrintSetting.find_by_unique_code(unique_code)
printer = Printer::ReceiptPrinter.new(print_settings)
printer.print_receipt_bill(print_settings,@sale_items,@sale)
printer.print_receipt_bill(print_settings,@sale_items,@sale,@sale_data)
end
def show
sale_id = params[:sale_id]
if Sale.exists?(sale_id)
@sale_data = Sale.find_by_id(sale_id)
end
end
end

View File

@@ -63,7 +63,14 @@ class Settings::MenuCategoriesController < ApplicationController
# DELETE /settings/menu_categories/1
# DELETE /settings/menu_categories/1.json
def destroy
# instances = MenuItemInstance.where("menu_item_id=?",@settings_menu_item.id)
# instances.each do |instance|
# instance.destroy
# end
# @settings_menu_item.destroy
# @settings_menu_category.destroy
abc = MenuCategory.destroyCategory(@settings_menu_category)
respond_to do |format|
format.html { redirect_to settings_menu_categories_path, notice: 'Menu category was successfully destroyed.' }
format.json { head :no_content }

View File

@@ -11,18 +11,21 @@ class Settings::MenuItemInstancesController < ApplicationController
# GET /settings/menu_item_instances/1
# GET /settings/menu_item_instances/1.json
def show
@category = MenuCategory.find(@item.menu_category_id)
id = MenuItemInstance.findParentCategory(@item)
@category = MenuCategory.find(id)
end
# GET /settings/menu_item_instances/new
def new
@category = MenuCategory.find(@item.menu_category_id)
id = MenuItemInstance.findParentCategory(@item)
@category = MenuCategory.find(id)
@settings_menu_item_instances = MenuItemInstance.new
end
# GET /settings/menu_item_instances/1/edit
def edit
@category = MenuCategory.find(@item.menu_category_id)
id = MenuItemInstance.findParentCategory(@item)
@category = MenuCategory.find(id)
end
# POST /settings/menu_item_instances
@@ -30,6 +33,7 @@ class Settings::MenuItemInstancesController < ApplicationController
def create
@settings_menu_item_instances = MenuItemInstance.new(settings_menu_item_instance_params)
#check if the menu item type is simple or not( not only the diff of status .. here is different routes)
if params[:simple_menu_item_id]
@settings_menu_item_instances.menu_item_id = params[:simple_menu_item_id]
catID = MenuItem.find(params[:simple_menu_item_id])
@@ -38,7 +42,8 @@ class Settings::MenuItemInstancesController < ApplicationController
catID = MenuItem.find(params[:set_menu_item_id])
end
category = MenuCategory.find(catID.menu_category_id)
id = MenuItemInstance.findParentCategory(catID)
category = MenuCategory.find(id)
respond_to do |format|
if @settings_menu_item_instances.save
@settings_menu_item_instances.item_attributes = params[:menu_item_instance][:item_attributes].reject(&:blank?)
@@ -55,14 +60,15 @@ class Settings::MenuItemInstancesController < ApplicationController
# PATCH/PUT /settings/menu_item_instances/1
# PATCH/PUT /settings/menu_item_instances/1.json
def update
puts "params[:menu_item_instance][:item_attributes]"
puts params[:menu_item_instance][:item_attributes]
#check if the menu item type is simple or not( not only the diff of status .. here is different routes)
if params[:simple_menu_item_id]
catID = MenuItem.find(params[:simple_menu_item_id])
else
catID = MenuItem.find(params[:set_menu_item_id])
end
category = MenuCategory.find(catID.menu_category_id)
id = MenuItemInstance.findParentCategory(catID)
category = MenuCategory.find(id)
respond_to do |format|
if @settings_menu_item_instances.update(settings_menu_item_instance_params)
@@ -86,7 +92,13 @@ class Settings::MenuItemInstancesController < ApplicationController
else
catID = MenuItem.find(params[:set_menu_item_id])
end
category = MenuCategory.find(catID.menu_category_id)
# check if the menu item is sub of another menu item
if catID.menu_category_id
category = MenuCategory.find(catID.menu_category_id)
else
item = MenuItem.find(catID.menu_item_id)
category = MenuCategory.find(item.menu_category_id)
end
respond_to do |format|
format.html { redirect_to settings_menu_category_simple_menu_item_path(category,catID), notice: 'Menu item instance was successfully destroyed.' }
format.json { head :no_content }

View File

@@ -55,7 +55,8 @@ class Settings::MenusController < ApplicationController
# DELETE /settings/menus/1
# DELETE /settings/menus/1.json
def destroy
@settings_menu.destroy
# @settings_menu.destroy
abc = Menu.destroyMenu(@settings_menu)
respond_to do |format|
format.html { redirect_to settings_menus_path, notice: 'Menu was successfully destroyed.' }
format.json { head :no_content }

View File

@@ -62,7 +62,7 @@ class Settings::SetMenuItemsController < ApplicationController
# DELETE /settings/menu_items/1
# DELETE /settings/menu_items/1.json
def destroy
# @settings_menu_item.destroy
abc = MenuItem.deleteRecursive(@settings_menu_item)
respond_to do |format|
format.html { redirect_to settings_menu_category_set_menu_items_path, notice: 'Menu item was successfully destroyed.' }
format.json { head :no_content }

View File

@@ -59,7 +59,7 @@ class Settings::SimpleMenuItemsController < ApplicationController
# DELETE /settings/menu_items/1
# DELETE /settings/menu_items/1.json
def destroy
# @settings_menu_item.destroy
abc = MenuItem.deleteRecursive(@settings_menu_item)
respond_to do |format|
format.html { redirect_to settings_menu_category_simple_menu_items_path, notice: 'Menu item was successfully destroyed.' }
format.json { head :no_content }

View File

@@ -1,11 +1,11 @@
class OrderQueueProcessorJob < ApplicationJob
queue_as :default
queue_as :oqs
def perform(order_id)
# Do something later
#Order ID
order = Order.find(order_id)
#Loop through the order stations and process the items
#Execute orders and send to order stations
if order

View File

@@ -1,6 +1,9 @@
class AssignedOrderItem < ApplicationRecord
before_create :generate_custom_id
#primary key - need to be unique
self.primary_key = "assigned_order_item_id"
belongs_to :order
belongs_to :order_queue_station

View File

@@ -1,6 +1,9 @@
class Booking < ApplicationRecord
before_create :generate_custom_id
self.primary_key = "booking_id"
#primary key - need to be unique
before_create :generate_custom_id
belongs_to :dining_facility, :optional => true
belongs_to :sale, :optional => true

View File

@@ -1,5 +1,5 @@
class BookingOrder < ApplicationRecord
#primary key - need to be unique
#primary key - need to be unique
belongs_to :booking
belongs_to :order

View File

@@ -1,4 +1,6 @@
class Customer < ApplicationRecord
self.primary_key = "customer_id"
before_create :generate_custom_id
has_many :orders
has_many :sales

View File

@@ -22,4 +22,13 @@ class Menu < ApplicationRecord
return current_menu
end
def self.destroyMenu(menu)
cats = MenuCategory.where("menu_id=?",menu.id)
cats.each do |cat|
abc = MenuCategory.destroyCategory(cat)
end
menu.destroy
return false
end
end

View File

@@ -8,5 +8,29 @@ class MenuCategory < ApplicationRecord
default_scope { order('order_by asc') }
def self.destroyCategory(menu_category)
# find the sub menu item of current item
sub_menu_cat = MenuCategory.where("menu_category_id=?",menu_category.id)
if sub_menu_cat.length != 0
sub_menu_cat.each do |sub|
if destroyCategory(sub)
end
end
# find the items of current menu item
items = MenuItem.where("menu_category_id=?",menu_category.id)
items.each do |item|
abc = MenuItem.deleteRecursive(item)
end
menu_category.destroy
return true
else
items = MenuItem.where("menu_category_id=?",menu_category.id)
items.each do |item|
abc = MenuItem.deleteRecursive(item)
end
menu_category.destroy
return false
end
end
end

View File

@@ -1,5 +1,6 @@
class MenuItem < ApplicationRecord
# belongs_to :account
#belongs_to :account
belongs_to :menu_category, :optional => true
has_many :menu_item_instances
belongs_to :parent, :class_name => "MenuItem", foreign_key: "menu_item_id", :optional => true
@@ -38,4 +39,31 @@ class MenuItem < ApplicationRecord
return nil
end
def self.deleteRecursive(menu_item)
# find the sub menu item of current item
sub_menu_items = MenuItem.where("menu_item_id=?",menu_item.id)
if sub_menu_items.length != 0
sub_menu_items.each do |subitem|
if deleteRecursive(subitem)
end
end
# find the instances of current menu item
instances = MenuItemInstance.where("menu_item_id=?",menu_item.id)
instances.each do |instance|
instance.destroy
end
menu_item.destroy
return true
else
instances = MenuItemInstance.where("menu_item_id=?",menu_item.id)
instances.each do |instance|
instance.destroy
end
menu_item.destroy
return false
end
end
end

View File

@@ -1,4 +1,12 @@
class MenuItemInstance < ApplicationRecord
belongs_to :menu_item
def self.findParentCategory(item)
if item.menu_category_id
return item.menu_category_id
else
parentitem = MenuItem.find(item.menu_item_id)
findParentCategory(parentitem)
end
end
end

View File

@@ -1,4 +1,6 @@
class Order < ApplicationRecord
self.primary_key = "order_id"
#primary key - need to be unique
before_create :generate_custom_id
before_create :set_order_date
@@ -40,7 +42,7 @@ class Order < ApplicationRecord
self.adding_line_items
#Add Order Table and Room relation afrer order creation
BookingOrder.create({:booking_id => booking.id, :order => self})
BookingOrder.create({:booking_id => booking.booking_id, :order => self})
#Send order to queue one it done!
process_order_queue
@@ -190,7 +192,7 @@ class Order < ApplicationRecord
# Count number of different items
self.item_count = self.order_items.item_count
self.quantity_count = quantity_count
# Counter number of quantity
# Counter number of quantityf
end
#Process order items and send to order queue
@@ -207,6 +209,7 @@ class Order < ApplicationRecord
end
#Origami: Cashier : to view order type Table
def self.get_order_table
order_table = Order.select("orders.id as order_id,sum(order_items.qty*order_items.price) as total_price,
order_items.id as order_items_id,dining_facilities.name as table_name")
@@ -215,38 +218,64 @@ class Order < ApplicationRecord
left join dining_facilities on dining_facilities.id = bookings.dining_facility_id
left join order_items on order_items.order_id = orders.id")
.where("dining_facilities.type=? and orders.order_type=? and dining_facilities.is_active=?",DiningFacility::TABLE_TYPE,"dine_in",true)
.group("orders.order_id, order_items.order_items_id,dining_facilities.name")
end
.group("orders.id")
def self.get_booking_order_table
booking_orders = Booking.select("sales.receipt_no,orders.status as order_status,
bookings.booking_id,sales.sale_id as sale_id,dining_facilities.name as table_name")
.joins("left join booking_orders on booking_orders.booking_id = bookings.booking_id")
.joins("left join dining_facilities on dining_facilities.id = bookings.dining_facility_id")
.joins("left join orders on orders.order_id = booking_orders.order_id")
.joins("left join sale_orders on sale_orders.order_id = orders.order_id")
.joins("left join sales on sales.sale_id = sale_orders.sale_id")
.where("booking_orders.order_id IS NOT NULL and dining_facilities.type=? and dining_facilities.is_active=?",DiningFacility::TABLE_TYPE,true)
.group("bookings.booking_id")
end
#Origami: Cashier : to view order type Room
def self.get_booking_order_rooms
booking_rooms = Booking.select("sales.receipt_no,orders.status as order_status,bookings.booking_id,sales.sale_id as sale_id,dining_facilities.name as room_name")
.joins("left join booking_orders on booking_orders.booking_id = bookings.booking_id")
.joins("left join dining_facilities on dining_facilities.id = bookings.dining_facility_id")
.joins("left join orders on orders.order_id = booking_orders.order_id")
.joins("left join sale_orders on sale_orders.order_id = orders.order_id")
.joins("left join sales on sales.sale_id = sale_orders.sale_id")
.where("booking_orders.order_id IS NOT NULL and dining_facilities.type=? and dining_facilities.is_active=?",DiningFacility::ROOM_TYPE,true)
.group("bookings.booking_id")
end
#Origami: Cashier : to view order type Room
def self.get_order_rooms
order_rooms = Order.select("orders.id as order_id,sum(order_items.qty*order_items.price) as total_price,
order_rooms = Order.select("orders.order_id as order_id,sum(order_items.qty*order_items.price) as total_price,
order_items.id as order_items_id,dining_facilities.name as room_name")
.joins("left join booking_orders on booking_orders.order_id = orders.id
left join bookings on bookings.id = booking_orders.id
.joins("left join booking_orders on booking_orders.order_id = orders.order_id
left join bookings on bookings.booking_id = booking_orders.order_id
left join dining_facilities on dining_facilities.id = bookings.dining_facility_id
left join order_items on order_items.order_id = orders.id")
left join order_items on order_items.order_id = orders.order_id")
.where("dining_facilities.type=? and orders.order_type=? and dining_facilities.is_active=?",DiningFacility::ROOM_TYPE,"dine_in",true)
.group("orders.id,order_items.id,dining_facilities.name")
.group("orders.order_id,order_items.order_items_id,dining_facilities.name")
end
#Origami: Cashier : to view orders
def self.get_orders
from = Time.now.beginning_of_day.utc
to = Time.now.end_of_day.utc
orders = Order.select("orders.id as order_id,sum(order_items.qty*order_items.price) as total_price,
order_items.id as order_items_id,dining_facilities.name as table_or_room_name")
.joins("left join booking_orders on booking_orders.order_id = orders.id
left join bookings on bookings.id = booking_orders.id
orders = Order.select("orders.order_id as order_id,sales.receipt_no,orders.status as order_status,bookings.booking_id,sales.sale_id as sale_id,dining_facilities.name as table_name")
.joins("left join booking_orders on booking_orders.order_id = orders.order_id
left join bookings on bookings.booking_id = booking_orders.order_id
left join dining_facilities on dining_facilities.id = bookings.dining_facility_id
left join order_items on order_items.order_id = orders.id")
left join order_items on order_items.order_id = orders.order_id
left join sale_orders on sale_orders.order_id = orders.order_id
left join sales on sales.sale_id = sale_orders.sale_id")
.where("dining_facilities.is_active=? and orders.date between ? and ?",true,from,to)
.group("orders.id")
.group("orders.order_id,order_items.order_items_id,dining_facilities.name")
end
private
def generate_custom_id
self.order_id = SeedGenerator.generate_id(self.class.name, "ODR")
end
@@ -254,4 +283,5 @@ class Order < ApplicationRecord
def set_order_date
self.date = Time.now.utc
end
end

View File

@@ -1,4 +1,6 @@
class OrderItem < ApplicationRecord
self.primary_key = "order_items_id"
#primary key - need to be unique
before_create :generate_custom_id
@@ -37,15 +39,23 @@ class OrderItem < ApplicationRecord
end
#Origami : Cashier : to show order items details
def self.get_order_items_details(order_id)
order_details = OrderItem.select("order_items.item_name,order_items.qty,order_items.price,(order_items.qty*order_items.price) as total_price")
.joins("left join orders on orders.id = order_items.order_id")
.where("order_items.order_id=?",order_id)
def self.get_order_items_details(booking_id)
booking_orders = BookingOrder.where("booking_id=?",booking_id)
if booking_orders
booking_orders.each do |book_order|
order_details = OrderItem.select("order_items.item_name,order_items.qty,order_items.price,(order_items.qty*order_items.price) as total_price")
.joins("left join orders on orders.order_id = order_items.order_id")
.where("order_items.order_id=?",book_order.order)
return order_details
end
else
return false
end
end
private
def generate_custom_id
self.order_item_id = SeedGenerator.generate_id(self.class.name, "ODI")
self.order_items_id = SeedGenerator.generate_id(self.class.name, "ODI")
end
end

View File

@@ -26,21 +26,21 @@ class Printer::OrderQueuePrinter < Printer::PrinterWorker
def print_query(type, code)
if type == 'order_item'
OrderItem.select("order_items.item_code, order_items.item_name, order_items.qty, order_items.price, order_items.item_order_by as order_by, order_items.created_at as order_at, cus.name as customer, df.name as dining")
.joins("left join orders ON orders.id = order_items.order_id
.joins("left join orders ON orders.order_id = order_items.order_id
left join booking_orders AS bo ON bo.order_id=order_items.order_id
left join bookings AS b ON b.id = bo.booking_id
left join bookings AS b ON b.booking_id = bo.booking_id
left join dining_facilities AS df ON df.id = b.dining_facility_id
left join customers as cus ON cus.id = orders.customer_id")
.where("order_items.item_code=" + code)
left join customers as cus ON cus.customer_id = orders.customer_id")
.where("order_items.item_code='" + code + "'")
.group("order_items.item_code")
else
OrderItem.select("order_items.item_code, order_items.item_name, order_items.qty, order_items.price, order_items.item_order_by as order_by, order_items.created_at as order_at, cus.name as customer, df.name as dining")
.joins("left join orders ON orders.id = order_items.order_id
.joins("left join orders ON orders.order_id = order_items.order_id
left join booking_orders AS bo ON bo.order_id=order_items.order_id
left join bookings AS b ON b.id = bo.booking_id
left join bookings AS b ON b.booking_id = bo.booking_id
left join dining_facilities AS df ON df.id = b.dining_facility_id
left join customers as cus ON cus.id = orders.customer_id")
.where("orders.id=" + code.to_s)
left join customers as cus ON cus.customer_id = orders.customer_id")
.where("orders.order_id='" + code.to_s + "'")
.group("order_items.item_code")
end

View File

@@ -64,12 +64,12 @@ class Printer::ReceiptPrinter < Printer::PrinterWorker
self.print(filename)
end
#Bill Receipt Print
def print_receipt_bill(printer_settings,sale_items,sale)
def print_receipt_bill(printer_settings,sale_items,sale,sale_data)
#Use CUPS service
#Generate PDF
#Print
pdf = ReceiptBillPdf.new(printer_settings,sale_items,sale)
pdf.render_file "tmp/receipt_bill_#{sale.id}.pdf"
self.print("tmp/receipt_bill_#{sale.id}.pdf")
pdf = ReceiptBillPdf.new(printer_settings,sale_items,sale,sale_data)
pdf.render_file "tmp/receipt_bill.pdf"
self.print("tmp/receipt_bill.pdf")
end
end

View File

@@ -1,5 +1,8 @@
class Sale < ApplicationRecord
self.primary_key = "sale_id"
#primary key - need to be unique generated for multiple shops
before_create :generate_custom_id
#before_create :generate_receipt_no
belongs_to :cashier, :optional => true
@@ -22,18 +25,19 @@ class Sale < ApplicationRecord
#get all order attached to this booking and combine into 1 invoice
booking.booking_orders.each do |order|
if booking.sale_id
status, sale_id = generate_invoice_from_order(order.order_id, nil, requested_by)
status, sale_id = generate_invoice_from_order(order.order_id, nil, booking, requested_by)
else
status, sale_id = generate_invoice_from_order(order.order_id, booking.sale_id, requested_by)
status, sale_id = generate_invoice_from_order(order.order_id, booking.sale_id, booking, requested_by)
end
booking.sale_id = sale_id
end
order = booking.booking_orders.take.order
link_order_sale(order.id)
return status
end
end
def generate_invoice_from_order (order_id, sale_id, requested_by)
def generate_invoice_from_order (order_id, sale_id, booking, requested_by)
taxable = true
#if sale_id is exsit and validate
#add order to that invoice
@@ -64,8 +68,8 @@ class Sale < ApplicationRecord
add_item(item)
end
link_order_sale(order.id)
link_order_sale(order.id)
end
@@ -75,6 +79,11 @@ class Sale < ApplicationRecord
#Update the order items that is billed
order.update_items_status_to_billed(nil)
order.status = "billed"
order.save
booking.sale_id = self.id
booking.save
return true, self.id
end

View File

@@ -1,5 +1,8 @@
class SaleAudit < ApplicationRecord
#primary key - need to be unique generated for multiple shops
self.primary_key = "sale_audit_id"
#primary key - need to be unique generated for SaleAudit
before_create :generate_custom_id
belongs_to :sale

View File

@@ -1,4 +1,6 @@
class SaleItem < ApplicationRecord
self.primary_key = "sale_item_id"
#primary key - need to be unique generated for multiple shops
before_create :generate_custom_id
@@ -8,8 +10,24 @@ class SaleItem < ApplicationRecord
def compute_item
end
def self.get_order_items_details(sale_id)
sale_orders = SaleOrder.where("sale_id=?",sale_id)
if sale_orders
sale_orders.each do |sale_order|
order_details = SaleItem.select("sales.total_discount as discount_amount,DATE_FORMAT(sales.receipt_date,'%Y-%m-%d %h:%m') as receipt_date,sales.cashier_name,sales.receipt_no,sale_items.product_name as item_name,sale_items.qty,sale_items.price,sale_items.unit_price as total_price")
.joins("left join sales on sales.id = sale_items.sale_id")
.where("sale_items.sale_id=?",sale_order.sale_id)
return order_details
end
else
return false
end
end
private
def generate_custom_id
self.sale_item_id = SeedGenerator.generate_id(self.class.name, "SLI")
end
end

View File

@@ -1,5 +1,7 @@
class SaleOrder < ApplicationRecord
#primary key - need to be unique generated for multiple shops
self.primary_key = "sale_order_id"
#primary key - need to be unique generated for multiple shops
before_create :generate_custom_id
belongs_to :sale

View File

@@ -1,4 +1,6 @@
class SalePayment < ApplicationRecord
self.primary_key = "sale_payment_id"
#primary key - need to be unique generated for multiple shops
before_create :generate_custom_id

View File

@@ -1,5 +1,7 @@
class SaleTax < ApplicationRecord
#primary key - need to be unique generated for multiple shops
self.primary_key = "sale_tax_id"
#primary key - need to be unique generated for multiple shops
before_create :generate_custom_id
belongs_to :sale

View File

@@ -14,9 +14,11 @@ class SeedGenerator < ApplicationRecord
seed.current = current_no
seed.save
end
padding_len = 16 - prefix.len
return prefix +"-"+ seed.current.to_s.to_s.rjust((16-prefix.length)+1,'0')
padding_len = 15 - prefix.length
return prefix +"-"+ seed.current.to_s.to_s.rjust((14-prefix.length)+1,'0')
end
def self.new_receipt_no

View File

@@ -1,11 +1,11 @@
class ReceiptBillPdf < Prawn::Document
attr_accessor :receipt_width,:price_column_width,:p_width, :page_height, :margin, :price_width, :item_width, :header_font_size, :item_font_size,:item_height,:qty_column_width,:item_description_width
def initialize(printer_settings, sale_items,sale)
def initialize(printer_settings, sale_items,sale, sale_data)
self.p_width = 200
self.page_height = 1450
self.margin = 10
# self.price_width = self.p_width / 2
self.price_width=90
self.price_width=80
self.item_width = self.p_width - self.price_width
self.item_height = self.item_height
self.qty_column_width = self.p_width / 2
@@ -14,7 +14,7 @@ class ReceiptBillPdf < Prawn::Document
@item_width = self.p_width.to_i / 2
@qty_width = @item_width.to_i / 3
@double = @qty_width * 2
@double = @qty_width * 1.3
@half_qty = @qty_width / 2
#setting page margin and width
super(:margin => [self.margin, self.margin, self.margin, self.margin], :page_size => [self.p_width, self.page_height])
@@ -23,8 +23,9 @@ class ReceiptBillPdf < Prawn::Document
header( printer_settings.printer_name, printer_settings.name)
stroke_horizontal_rule
cashier_info(sale.receipt_no,sale.customer.name, sale.receipt_date)
cashier_info(sale.receipt_no,sale.customer, sale.receipt_date)
line_items(sale_items)
all_total(sale_data)
end
@@ -89,7 +90,6 @@ class ReceiptBillPdf < Prawn::Document
text_box "Items", :at =>[0,y_position], :width => @item_width.to_i - @half_qty.to_i , :height =>15, :overflow => :shrink_to_fix, :size => self.item_font_size
text_box "Price", :at =>[@item_width.to_i - @half_qty.to_i,y_position], :width => @qty_width, :height =>15, :overflow => :shrink_to_fix, :size => self.item_font_size, :align => :right
text_box "Qty", :at =>[@item_width.to_i-@qty_width,y_position], :width => @half_qty, :height =>15, :overflow => :shrink_to_fix, :size => self.item_font_size, :align => :right
text_box "Discount", :at =>[@item_width.to_i + @half_qty.to_i,y_position], :width => @qty_width, :height =>15, :overflow => :shrink_to_fix, :size => self.item_font_size, :align => :right
text_box "Total", :at =>[@item_width.to_i + @half_qty.to_i,y_position], :width => @double, :height =>15, :overflow => :shrink_to_fix, :size => self.item_font_size, :align => :right
}
@@ -98,13 +98,80 @@ class ReceiptBillPdf < Prawn::Document
stroke_horizontal_rule
add_line_item_row(sale_items)
stroke_horizontal_rule
end
def add_line_item_row(sale_items)
y_position = cursor
move_down 5
y_position = cursor
move_down 5
sub_total = 0.0
sale_items.each do |item|
sub_total += item.qty*item.unit_price
qty = item.qty
total_price = item.qty*item.unit_price
price = item.unit_price
product_name = item.product_name
y_position = cursor
pad_top(15) {
# @item_width.to_i + @half_qty.to_i
text_box "#{product_name}", :at =>[0,y_position], :width => @item_width.to_i - @half_qty.to_i , :height =>15, :overflow => :shrink_to_fix, :size => self.item_font_size
text_box "#{price}", :at =>[@item_width.to_i - @half_qty.to_i,y_position], :width => @qty_width, :height =>15, :overflow => :shrink_to_fix, :size => self.item_font_size, :align => :right
text_box "#{qty.to_i}", :at =>[@item_width.to_i-@qty_width,y_position], :width => @half_qty, :height =>15, :overflow => :shrink_to_fix, :size => self.item_font_size, :align => :right
text_box "#{total_price}", :at =>[@item_width.to_i + @half_qty.to_i,y_position], :width => @double, :height =>15, :overflow => :shrink_to_fix, :size => self.item_font_size, :align => :right
}
move_down 3
end
stroke_horizontal_rule
move_down 5
y_position = cursor
bounding_box([0,y_position], :width =>self.price_width, :height => self.item_height) do
text "Sub Total", :size => self.item_font_size,:align => :left
end
bounding_box([self.price_width,y_position], :width =>self.price_width) do
text "#{sub_total}" , :size => self.item_font_size,:align => :right
end
end
def all_total(sale_data)
move_down 5
y_position =cursor
bounding_box([0,y_position], :width =>self.price_width, :height => self.item_height) do
text "Discount", :size => self.item_font_size,:align => :left
end
bounding_box([self.price_width,y_position], :width =>self.price_width) do
text "( " +"#{sale_data.total_discount}" +" )" , :size => self.item_font_size,:align => :right
end
move_down 5
y_position =cursor
bounding_box([0,y_position], :width =>self.price_width, :height => self.item_height) do
text "Total Tax", :size => self.item_font_size,:align => :left
end
bounding_box([self.price_width,y_position], :width =>self.price_width) do
text "( " +"#{sale_data.total_tax}" +" )" , :size => self.item_font_size,:align => :right
end
move_down 5
y_position = cursor
move_down 5
bounding_box([0,y_position], :width =>self.price_width, :height => self.item_height) do
text "Grand Total", :size => self.item_font_size,:align => :left
end
bounding_box([self.price_width,y_position], :width =>self.price_width) do
text "#{sale_data.grand_total}" , :size => self.item_font_size,:align => :right
end
move_down 5
# stroke_horizontal_rule
end
end

View File

@@ -1,5 +1,5 @@
if (@booking)
json.id @booking.id
json.id @booking.booking_id
json.status @booking.booking_status
json.checkin_at @booking.checkin_at
json.checkin_by @booking.checkin_by
@@ -12,7 +12,8 @@ if (@booking)
end
@total_amount = 0.00
@total_tax = 0.00
@booking_orders = BookingOrder.where("booking_id = #{@booking.booking_id}").all;
if @booking.booking_orders
order_items = []
@booking.booking_orders.each do |bo|

View File

@@ -1,4 +1,5 @@
<%= simple_form_for(@crm_customer) do |f| %>
<%= simple_form_for([:crm,@crm_customer]) do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
@@ -7,7 +8,7 @@
<%= f.input :contact_no %>
<%= f.input :email %>
<%= f.input :date_of_birth %>
<%= f.association :membership %>
<%= f.input :membership_type %>
<%= f.input :membership_authentication_code %>
</div>

View File

@@ -2,5 +2,5 @@
<%= render 'form', crm_customer: @crm_customer %>
<%= link_to 'Show', @crm_customer %> |
<%= link_to 'Show', @crm_customers_path %> |
<%= link_to 'Back', crm_customers_path %>

View File

@@ -25,12 +25,12 @@
<td><%= crm_customer.contact_no %></td>
<td><%= crm_customer.email %></td>
<td><%= crm_customer.date_of_birth %></td>
<td><%= crm_customer.membership %></td>
<td><%= crm_customer.membership_id %></td>
<td><%= crm_customer.membership_type %></td>
<td><%= crm_customer.membership_authentication_code %></td>
<td><%= link_to 'Show', crm_customer %></td>
<td><%= link_to 'Show', crm_customer_path(crm_customer) %></td>
<td><%= link_to 'Edit', edit_crm_customer_path(crm_customer) %></td>
<td><%= link_to 'Destroy', crm_customer, method: :delete, data: { confirm: 'Are you sure?' } %></td>
<td><%= link_to 'Destroy', crm_customer_path(crm_customer), method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>

View File

@@ -4,7 +4,7 @@
<% @i = 0 %>
<% @booking.each do |booking| %>
<% if booking.booking_status == "new" %>
<% if booking.booking_status == "assign" %>
<div class="card">
<div class="card-block booking_click" data-ref="<%= api_booking_path booking.id%>" id="card-block booking_block" style="width:100%;">
<h4 class="card-title">
@@ -40,7 +40,7 @@ $(function(){
$(".summary-items tbody tr").remove();
$("#cancel").removeAttr("disabled");
$("#assign").removeAttr("disabled");
var url = $(this).attr('data-ref');
var url = $(this).attr('data-ref');alert(url);
show_details(url);
});

View File

@@ -29,9 +29,4 @@
</div>
<% end %>
<% end %>
</div>

View File

@@ -61,7 +61,7 @@
</small>
</p>
<p class="hidden order-customer"><%= qid.customer_name %></p>
<p class="hidden assigned-order-item"><%= qid.id %></p>
<p class="hidden assigned-order-item"><%= qid.assigned_order_item_id %></p>
</div>
<!-- <div class="card-footer">
<button id=<%= 'assigned_queue_' + qid.id.to_s %> class="btn btn-primary btn-lg btn-block order-complete">COMPLETE</button>
@@ -112,10 +112,10 @@
</p>
<!-- Hidden Fields for Items -->
<p class="hidden order-customer"><%= qid.customer_name %></p>
<p class="hidden assigned-order-item"><%= qid.id %></p>
<p class="hidden assigned-order-item"><%= qid.assigned_order_item_id %></p>
</div>
<div class="card-footer">
<button id=<%= 'assigned_queue_' + qid.id.to_s %> class="btn btn-primary btn-lg btn-block order-complete">COMPLETE</button>
<button id=<%= 'assigned_queue_' + qid.assigned_order_item_id.to_s %> class="btn btn-primary btn-lg btn-block order-complete">COMPLETE</button>
</div>
</div>
<%

View File

@@ -22,34 +22,58 @@
<div class="tab-pane active" id="tables" role="tabpanel">
<!--- Booking Items -->
<div class="card-columns" style="padding-top:10px">
<% if @order_table %>
<% @order_table.each do |order_table| %>
<div class="card" id="table-order-<%=order_table.order_id%>" onclick="callOrderDetails('<%=order_table.order_id%>')">
<div class="card-block">
<h4 class="card-title"><span id="table-name-<%=order_table.order_id%>" class="table-name"><%=order_table.table_name%></span></h4>
<p class="card-text"><%=order_table.total_price%></p>
</div>
</div>
<% if @booking_orders %>
<% @booking_orders.each do |booking_order| %>
<% if !booking_order.order_status = 'new'%>
<div style="background-color: red;color: white;" class="card" id="table-order-<%=booking_order.sale_id%>" onclick="callOrderDetails('sale_<%=booking_order.sale_id%>')">
<div class="card-block">
<h4 class="card-title">
<span id="table-name-<%=booking_order.sale_id%>" class="table-name"><%=booking_order.table_name%></span></h4>
<span>Receipt No : <%=booking_order.receipt_no%></span><br/>
<span>Order Status : <%=booking_order.order_status %></span>
</div>
</div>
<% else %>
<div class="card" id="table-order-<%=booking_order.id%>" onclick="callOrderDetails('order_<%=booking_order.id%>')">
<div class="card-block">
<h4 class="card-title"><span id="table-name-<%=booking_order.id%>" class="table-name"><%=booking_order.table_name%></span></h4>
<span>Order Status : <%=booking_order.order_status %></span>
</div>
</div>
<% end %>
<%end %>
<%end %>
</div>
</div>
<!-- Panel 1 - Tables - End -->
<!-- Panel 2 - Rooms -->
<div class="tab-pane" id="rooms" role="tabpanel" style="min-height:670px; max-height:670px; overflow-y:scroll">
<!--- Booking Items -->
<div class="card-columns" style="padding-top:10px">
<% @order_rooms.each do |order_room| %>
<div class="card" id="table-order-<%=order_room.order_id%>" onclick="callOrderDetails('<%=order_room.order_id%>')">
<div class="card-block">
<% tablename = order_room.room_name%>
<h4 class="card-title"><span id="table-name-<%=order_room.order_id%>" class="table-name"><%=order_room.room_name%></span></h4>
<p class="card-text"><%=order_room.total_price%></p>
</div>
</div>
<% if @booking_rooms %>
<% @booking_rooms.each do |booking_room| %>
<% if !booking_room.order_status = 'new'%>
<div style="background-color: red;color: white;" class="card" id="table-order-<%=booking_room.id%>" onclick="callOrderDetails('sale_<%=booking_room.id%>')">
<div class="card-block">
<h4 class="card-title">
<span id="table-name-<%=booking_room.id%>" class="table-name"><%=booking_room.room_name%></span></h4>
<span>Receipt No : <%=booking_room.receipt_no%></span><br/>
<span>Order Status : <%=booking_room.order_status %></span>
</div>
</div>
<% else %>
<div class="card" id="table-order-<%=booking_room.id%>" onclick="callOrderDetails('order_<%=booking_room.id%>')">
<div class="card-block">
<h4 class="card-title"><span id="table-name-<%=booking_room.id%>" class="table-name"><%=booking_room.room_name%>ddd</span></h4> \
<span>Order Status : <%=booking_room.order_status %></span>
</div>
</div>
<% end %>
<%end %>
<%end %>
</div>
@@ -60,15 +84,30 @@
<!--- Booking Items -->
<div class="card-columns" style="padding-top:10px">
<% @orders.each do |order| %>
<div class="card" id="table-order-<%=order.order_id%>" onclick="callOrderDetails('<%=order.order_id%>')">
<div class="card-block">
<h4 class="card-title"><span id="table-name-<%=order.order_id%>" class="table-name"><%=order.table_or_room_name%></span></h4>
<p class="card-text"><%=order.total_price%></p>
</div>
</div>
<% if @orders %>
<% @orders.each do |order| %>
<% if !order.order_status = 'new'%>
<div style="background-color: green;color: white;" class="card" id="table-order-<%=order.order_id%>" onclick="callOrderDetails('sale_<%=order.order_id%>')">
<div class="card-block">
<h4 class="card-title">
<span id="table-name-<%=order.order_id%>" class="table-name">Order No:<%=order.order_id%></span></h4>
<span>Receipt No : <%=order.receipt_no%></span><br/>
<span>Order Status : <%=order.order_status %></span>
</div>
</div>
<% else %>
<div class="card" id="table-order-<%=order.order_id%>" onclick="callOrderDetails('order_<%=order.order_id%>')">
<div class="card-block">
<h4 class="card-title"><span id="table-name-<%=order.order_id%>" class="table-name">Order No:<%=order.order_id%></span></h4>
<span>Order Status : <%=order.order_status %></span>
</div>
</div>
<% end %>
<%end %>
<%end %>
</div>
@@ -83,7 +122,9 @@
<div class="col-lg-5 col-md-5 col-sm-3">
<div class="card" >
<div class="card-header">
<div id="order-title"><strong>ORDER DETAILS</strong> <span id="order-detail-header"></span></div>
<div id="order-title"><strong><span id="receipt-no">ORDER DETAILS</span></strong>
<strong><span id ="receipt-date" style="margin-left: 20%"></span></strong></div><br/>
<div ><strong><span id="cashier-name"></span></strong><strong><span style="margin-left: 36%" id="order-detail-header"></span></strong></div>
</div>
<div class="card-block">
<div class="card-title">
@@ -110,8 +151,8 @@
<td style="width:20%; text-align:right">
<span id="item-total-price"></span>
</td>
</tr>
</tr>
</tbody>
</table>
</div>
@@ -122,6 +163,18 @@
<td style="width:80%; text-align:left; border-top:none"><strong>Sub Total</strong></td>
<td style="width:20%; text-align:right; border-top:none"><strong><span id="sub-total"></span></strong></td>
</tr>
<tr>
<td style="width:80%; text-align:left; border-top:none"><strong><span id="discount-header"></strong></td>
<td style="width:20%; text-align:right; border-top:none"><strong><span id="discount_amount"></span></strong></td>
</tr>
<tr>
<td style="width:80%; text-align:left; border-top:none"><strong><span id="tax-header"></strong></td>
<td style="width:20%; text-align:right; border-top:none"><strong><span id="tax_amount"></span></strong></td>
</tr>
<tr>
<td style="width:80%; text-align:left; border-top:none"><strong><span id="grand-total-header"></strong></td>
<td style="width:20%; text-align:right; border-top:none"><strong><span id="grand_total_amount"></span></strong></td>
</tr>
</tfooter>
</table>
</div>
@@ -138,72 +191,136 @@
<button type="button" class="btn btn-primary btn-lg btn-block" disabled>Customer</button>
<!-- <button type="button" class="btn btn-primary btn-lg btn-block" disabled>Req.Bill</button> -->
<button type="button" id="request_bills" class="btn btn-primary btn-lg btn-block">
Req.Bill
</button>
Req.Bill
</button>
<!-- Cashier Buttons -->
<button type="button" class="btn btn-primary btn-lg btn-block" disabled>Discount</button>
<button type="button" class="btn btn-primary btn-lg btn-block" disabled>Tax</button>
<button type="button" class="btn btn-primary btn-lg btn-block" disabled>Pay</button>
<button type="button" id="pay" class="btn btn-primary btn-lg btn-block" >Pay</button>
<button type="button" class="btn btn-primary btn-lg btn-block" disabled>Re.Print</button>
</div>
</div>
<script>
<script>
var old_order_id = 0
var old_table_name = ""
var old_table_name = ""
var table_or_order_id = 0
function callOrderDetails(order_id){
table_or_order_id = order_id
$("#test").html(order_id)
function callOrderDetails(sale_order_id){
var order_id = 0
var data_val = ""
sale_order = sale_order_id.split("_")[0]
if (sale_order == 'sale') {
order_id = sale_order_id.split("_")[1]
url = "origami/"+sale_order_id.split("_")[1]
data_val = { sale_id: sale_order_id.split("_")[1]}
}else{
order_id = sale_order_id.split("_")[1]
url = "origami/"+order_id
data_val = { order_id: sale_order_id.split("_")[1]}
}
table_or_order_id = order_id
var tbody = ""
$("#append-table").html("")
if (old_order_id != order_id){
$("#table-order-"+old_order_id).removeClass("selected_color")
$("#table-order-"+order_id).addClass("selected_color")
old_order_id = order_id
$("#table-order-"+old_order_id).removeClass("selected_color")
$("#table-order-"+order_id).addClass("selected_color")
old_order_id = order_id
}
$("#order-detail-header").html("")
$("#order-detail-header").append(document.getElementById("table-name-"+order_id).innerHTML)
$("#order-detail-header").html("")
$("#order-detail-header").append("Table Name : "+document.getElementById("table-name-"+order_id).innerHTML)
$("#sub-total").html("")
url = "origami/"+order_id
$.ajax({type: "GET",
url: url,
data: { order_id: order_id},
success:function(result){
data: data_val,
success:function(result){
var sub_total = 0
for (i = 0; i < result.length; i++) {
var discount_amount = 0
var receipt_no = ""
var cashier_name = ""
var receipt_date = ""
var tax_amount = 0
var grand_total_amount = 0
row = "<tbody>"
for (i = 0; i < result.length; i++) {
var data = JSON.stringify(result[i]);
var parse_data = JSON.parse(data)
var parse_data = JSON.parse(data)
sub_total += (parse_data.qty*parse_data.price)
row = '<tbody><tr><td style="width:60%; text-align:left"><span id="item-name-price">'+parse_data.item_name+"@"+(parse_data.price*1)+'</span></td>'
row = '<tr><td style="width:60%; text-align:left"><span id="item-name-price">'+parse_data.item_name+"@"+(parse_data.price*1)+'</span></td>'
+'<td style="width:20%; text-align:right"><span id="item-qty">'+(parse_data.qty*1)+'</span></td>s'
+'<td style="width:20%; text-align:right"><span id="item-total-price">'+(parse_data.qty*parse_data.price)+'</span></td>'
+'</tr></tbody>'
+'</tr>>'
tbody += row
discount_amount = result[i].discount_amount;
tax_amount = result[i].tax_amount;
grand_total_amount = result[i].grand_total_amount;
receipt_no = result[i].receipt_no;
cashier_name = result[i].cashier_name;
receipt_date = result[i].receipt_date;
}
row = "</tbody>"
$("#append-table").append(tbody)
$("#sub-total").append((sub_total)+"<br/>")
if (discount_amount > 0 ) {
$("#discount-header").html("(Discount)")
$("#discount_amount").html("("+discount_amount+")")
}
$("#append-table").append(tbody)
$("#sub-total").append((sub_total)+"<br/>")
if (tax_amount > 0 ) {
$("#tax-header").html("Tax")
$("#tax_amount").html(tax_amount)
}
if (grand_total_amount > 0 ) {
$("#grand-total-header").html("Grand Total")
$("#grand_total_amount").html(grand_total_amount)
}
if (cashier_name == null){
cashier_name = ""
}
if(receipt_no != null){
$("#receipt-no").html("Receipt No : "+receipt_no)
}
if (receipt_date != null) {
$("#receipt-date").html("Receipt Date : "+receipt_date);
}
if (cashier_name != null) {
$("#cashier-name").html("Cashier Name : "+cashier_name);
}
},
error:function(result){
// alert('error');
}
});
}
}
$( document ).ready(function() {
$('#request_bills').click(function() {
window.location.href = '/origami/request_bills/'+table_or_order_id;
window.location.href = '/origami/request_bills/'+ table_or_order_id
return false;
});
});
});
$( document ).ready(function() {
$('#pay').click(function() {
window.location.href = '/origami/sale/'+ 10 + "/payment"
return false;
});
});
</script>
<style type="text/css">
.selected_color{
color:white;
background-color: blue;
}
</style>
</style>

View File

@@ -1,9 +1,11 @@
<div class="row">
<div class="col-lg-5 col-md-5 col-sm-3">
<div class="card" >
<div class="card-header">
<div id="order-title">
<span><strong>Receipt No</strong> <% if @sale_data%>- <%=@sale_data.receipt_no%><% end %></span>
<span><strong>Receipt No : <%=@sale_data.receipt_no rescue ' '%></strong></span>
<span style="margin-left: 40%"><strong>Receipt Date : <%=@sale_data.receipt_date rescue '-'%></strong></span>
<span><strong>Table No</strong> <% if @sale_data%>- <%=@sale_data.receipt_no%><% end %></span>
</div>
</div>
@@ -23,8 +25,7 @@
<table class="table" id="append-table">
<tbody>
<% sub_total = 0 %>
<% if @sale_items %>
<% @sale_items.each do |sale_item| %>
<% @sale_data.sale_items.each do |sale_item| %>
<% sub_total += sale_item.qty*sale_item.unit_price%>
<tr>
<td style="width:60%; text-align:left">
@@ -36,9 +37,8 @@
<td style="width:20%; text-align:right">
<span id="item-total-price"><%=(sale_item.qty*sale_item.unit_price)%></span>
</td>
</tr>
</tr>
<%end %>
<%end %>
</tbody>
</table>
</div>
@@ -51,19 +51,129 @@
</tr>
<tr>
<td style="width:80%; text-align:left; border-top:none"><strong>(Discount)</strong></td>
<td style="width:20%; text-align:right; border-top:none"><strong><span>(<%=@sale_data.total_discount%>)</span></strong></td>
<td style="width:20%; text-align:right; border-top:none"><strong><span>(<%=@sale_data.total_discount rescue 0%>)</span></strong></td>
</tr>
<td style="width:80%; text-align:left; border-top:none"><strong>Tax</strong></td>
<td style="width:20%; text-align:right; border-top:none"><strong><span><%=@sale_data.total_tax%></span></strong></td>
<td style="width:20%; text-align:right; border-top:none"><strong><span><%=@sale_data.total_tax rescue 0%></span></strong></td>
</tr>
<td style="width:80%; text-align:left; border-top:none"><strong>Grand Total</strong></td>
<td style="width:20%; text-align:right; border-top:none"><strong><span><%=@sale_data.grand_total%></span></strong></td>
<td style="width:20%; text-align:right; border-top:none"><strong><span><%=@sale_data.grand_total rescue 0%></span></strong></td>
</tr>
</tfooter>
</table>
</div>
<div style='text-align:center;margin-top:20px'>
<INPUT TYPE="Button" class='btn btn-primary' VALUE="Reprint" onClick="" style='width:120px'/>
<INPUT TYPE="Submit" class='btn btn-primary' VALUE="CANCEL" action="origami/index" style='width:120px'/>
</div>
</div>
</div>
</div>
</div>
<div class="col-lg-5 col-md-5 col-sm-3">
<div class="row">
<div class="col-md-8">AMOUNT DUE</div>
<div class="col-md-4"><%= @sale_data.grand_total %></div>
</div>
<hr>
<div class="row">
<div class="col-md-8">CASH</div>
<div class="col-md-4">0.0</div>
</div>
<hr>
<div class="row">
<div class="col-md-8">CREDIT</div>
<div class="col-md-4">0.0</div>
</div>
<hr>
<div class="row">
<div class="col-md-8">CARD</div>
<div class="col-md-4">0.0</div>
</div>
<hr>
<div class="row">
<div class="col-md-8">BALANCE</div>
<div class="col-md-4">0.0</div>
</div>
<hr>
<div class="row">
<div class="col-md-12">
<div class="row">
<div class="col-md-7">
<div class="row">
<div class="col-md-3 cashier_number" data-value="1">1</div>
<div class="col-md-3 cashier_number">2</div>
<div class="col-md-3 cashier_number">3</div>
</div>
</div>
<div class="col-md-5">
<div class="col-md-12 cashier_number long">1000</div>
</div>
</div>
<div class="row">
<div class="col-md-7">
<div class="row">
<div class="col-md-3 cashier_number">4</div>
<div class="col-md-3 cashier_number">5</div>
<div class="col-md-3 cashier_number">6</div>
</div>
</div>
<div class="col-md-5">
<div class="col-md-12 cashier_number long">5000</div>
</div>
</div>
<div class="row">
<div class="col-md-7">
<div class="row">
<div class="col-md-3 cashier_number">7</div>
<div class="col-md-3 cashier_number">8</div>
<div class="col-md-3 cashier_number">9</div>
</div>
</div>
<div class="col-md-5">
<div class="col-md-12 cashier_number long">10000</div>
</div>
</div>
<div class="row">
<div class="col-md-7">
<div class="row">
<div class="col-md-3 cashier_number">0</div>
<div class="col-md-3 cashier_number">.</div>
<div class="col-md-3 cashier_number">00</div>
</div>
</div>
<div class="col-md-5">
<div class="col-md-12 cashier_number long">50000</div>
</div>
</div>
<div class="row">
<div class="col-md-7">
<div class="row">
<div class="col-md-3 cashier_number"></div>
<div class="col-md-3 cashier_number">DEL</div>
<div class="col-md-3 cashier_number">CLR</div>
</div>
</div>
<div class="col-md-5">
<div class="col-md-12 cashier_number long">ENTER</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
$(document).on('click', '.cashier_number', function(event){
event.stopPropagation();
event.preventDefault();
if(event.handled !== true) {
var input_value = $(this).attr("data-value");
switch (input_value) {
}
event.handled = true;
} else {
return false;
}
});
</script>

View File

@@ -33,7 +33,7 @@
<td><%= settings_menu_category.alt_name rescue ''%></td>
<td><%= settings_menu_category.order_by rescue ''%></td>
<td><%= settings_menu_category.parent.name rescue ''%></td>
<td><%= link_to 'Edit', edit_settings_menu_category_path(settings_menu_category) %> | <%= link_to 'Destroy', settings_menu_categories_path(settings_menu_category), method: :delete, data: { confirm: 'Are you sure?' } %></td></td>
<td><%= link_to 'Edit', edit_settings_menu_category_path(settings_menu_category) %> | <%= link_to 'Destroy', settings_menu_category_path(settings_menu_category), method: :delete, data: { confirm: 'Are you sure?' } %></td></td>
</tr>
<% end %>

View File

@@ -20,3 +20,5 @@
<%= f.button :submit %>
</div>
<% end %>

View File

@@ -10,8 +10,7 @@
<ul class="breadcrumb">
<li><a href="<%= root_path %>">Home</a></li>
<li><a href="<%= settings_menu_category_simple_menu_item_path(@category,@item) %>">Menu Category</a></li>
<li>Menu Item</li>
<li><a href="<%= settings_menu_category_simple_menu_item_path(@category,@item) %>">Menu Item</a></li>
<li>New Menu Item Instance</li>
</ul>
</div>

View File

@@ -3,8 +3,7 @@
<ul class="breadcrumb">
<li><a href="<%= root_path %>">Home</a></li>
<li><a href="<%= settings_menu_category_simple_menu_item_path(@category,@item) %>">Menu Category</a></li>
<li>Menu Item</li>
<li><a href="<%= settings_menu_category_simple_menu_item_path(@category,@item) %>">Menu Item</a></li>
<li>Menu Item Instances</li>
<span style="float: right">
@@ -52,50 +51,4 @@
</div>
</div>
<br>
<div class="card">
<div class="card-block">
<h4 class="card-title">Sub Menu Items </h4>
<table class="table">
<thead>
<tr>
<th>Item code</th>
<th>Name</th>
<th>Alt name</th>
<th>Type</th>
<th>Parent Item</th>
<th>Created by</th>
<th>Created at</th>
<th colspan="3"></th>
</tr>
</thead>
<tbody>
<% @sub_menu.each do |settings_menu_item| %>
<tr>
<td><%= settings_menu_item.item_code %></td>
<td><%= settings_menu_item.name %></td>
<td><%= settings_menu_item.alt_name %></td>
<td><%= settings_menu_item.type %></td>
<td><%= settings_menu_item.parent.name rescue "-" %></td>
<td><%= settings_menu_item.created_by %></td>
<td><%=l settings_menu_item.created_at, :format => :short %></td>
<% if settings_menu_item.type == "SimpleMenuItem" %>
<td><%= link_to 'Show', settings_menu_category_simple_menu_item_path(@category, settings_menu_item ) %></td>
<td><%= link_to 'Edit', edit_settings_menu_category_simple_menu_item_path(@category, settings_menu_item) %></td>
<td><%= link_to 'Destroy', settings_menu_category_simple_menu_item_path(@category, settings_menu_item ), method: :delete, data: { confirm: 'Are you sure?' } %></td>
<% else %>
<td><%= link_to 'Show', settings_menu_category_set_menu_item_path(@category, settings_menu_item ) %></td>
<td><%= link_to 'Edit', edit_settings_menu_category_set_menu_item_path(@category, settings_menu_item) %></td>
<td><%= link_to 'Destroy', settings_menu_category_set_menu_item_path(@category, settings_menu_item ), method: :delete, data: { confirm: 'Are you sure?' } %></td>
<% end %>
</tr>
<% end %>
</tbody>
</table>
</div>
</div>
<%= paginate @sub_menu, param_name: :page, :outer_window => 3 %>
</div>

View File

@@ -36,7 +36,8 @@
<td><%= settings_menu.created_by %></td>
<!-- <td><%=l settings_menu.created_at, format: :short %></td> -->
<td><%= settings_menu.created_at.utc.getlocal.strftime("%Y-%m-%d/%I:%M %p") %></td>
<td><%= link_to 'Edit', edit_settings_menu_path(settings_menu) %></td>
<td><%= link_to 'Edit', edit_settings_menu_path(settings_menu) %></td>
<td><%= link_to 'Destroy', settings_menu_path(settings_menu), method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>

View File

@@ -72,7 +72,8 @@ Rails.application.routes.draw do
resources :discounts, only: [:index,:new, :create ] #add discount type
resources :customers, only: [:index,:new, :create ] #add customer type
end
resources :request_bills, only: [:show]
resources :request_bills, only: [:show]
get 'sale/:sale_id/payment' => 'request_bills#show'
end
#--------- Waiter/Ordering Station ------------#
@@ -113,7 +114,7 @@ Rails.application.routes.draw do
#menu
resources :menus do
#menu_categories
resources :menu_categories, only: [:new, :create, :edit]
resources :menu_categories, only: [:new, :create, :edit,:delete]
end
#accounts

View File

@@ -1,7 +1,7 @@
class CreateCustomers < ActiveRecord::Migration[5.0]
def change
create_table :customers, :id => false, :primary_key => :customer_id do |t|
t.string :customer_id, :limit => 16, :null => false, :index => true, :unique => true #custom foreign_key to prevent conflict during sync
create_table :customers, :id => false do |t|
t.string :customer_id, :limit => 16, :primary_key => true #custom foreign_key to prevent conflict during sync
t.string :name, :null => false
t.string :company
t.string :contact_no

View File

@@ -1,7 +1,7 @@
class CreateOrders < ActiveRecord::Migration[5.0]
def change
create_table :orders, :id => false, :primary_key => :order_id do |t|
t.string :order_id, :limit => 16, :null => false, :index => true, :unique => true #custom foreign_key to prevent conflict during sync
create_table :orders, :id => false do |t|
t.string :order_id, :limit => 16, :primary_key => true #custom foreign_key to prevent conflict during sync
t.datetime :date, :null => false
t.string :source, :null => false, :default => "emenu"
t.string :order_type, :null => false, :default => "dine-in"

View File

@@ -1,7 +1,7 @@
class CreateOrderItems < ActiveRecord::Migration[5.0]
def change
create_table :order_items, :id => false, :primary_key => :order_items_id do |t|
t.string :order_items_id, :limit => 16, :null => false, :index => true, :unique => true #custom primary key - to ensure consistence for cloud syncing
create_table :order_items, :id => false do |t|
t.string :order_items_id, :limit => 16, :primary_key => true #custom primary key - to ensure consistence for cloud syncing
t.string :order_id, foreign_key: true, :null => false, :limit => 16
t.string :order_item_status, :null => false, :default => "new"
t.string :item_order_by #person who order this

View File

@@ -1,7 +1,7 @@
class CreateSales < ActiveRecord::Migration[5.0]
def change
create_table :sales, :id => false, :primary_key => :sale_id do |t|
t.string :sale_id, :limit => 16, :null => false, :index => true, :unique => true #custom primary key - to ensure consistence for cloud syncing
create_table :sales, :id => false do |t|
t.string :sale_id, :limit => 16, :primary_key => true #custom primary key - to ensure consistence for cloud syncing
t.integer :cashier_id, :index => true
t.string :cashier_name

View File

@@ -1,7 +1,7 @@
class CreateSaleItems < ActiveRecord::Migration[5.0]
def change
create_table :sale_items, :id => false, :primary_key => :sale_item_id do |t|
t.string :sale_item_id, :limit => 16, :null => false, :index => true, :unique => true #custom primary key - to ensure consistence for cloud syncing
create_table :sale_items, :id => false do |t|
t.string :sale_item_id, :limit => 16, :primary_key => true#custom primary key - to ensure consistence for cloud syncing
t.string :sale_id, foreign_key: true, :limit => 16
t.string :product_code, :null => false
t.string :product_name, :null => false

View File

@@ -1,7 +1,7 @@
class CreateSaleTaxes < ActiveRecord::Migration[5.0]
def change
create_table :sale_taxes, :id => false, :primary_key => :sale_tax_id do |t|
t.string :sale_tax_id, :limit => 16, :null => false, :index => true, :unique => true #custom primary key - to ensure consistence for cloud syncing
create_table :sale_taxes, :id => false do |t|
t.string :sale_tax_id, :limit => 16, :primary_key => true #custom primary key - to ensure consistence for cloud syncing
t.string :sale_id, foreign_key: true, :limit => 16
t.string :tax_name, :null => false

View File

@@ -1,7 +1,7 @@
class CreateSalePayments < ActiveRecord::Migration[5.0]
def change
create_table :sale_payments, :id => false, :primary_key => :sale_payment_id do |t|
t.string :sale_payment_id, :limit => 16, :null => false, :index => true, :unique => true #custom primary key - to ensure consistence for cloud syncing
create_table :sale_payments, :id => false do |t|
t.string :sale_payment_id, :limit => 16, :primary_key => true #custom primary key - to ensure consistence for cloud syncing
t.string :sale_id, foreign_key: true, :limit => 16
t.string :payment_method, :null => false, :default => "cash"

View File

@@ -1,10 +1,10 @@
class CreateSaleOrders < ActiveRecord::Migration[5.0]
def change
create_table :sale_orders, :id => false, :primary_key => :sale_order_id do |t|
t.string :sale_order_id, :limit => 16, :null => false, :index => true, :unique => true #custom primary key - to ensure consistence for cloud syncing
create_table :sale_orders, :id => false do |t|
t.primary_key :sale_order_id #custom primary key - to ensure consistence for cloud syncing
t.string :sale, foreign_key: true,:limit => 16
t.string :order, foreign_key: true, :limit => 16
t.string :sale_id, foreign_key: true,:limit => 16
t.string :order_id, foreign_key: true, :limit => 16
t.timestamps
end

View File

@@ -1,7 +1,7 @@
class CreateSaleAudits < ActiveRecord::Migration[5.0]
def change
create_table :sale_audits, :id => false, :primary_key => :sale_audit_id do |t|
t.string :sale_audit_id, :limit => 16, :null => false, :index => true, :unique => true #custom primary key - to ensure consistence for cloud syncing
create_table :sale_audits, :id => false do |t|
t.string :sale_audit_id, :limit => 16, :primary_key => true #custom primary key - to ensure consistence for cloud syncing
t.string :sale_id, foreign_key: true, :limit => 16
t.string :action, :null => false

View File

@@ -1,7 +1,7 @@
class CreateBookings < ActiveRecord::Migration[5.0]
def change
create_table :bookings, :id => false, :primary_key => :booking_id do |t|
t.string :booking_id, :limit => 16, :null => false, :index => true, :unique => true #custom primary key - to ensure consistence for cloud syncing
create_table :bookings, :id => false do |t|
t.string :booking_id, :limit => 16, :primary_key => true #custom primary key - to ensure consistence for cloud syncing
t.references :dining_facility, foreign_key: true
t.string :type, :null => false, :default => "Table"

View File

@@ -1,7 +1,7 @@
class CreateAssignedOrderItems < ActiveRecord::Migration[5.0]
def change
create_table :assigned_order_items, :id => false, :primary_key => :assigned_order_item_id do |t|
t.string :assigned_order_item_id, :limit => 16, :null => false, :index => true, :unique => true #custom primary key - to ensure consistence for cloud syncing
create_table :assigned_order_items, :id => false do |t|
t.string :assigned_order_item_id, :limit => 16, :primary_key => true #custom primary key - to ensure consistence for cloud syncing
t.string :item_code, :null => false, :index => true
t.references :order_queue_station, foreign_key: true
t.string :order_id, foreign_key: true, :limit => 16

View File

@@ -1,10 +1,10 @@
class CreateBookingOrders < ActiveRecord::Migration[5.0]
def change
create_table :booking_orders, :id => false, :primary_key => :booking_order_id do |t|
t.string :booking_order_id, :limit => 16, :null => false, :index => true, :unique => true #custom primary key - to ensure consistence for cloud syncing
t.string :booking, foreign_key: true, :limit => 16
t.string :order, foreign_key: true, :limit => 16
create_table :booking_orders, :id => false do |t|
#t.string :booking_order_id, :limit => 16, :null => false, :index => true, :unique => true #custom primary key - to ensure consistence for cloud syncing
t.primary_key :booking_order_id
t.string :booking_id, foreign_key: true, :limit => 16
t.string :order_id, foreign_key: true, :limit => 16
t.timestamps
end

View File

@@ -133,3 +133,7 @@ zone_queue_station = OrderQueueProcessByZone.create({order_queue_station: zone_o
#Create Adminstrator employee
admin_employee = Employee.create({name: "Administrator", role: "Administrator", password: "99999", emp_id:"999", created_by: "SYSTEM DEFAULT"})
#Account for Menu Item Type (eg: Food, Beverage)
food = Account.create({title: "Food", account_type: "0"})
beverage = Account.create({title: "Beverage", account_type: "1"})

View File

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

View File

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