Merge branch 'august_spring' of bitbucket.org:code2lab/sxrestaurant

This commit is contained in:
Yan
2017-08-17 13:50:24 +06:30
29 changed files with 536 additions and 7 deletions

View File

@@ -97,6 +97,6 @@ class Settings::DiningChargesController < ApplicationController
# Never trust parameters from the scary internet, only allow the white list through.
def dining_charge_params
# params.fetch(:dining_charge, {})
params.require(:dining_charge).permit(:item_code, :unit_price, :taxable, :charge_type,:minimum_free_time ,:charge_block,:time_rounding,:time_rounding_block, :zone_id)
params.require(:dining_charge).permit(:item_code, :unit_price, :taxable, :charge_type,:minimum_free_time ,:charge_block,:time_rounding,:time_rounding_block, :zone_id, :time_rounding_block_price)
end
end

View File

@@ -0,0 +1,76 @@
class Settings::ProductsController < ApplicationController
before_action :set_settings_product, only: [:show, :edit, :update, :destroy]
# GET /settings/products
# GET /settings/products.json
def index
@settings_products = Product.all
end
# GET /settings/products/1
# GET /settings/products/1.json
def show
end
# GET /settings/products/new
def new
@settings_product = Product.new
end
# GET /settings/products/1/edit
def edit
end
# POST /settings/products
# POST /settings/products.json
def create
@settings_product = Product.new(settings_product_params)
@settings_product.created_by = current_user.name
respond_to do |format|
if @settings_product.save
format.html { redirect_to settings_products_path, notice: 'Product was successfully created.' }
format.json { render :show, status: :created, location: @settings_product }
else
format.html { render :new }
format.json { render json: @settings_product.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /settings/products/1
# PATCH/PUT /settings/products/1.json
def update
respond_to do |format|
if @settings_product.update(settings_product_params)
format.html { redirect_to settings_product_path, notice: 'Product was successfully updated.' }
format.json { render :show, status: :ok, location: @settings_product }
else
format.html { render :edit }
format.json { render json: @settings_product.errors, status: :unprocessable_entity }
end
end
end
# DELETE /settings/products/1
# DELETE /settings/products/1.json
def destroy
@settings_product.destroy
respond_to do |format|
format.html { redirect_to settings_products_path, notice: 'Product was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_settings_product
@settings_product = Product.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def settings_product_params
params.require(:product).permit(:item_code, :name, :alt_name, :unit_price, :image_path, :description, :information, :taxable,:created_by)
end
end

View File

@@ -0,0 +1,76 @@
class Settings::PromotionsController < ApplicationController
before_action :set_promotion, only: [:show, :edit, :update, :destroy]
# GET /promotions
# GET /promotions.json
def index
@promotions = Promotion.all
end
# GET /promotions/1
# GET /promotions/1.json
def show
end
# GET /promotions/new
def new
@promotion = Promotion.new
@promotion.promo_start_date = DateTime.now
@promotion.promo_end_date = DateTime.now
end
# GET /promotions/1/edit
def edit
end
# POST /promotions
# POST /promotions.json
def create
@promotion = Promotion.new(promotion_params)
@promotion.created_by = current_login_employee.id
respond_to do |format|
if @promotion.save
format.html { redirect_to settings_promotions_path, notice: 'Promotion was successfully created.' }
format.json { render :show, status: :created, location: @promotion }
else
format.html { render :new }
format.json { render json: @promotion.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /promotions/1
# PATCH/PUT /promotions/1.json
def update
respond_to do |format|
if @promotion.update(promotion_params)
format.html { redirect_to settings_promotions_path, notice: 'Promotion was successfully updated.' }
format.json { render :show, status: :ok, location: @promotion }
else
format.html { render :edit }
format.json { render json: @promotion.errors, status: :unprocessable_entity }
end
end
end
# DELETE /promotions/1
# DELETE /promotions/1.json
def destroy
@promotion.destroy
respond_to do |format|
format.html { redirect_to settings_promotions_path, notice: 'Promotion was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_promotion
@promotion = Promotion.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def promotion_params
params.require(:promotion).permit(:promo_code, :promo_start_date, :promo_end_date, :promo_start_hour,:promo_end_hour ,:promo_day, :promo_type,:original_product ,:min_qty ,:created_by)
end
end

View File

@@ -0,0 +1,2 @@
module Settings::PromotionsHelper
end

3
app/models/product.rb Normal file
View File

@@ -0,0 +1,3 @@
class Product < ApplicationRecord
validates_presence_of :name
end

2
app/models/promotion.rb Normal file
View File

@@ -0,0 +1,2 @@
class Promotion < ApplicationRecord
end

View File

@@ -30,6 +30,9 @@
<li><%= link_to "Employees", settings_employees_path, :tabindex =>"-1" %></li>
<hr class="hr_advance" />
<li><%= link_to "Accounts", settings_accounts_path, :tabindex =>"-1" %></li>
<hr class="hr_advance" />
<li><%= link_to "Promotion", settings_promotions_path, :tabindex =>"-1" %></li>]
<li><%= link_to "Products", settings_products_path, :tabindex =>"-1" %></li>
</ul>
</li>

View File

@@ -3,13 +3,14 @@
<div class="form-inputs">
<%= f.input :item_code, :input_html => { :id => 'item_code' } %>
<%= f.input :unit_price %>
<%= f.input :unit_price, :input_html => { :id => 'unit_price'} %>
<%= f.input :taxable %>
<%= f.input :charge_type, :collection => [:hr, :day] %>
<%= f.input :minimum_free_time %>
<%= f.input :charge_block %>
<%= f.input :charge_block, :input_html => { :id => 'charge_block'} %>
<%= f.input :time_rounding %>
<%= f.input :time_rounding_block %>
<%= f.input :time_rounding_block, :input_html => { :id => 'time_rounding_block'} %>
<%= f.input :time_rounding_block_price, :input_html => { :id => 'time_rounding_block_price'} %>
</div>
<div class="form-actions">
@@ -17,3 +18,39 @@
</div>
<% end %>
<script>
function price(){
var unit_price = $("#unit_price").val();
var hour1 = $("select[name='dining_charge[time_rounding_block(4i)]']").val();
var min1 = $("select[name='dining_charge[time_rounding_block(5i)]']").val();
var time1=(parseInt(hour1)*60)+parseInt(min1);
var hour2 = $("select[name='dining_charge[charge_block(4i)]']").val();
var min2 = $("select[name='dining_charge[charge_block(5i)]']").val();
var time2=(parseInt(hour2)*60)+parseInt(min2);
var result=(unit_price*time1)/time2;
$("#time_rounding_block_price").val(result);
// return result;
}
$( "#unit_price" ).change(function() {
price();
});
$( "select[name='dining_charge[time_rounding_block(4i)]']" ).change(function() {
price();
});
$( "select[name='dining_charge[time_rounding_block(5i)]']" ).change(function() {
price();
});
$( "select[name='dining_charge[charge_block(4i)]']" ).change(function() {
price();
});
$( "select[name='dining_charge[charge_block(5i)]']" ).change(function() {
price();
});
</script>

View File

@@ -16,8 +16,9 @@
</div>
<%= render 'form', dining_charge: @dining_charge %>
</div>
<script>
function randomNumber(len) {
function randomNumber(len) {
var randomNumber;
var n = '';
@@ -27,6 +28,5 @@ function randomNumber(len) {
}
return n;
}
document.getElementById("item_code").value = "<%= @zone.id %>"+"<%= @settings_dining_facility.id %>"+"_"+randomNumber(5);
document.getElementById("item_code").value = "<%= @zone.id %>"+"<%= @settings_dining_facility.id %>"+"_"+randomNumber(5);
</script>

View File

@@ -0,0 +1,18 @@
<%= simple_form_for([:settings,@settings_product]) do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<%= f.input :item_code, :input_html => { :id => 'item_code' } %>
<%= f.input :name %>
<%= f.input :alt_name %>
<%= f.input :unit_price %>
<%= f.input :image_path %>
<%= f.input :description %>
<%= f.input :information %>
<label><%= f.check_box :taxable %>Taxable</label>
</div>
<div class="form-actions">
<%= f.button :submit %>
</div>
<% end %>

View File

@@ -0,0 +1,2 @@
json.extract! settings_product, :id, :created_at, :updated_at
json.url settings_product_url(settings_product, format: :json)

View File

@@ -0,0 +1,10 @@
<div class="span12">
<div class="page-header">
<ul class="breadcrumb">
<li><a href="<%= root_path %>">Home</a></li>
<li><a href="<%= settings_products_path %>">Products</a></li>
<li>Edit</li>
</ul>
</div>
<%= render 'form', settings_product: @settings_product %>
</div>

View File

@@ -0,0 +1,45 @@
<div class="page-header">
<ul class="breadcrumb">
<li><a href="<%= %>">Home</a></li>
<li>Product</li>
<span style="float: right">
<%= link_to t('.new', :default => t("helpers.links.new")),new_settings_product_path,:class => 'btn btn-primary btn-sm' %>
</span>
</ul>
</div>
<br>
<div class="card">
<table class="table table-striped">
<thead>
<tr>
<th>Item Code</th>
<th>Name</th>
<th>Alt Name</th>
<th>Unit Price</th>
<!-- <th style="width:20%">image_path</th> -->
<th>Description</th>
<th>Information</th>
<th>Taxable</th>
<th colspan="3"></th>
</tr>
</thead>
<tbody>
<% @settings_products.each do |settings_product| %>
<tr>
<td><%= settings_product.item_code %></td>
<td><%= settings_product.name %></td>
<td><%= settings_product.alt_name %></td>
<td><%= settings_product.unit_price %></td>
<td><%= settings_product.description %></td>
<td><%= settings_product.information %></td>
<td><%= settings_product.taxable %></td>
<td><%= link_to 'Show', settings_product_path(settings_product) %></td>
<td><%= link_to 'Edit', edit_settings_product_path(settings_product) %></td>
<td><%= link_to 'Destroy', settings_product_path(settings_product), method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>
</table>
</div>

View File

@@ -0,0 +1 @@
json.array! @settings_products, partial: 'settings_products/settings_product', as: :settings_product

View File

@@ -0,0 +1,26 @@
<div class="span12">
<div class="page-header">
<ul class="breadcrumb">
<li><a href="<%= root_path %>">Home</a></li>
<li><a href="<%= settings_products_path %>">Products</a></li>
<li>New</li>
</ul>
</div>
<%= render 'form', settings_product: @settings_product %>
</div>
<script>
function randomNumber(len) {
var sValidCharacters = "01234ABCDEFGHIJabcdefghijk56789lmnKLMNOPQRSTUVWXYZopqrstuvwxyz";
var sCharCode = "";
for (i = 1; i <= len; i++) {
sCharCode = sCharCode + sValidCharacters.charAt(parseInt(Math.random() * sValidCharacters.length));
if ((i === 4) || (i === 8)) {
sCharCode = sCharCode + "-";
}
}
return sCharCode;
}
document.getElementById("item_code").value = randomNumber(12);
</script>

View File

@@ -0,0 +1,33 @@
<div class="page-header">
<ul class="breadcrumb">
<li><a href="<%= root_path %>">Home</a></li>
<li><a href="<%= settings_products_path %>">Products</a></li>
<span style="float: right">
</span>
</ul>
</div>
<div class="card">
<div class="card-block">
<h4 class="card-title">Product</h4>
<table class="table">
<tbody>
<tr><td style="width:20%">Item code</td><td><%= @settings_product.item_code %></td></tr>
<tr><td style="width:20%">Name</td><td><%= @settings_product.name %></td></tr>
<tr><td style="width:20%">Alt name</td><td><%= @settings_product.alt_name %></td></tr>
<tr><td style="width:20%">Unit price</td><td><%= @settings_product.unit_price %></td></tr>
<tr><td style="width:20%">Image path</td><td><%= image_tag @settings_product.image_path, :size => '200x200'%></td></tr>
<tr><td style="width:20%">Description</td><td><%= @settings_product.description %></td></tr>
<tr><td style="width:20%">Information</td><td><%= @settings_product.information %></td></tr>
<tr><td style="width:20%">Taxable</td><td><%= @settings_product.taxable %></td></tr>
<tr><td style="width:20%"><%= link_to 'Edit', edit_settings_product_path(@settings_product) %></td><td><%= link_to 'Destroy', settings_product_path(@settings_product), method: :delete, data: { confirm: 'Are you sure?' } %></td></tr>
</tbody>
</table>
</div>
</div>
</div>

View File

@@ -0,0 +1 @@
json.partial! "settings_products/settings_product", settings_product: @settings_product

View File

@@ -0,0 +1,48 @@
<%= simple_form_for([:settings,@promotion]) do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<div class="div-border">
<div class="row">
<div class="col-md-6"><%= f.input :promo_code %></div>
<div class="col-md-6"></div>
</div>
<div class="row">
<div class="col-md-6">
<span>Promo Start Date</span>
<%= f.date_field :promo_start_date, :placeholder => "From Date" , :class => "form-control"%>
<br>
</div>
<div class="col-md-6">
<span>Promo End Date</span>
<%= f.date_field :promo_end_date ,:placeholder => "To Date" , :class => "form-control"%>
</div>
</div>
<div class="row">
<div class="col-md-6">
<%= f.input :promo_start_hour %>
<!-- <span>Promo Start Hour</span>
<%= text_field_tag :promo_start_hour , nil, :placeholder => "From Time", :id => "fromtime", :class => 'form-control' %> -->
</div>
<div class="col-md-6"><%= f.input :promo_end_hour %></div>
</div>
<div class="row">
<div class="col-md-12"><%= f.input :promo_day %></div>
</div>
<div class="row">
<div class="col-md-6">
<%= f.input :promo_type,input_html: { class: "" },
collection: %w{Quantity Net_off Net_price Percentage},:class => 'form-control' ,:label => "" %>
</div>
</div>
<div class="row">
<div class="col-md-6"><%= f.input :original_product,collection: MenuItem.order("name desc"),input_html: { selected: 2 } %></div>
<div class="col-md-6"><%= f.input :min_qty %></div>
</div>
</div>
</div>
<div class="form-actions">
<%= f.button :submit %>
</div>
<% end %>

View File

@@ -0,0 +1,2 @@
json.extract! promotion, :id, :created_at, :updated_at
json.url promotion_url(promotion, format: :json)

View File

@@ -0,0 +1,10 @@
<div class="span12">
<div class="page-header">
<ul class="breadcrumb">
<li><a href="<%= root_path %>">Home</a></li>
<li><a href="<%= settings_promotions_path %>">Promotions</a></li>
<li>Edit</li>
</ul>
</div>
<%= render 'form', promotion: @promotion %>
</div>

View File

@@ -0,0 +1,58 @@
<p id="notice"><%= notice %></p>
<div class="page-header">
<ul class="breadcrumb">
<li><a href="<%= root_path %>">Home</a></li>
<li>Promotions</li>
<span style="float: right">
<%= link_to t('.new', :default => t("helpers.links.new")),new_settings_promotion_path,:class => 'btn btn-primary btn-sm' %>
</span>
</ul>
</div>
<br>
<div class="card">
<table class="table table-striped">
<thead>
<tr>
<th>Promotion Code</th>
<th>Start Date</th>
<th>End Date</th>
<th>Start Time</th>
<th>End Time</th>
<th>Promotion Day</th>
<th>Original Product</th>
<th>Created By</th>
<th>Created At</th>
<th colspan="2"></th>
</tr>
</thead>
<tbody>
<% @promotions.each do |pro| %>
<tr>
<td><%= link_to pro.promo_code, settings_promotion_path(pro) %></td>
<td><%= pro.promo_start_date %></td>
<td><%= pro.promo_end_date %></td>
<td><%= pro.promo_start_hour.strftime("%I:%M %P") rescue "-" %></td>
<td><%= pro.promo_end_hour.strftime("%I:%M %P") rescue "-" %></td>
<td><%= pro.promo_day %></td>
<td>
<% if MenuItem.exists?(pro.original_product) %>
<%= MenuItem.find(pro.original_product).name %>
<% end %>
</td>
<% if Employee.exists?(pro.created_by) %>
<td><%= Employee.find(pro.created_by).name %></td>
<% else %>
<td><%= pro.created_by %></td>
<% end %>
<td><%= pro.created_at.utc.getlocal.strftime("%Y-%m-%d/%I:%M %p") %></td>
<td><%= link_to 'Edit', edit_settings_promotion_path(pro) %></td>
<td><%= link_to 'Destroy', settings_promotion_path(pro), method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>
</table>
</div>

View File

@@ -0,0 +1 @@
json.array! @promotions, partial: 'promotions/promotion', as: :promotion

View File

@@ -0,0 +1,17 @@
<div class="span12">
<div class="page-header">
<ul class="breadcrumb">
<li><a href="<%= root_path %>">Home</a></li>
<li><a href="<%= settings_promotions_path %>">Promotions</a></li>
<li>New</li>
</ul>
</div>
<%= render 'form', promotion: @promotion %>
</div>
<script>
$("#promotion_promo_code").val(Math.random().toString(36).slice(5) + Math.random().toString(36).slice(5));
// $( "#fromtime" ).timepicker();
// $( "#totime" ).timepicker({ 'scrollDefault': 'now' });
$('#scrollDefaultExample').timepicker({ 'scrollDefault': 'now' });
</script>

View File

@@ -0,0 +1,4 @@
<p id="notice"><%= notice %></p>
<%= link_to 'Edit', edit_promotion_path(@promotion) %> |
<%= link_to 'Back', promotions_path %>

View File

@@ -0,0 +1 @@
json.partial! "promotions/promotion", promotion: @promotion

View File

@@ -244,6 +244,8 @@ Rails.application.routes.draw do
resources :menu_item_options
#tax_profiles
resources :tax_profiles
#products
resources :products
#lookups
resources :lookups
#cashier_terminals
@@ -272,6 +274,9 @@ Rails.application.routes.draw do
end
end
#promotion
resources :promotions
end
#--------- Transactions Sections ------------#

View File

@@ -0,0 +1,18 @@
class CreatePromotion < ActiveRecord::Migration[5.1]
def change
create_table :promotions do |t|
t.string :promo_code, :limit => 16
t.date :promo_start_date, :null => false
t.date :promo_end_date, :null => false
t.time :promo_start_hour, :null => false
t.time :promo_end_hour, :null => false
t.string :promo_day, :null => false, :default => "[0,1,2,3,4,5,6]"
t.string :promo_type, :null => false, :default => "Quantity"
t.string :original_product
t.integer :min_qty
t.string :created_by, :null => false
t.timestamps
end
end
end

View File

@@ -0,0 +1,13 @@
class CreatePromotionProduct < ActiveRecord::Migration[5.1]
def change
create_table :promotion_products do |t|
t.references :promotion, foreign_key: true
t.string :item_code, :null => false
t.integer :min_qty
t.integer :net_off
t.integer :net_price
t.integer :percentage
t.timestamps
end
end
end

View File

@@ -0,0 +1,17 @@
class SettingsProducts < ActiveRecord::Migration[5.1]
def change
create_table :products do |t|
t.string :item_code, :limit => 16
t.string :name, :null => false
t.string :alt_name
t.integer :unit_price
t.string :image_path
t.string :description
t.string :information
t.boolean :taxable
t.string :created_by, :null => false
t.timestamps
end
end
end