activation form

This commit is contained in:
Yan
2017-11-09 18:30:20 +06:30
21 changed files with 467 additions and 58 deletions

View File

@@ -4,7 +4,7 @@ class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
# lookup domain for db from provision
before_action :check_license, :lookup_domain, :set_locale
before_action :lookup_domain, :set_locale
helper_method :current_company,:current_login_employee,:current_user
# alias_method :current_user, :current_login_employee,:current_user

View File

@@ -1,8 +1,42 @@
class InstallController < BaseController
def index
end
def index
def create
restaurant = params[:restaurant_name]
license_key = params[:license_key]
admin_user = params[:admin_user]
admin_password = params[:admin_password]
end
def lookup_domain
if request.subdomain.present? && request.subdomain != "www"
@license = current_license(ENV["SX_PROVISION_URL"], request.subdomain.downcase)
if (!@license.nil?)
# logger.info "Location - " + @license.name
ActiveRecord::Base.establish_connection(website_connection(@license))
# logger.info "Connecting to - " + @license.subdomain + " - "+ @license.dbhost + "@" + @license.dbschema
else
# reconnect_default_db
logger.info 'License is nil'
# redirect_to root_url(:host => request.domain) + "store_error"
render :json => [{ status: false, message: 'Invalid Access!'}]
end
end
end
def create
def current_license(url, key)
@license = License.new(url, key)
##creating md5 hash
md5_hostname = Digest::MD5.new
md5key = md5_hostname.update(request.host)
if (@license.detail_with_local_cache(key, md5key.to_s) == true)
#if (@license.detail == true)
return @license
else
return nil
end
end
end

View File

@@ -0,0 +1,76 @@
class Settings::ShopsController < ApplicationController
load_and_authorize_resource except: [:create]
before_action :set_shop, only: [:show, :edit, :update]
# GET /settings/shops
# GET /settings/shops.json
def index
@settings_shops = Shop.all
end
# GET /settings/shops/1
# GET /settings/shops/1.json
def show
end
# GET /settings/shops/new
def new
@settings_shop = Shop.new
end
# GET /settings/shops/1/edit
def edit
end
# POST /settings/shops
# POST /settings/shops.json
def create
@settings_shop = Shop.new(shop_params)
respond_to do |format|
if @settings_shop.save
format.html { redirect_to settings_shops_url, notice: 'Shop was successfully created.' }
format.json { render :index, status: :created, location: @settings_shop }
else
format.html { render :new }
format.json { render json: settings_shops_url.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /settings/shops/1
# PATCH/PUT /settings/shops/1.json
def update
respond_to do |format|
if @settings_shop.update(shop_params)
format.html { redirect_to settings_shops_url, notice: 'Shop was successfully updated.' }
format.json { render :index, status: :ok, location: @settings_shop }
else
format.html { render :edit }
format.json { render json: settings_shops_url.errors, status: :unprocessable_entity }
end
end
end
# DELETE /settings/shops/1
# DELETE /settings/shops/1.json
def destroy
@settings_shop.destroy
flash[:notice] = 'Shop was successfully destroyed.'
render :json => {:status=> "Success", :url => settings_shops_url }.to_json
# respond_to do |format|
# format.html { redirect_to settings_shops_url, notice: 'shop was successfully destroyed.' }
# format.json { head :no_content }
# end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_shop
@settings_shop = Shop.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def shop_params
params.require(:shop).permit(:name,:address,:city,:township,:state,:country,:phone_no,:reservation_no,:license,:activated_at,:license_data,:base_currency,:cloud_token,:cloud_url,:owner_token,:id_prefix,:is_rounding_adj,:quick_sale_summary,:calc_tax_order)
end
end

View File

@@ -5,11 +5,27 @@ require 'uri'
class AESEncDec {
cipher = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
def encrypt
def export_key
ENV['aes_key'] = cipher.key = cipher.random_key # stores the key in key, and also sets the generated key on the cipher
ENV['aes_iv'] = cipher.iv = cipher.random_iv # stores the iv in iv, and also sets the generated iv on the cipher
end
def encrypt(data)
cipher.encrypt
cipher.key = ENV["aes_key"]
cipher.iv = ENV["aes_iv"]
encrypted = cipher.update(data) + cipher.final
encrypted = Base64.urlsafe_encode64(encrypted)
return encrypted
end
def decrypt
cipher.decrypt
cipher.key = ENV["aes_key"]
cipher.iv = ENV["aes_iv"]
# Start the decryption
decoded = Base64.urlsafe_decode64(encrypted)
decrypted = cipher.update(decoded) + cipher.final
end
}

View File

@@ -50,7 +50,7 @@ class License
if cache_license.nil?
##change the d/e key
# @options = { query: {device: "SXlite", lookup: lookup, skey: @secret, token: SECRETS_CONFIG['provision_key']} }
@params = { query: { device: "SXlite", token: SECRETS_CONFIG['provision_key']} }
@params = { query: { device: "SXlite", token: SECRETS_CONFIG['license_key']} }
response = self.class.get("/request_license", @params)
@license = response.parsed_response

View File

@@ -1,4 +1,3 @@
class Shop < ApplicationRecord
end

View File

@@ -1,17 +1,36 @@
<form>
<div class="form-group">
<label for="exampleInputEmail1">Business Name</label>
<input type="text" class="form-control" id="restaurant_name" aria-describedby="business_name" placeholder="Enter business name">
<small id="business_name" class="form-text text-muted">Name of business this system is license to</small>
<form action="/install" method="POST" class="row">
<div class="col-md-6">
<div class="form-group">
<label for="exampleInputEmail1">Business Name</label>
<input type="text" class="form-control" name="restaurant_name" aria-describedby="business_name" placeholder="Enter business name">
<small id="business_name" class="form-text text-muted">Name of business this system is license to</small>
</div>
<div class="form-group">
<label for="lblLicenseKey">License Key</label>
<input type="text" class="form-control" name="license_key" aria-describedby="license_key" placeholder="Add License Key">
<small class="form-text text-muted">Add License Key from Email</small>
</div>
<div class="form-group">
<label for="lblAdministrator">Administrator Username</label>
<input type="text" class="form-control" name="admin_user" aria-describedby="admin_user" placeholder="Administrator Username">
<small id="admin_user" class="form-text text-muted">First Employee who will be assign as administrator</small>
</div>
<div class="form-group">
<label for="admin_password">Password</label>
<input type="password" class="form-control" name="admin_password" placeholder="Password">
</div>
</div>
<div class="form-group">
<label for="lblAdministrator">Administrator Username</label>
<input type="text" class="form-control" id="admin_user" aria-describedby="admin_user" placeholder="Administrator Username">
<small id="admin_user" class="form-text text-muted">First Employee who will be assign as administrator</small>
<div class="col-md-6">
<div class="form-group">
<label for="lblAdministrator">Database Username</label>
<input type="text" class="form-control" name="db_user" aria-describedby="db_user" placeholder="Database Username">
</div>
<div class="form-group">
<label for="admin_password">Database Password</label>
<input type="password" class="form-control" name="db_password" placeholder="Database Password">
</div>
</div>
<div class="form-group">
<label for="admin_password">Password</label>
<input type="password" class="form-control" id="admin_password" placeholder="Password">
<div class="col-md-12 text-center">
<button type="submit" class="btn btn-primary">Activate</button>
</div>
<button type="submit" class="btn btn-primary">Activate</button>
</form>

View File

@@ -1,8 +1,5 @@
<div class="row">
<div class="col-lg-3 col-md-3"></div>
<div class="col-lg-6 col-md-6 ">
<div class="card">
<div class="card col-md-12">
<div class="card-block">
<h4 class="card-title text-center">License Activation</h4>
<br/>
@@ -11,7 +8,4 @@
<%= render "install/form" %>
</div>
</div>
</div>
<div class="col-lg-3 col-md-3"></div>
</div>

View File

@@ -10,11 +10,26 @@
<%= csrf_meta_tags %>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
<style>
.page {
padding-left: 0;
max-width: 80%;
margin: 2% auto;
overflow-x: hidden;
background-color: #2790a5;
}
.page .box {
display: block;
width: 100%;
color: #000;
}
</style>
</head>
<body>
<div class="container-fluid">
<body class="page">
<div class="box">
<%= yield %>
</div>

View File

@@ -0,0 +1,67 @@
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-8 col-lg-8">
<%= simple_form_for([:settings,@settings_shop]) do |f| %>
<%= f.error_notification %>
<div class="form-inputs p-l-10">
<%= f.input :name ,:input_html=>{:class=>"col-md-10"},:required=>true%>
<%= f.input :address %>
<%= f.input :city %>
<%= f.input :township %>
<%= f.input :state %>
<%= f.input :phone_no %>
<%= f.input :reservation_no %>
<%= f.input :license %>
<%= f.input :license_data %>
<%= f.input :base_currency %>
<%= f.input :cloud_token %>
<%= f.input :cloud_url %>
<%= f.input :owner_token %>
<%= f.input :id_prefix %>
<%= f.input :is_rounding_adj %>
<%= f.input :quick_sale_summary %>
<%= f.input :calc_tax_order %>
</div>
<div class="form-actions">
<%= f.submit "Submit",:class => 'btn btn-primary btn-lg waves-effect' %>
</div>
<% end %>
</div>
<div class="col-xs-12 col-sm-12 col-md-4 col-lg-4">
<div class="card">
<div class="body">
<h5><i class="material-icons md-18">view_headline <%= t("views.right_panel.header.page_detail") %></i></h5>
<p>
1) address - to write shop's address <br>
2) city - to write city <br>
3) township - to write township <br>
4) state - to write state <br>
5) phone_no - to write shop's phone_no <br>
6) reservation_no - to write shop's reservation_no <br>
7) license - to write license <br>
8) license_data - to write license data <br>
9) base_currency - to write base currency <br>
10)cloud_token - to write cloud token <br>
11)cloud_url - to write cloud url <br>
12)owner_token - to write shop's owner token <br>
13)id_prefix - to write id prefix <br>
14)is_rounding_adj - to check for calculate rounding adj of shop <br>
15)quick_sale_summary - to check for view Quick Sale Summary <br>
16)calc_tax_order - to check for tax calculation of shop <br>
</p>
<h5><i class="material-icons md-18">list <%= t("views.right_panel.header.button_lists") %></i> </h5>
<p>
1) <%= t("views.right_panel.button.submit") %> - <%= t("views.right_panel.detail.submit_btn_txt") %> <%= t("views.right_panel.detail.shop_txt") %> <br>
</p>
<h5><i class="material-icons md-18">list <%= t("views.right_panel.header.link_lists") %></i> </h5>
<p>
1) <%= t("views.right_panel.button.home") %> - <%= t("views.right_panel.detail.home_txt") %> <br>
2) <%= t("views.right_panel.button.back") %> - <%= t("views.right_panel.detail.back_txt") %> <%= t("views.right_panel.detail.shop_txt") %> <br>
</p>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,2 @@
json.extract! settings_account, :id, :title, :account_type, :created_at, :updated_at
json.url settings_account_url(settings_account, format: :json)

View File

@@ -0,0 +1,12 @@
<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"><a href="<%= settings_shops_path %>"><%= t("views.right_panel.detail.shop") %></a></li>
<li class="breadcrumb-item active"><%= t("views.btn.edit") %></li>
<span class="float-right">
<%= link_to t('.back', :default => t("views.btn.back")), settings_shops_path %>
</span>
</ol>
</div>
<%= render 'form', settings_shop: @settings_shop %>

View File

@@ -0,0 +1,67 @@
<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("views.right_panel.detail.shop") %></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-xs-12 col-sm-12 col-md-9 col-lg-9">
<!-- <div class="m-b-10 clearfix">
<%= link_to t("views.btn.new"),new_settings_shop_path,:class => 'btn btn-primary btn-lg float-right waves-effect"' %>
</div> -->
<div class="card">
<table class="table table-striped">
<thead>
<tr>
<th>Shop Name</th>
<th>Phone No</th>
<th>Reservation No</th>
<th>Rouding Adj</th>
<th>View Sale Summary</th>
<th>Calculate Tax</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<% @settings_shops.each do |shop| %>
<tr>
<td><%= shop.name %></td>
<td><%= shop.phone_no %></td>
<td><%= shop.reservation_no %></td>
<td><%= shop.is_rounding_adj %></td>
<td><%= shop.quick_sale_summary %></td>
<td><%= shop.calc_tax_order %></td>
<td>
<%= link_to t("views.btn.show"), settings_shop_path(shop),:class => 'btn btn-info btn-sm waves-effect' %>
<%= link_to t("views.btn.edit"), edit_settings_shop_path(shop),:class => 'btn btn-primary btn-sm waves-effect' %>
</td>
</tr>
<% end %>
</tbody>
</table>
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-3 col-lg-3">
<div class="card">
<div class="body">
<h5><i class="material-icons md-18">list <%= t("views.right_panel.header.button_lists") %></i> </h5>
<p>
1) <%= t("views.right_panel.button.show") %> - <%= t("views.right_panel.detail.show_btn_txt") %> <%= t("views.right_panel.detail.shop_txt") %> <br>
2) <%= t("views.right_panel.button.edit") %> - <%= t("views.right_panel.detail.edit_btn_txt") %> <%= t("views.right_panel.detail.shop_txt") %> <br>
</p>
<h5><i class="material-icons md-18">list <%= t("views.right_panel.header.link_lists") %></i> </h5>
<p>
1) <%= t("views.right_panel.button.home") %> - <%= t("views.right_panel.detail.home_txt") %> <br>
2) <%= t("views.right_panel.button.back") %> - <%= t("views.right_panel.detail.back_txt") %> <%= t("views.right_panel.detail.dashboard_txt") %> <br>
</p>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1 @@
json.array! @settings_accounts, partial: 'settings_accounts/settings_account', as: :settings_account

View File

@@ -0,0 +1,126 @@
<!-- -->
<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"><a href="<%= settings_shops_path %>"><%= t("views.right_panel.detail.shop") %></a></li>
<li class="breadcrumb-item active"><%= t :details %></li>
<span class="float-right">
<%= link_to t('.back', :default => t("views.btn.back")), settings_shops_path %>
</span>
</ol>
</div>
<br/>
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-8 col-lg-8">
<div class="card">
<div class="card-block">
<table class="table">
<tbody>
<tr>
<td>Name</td>
<td><%= @settings_shop.name %></td>
</tr>
<tr>
<td>Address</td>
<td><%= @settings_shop.address %></td>
</tr>
<tr>
<td>City</td>
<td><%= @settings_shop.city %></td>
</tr>
<tr>
<td>Township</td>
<td><%= @settings_shop.township %></td>
</tr>
<tr>
<td>State</td>
<td><%= @settings_shop.state %></td>
</tr>
<tr>
<td>Country</td>
<td><%= @settings_shop.country %></td>
</tr>
<tr>
<td>Phone No</td>
<td><%= @settings_shop.phone_no %></td>
</tr>
<tr>
<td>Reservation No</td>
<td><%= @settings_shop.reservation_no %></td>
</tr>
<tr>
<td>License</td>
<td><%= @settings_shop.license %></td>
</tr>
<tr>
<td>Activated At</td>
<td><%= @settings_shop.activated_at %></td>
</tr>
<tr>
<td>license Data</td>
<td><%= @settings_shop.license_data %></td>
</tr>
<tr>
<td>Base Currency</td>
<td><%= @settings_shop.base_currency %></td>
</tr>
<tr>
<td>Cloud Token</td>
<td><%= @settings_shop.cloud_token %></td>
</tr>
<tr>
<td>Cloud URL</td>
<td><%= @settings_shop.cloud_url %></td>
</tr>
<tr>
<td>Owner Token</td>
<td><%= @settings_shop.owner_token %></td>
</tr>
<tr>
<td>id prefix</td>
<td><%= @settings_shop.id_prefix %></td>
</tr>
<tr>
<td>Rounding adj</td>
<td><%= @settings_shop.is_rounding_adj %></td>
</tr>
<tr>
<td>Viwe Sale Summary</td>
<td><%= @settings_shop.quick_sale_summary %></td>
</tr>
<tr>
<td>Calculate Tax</td>
<td><%= @settings_shop.calc_tax_order %></td>
</tr>
<tr>
<td><%= link_to t("views.btn.edit"), edit_settings_shop_path(@settings_shop),:class => 'btn btn-primary btn-sm waves-effect' %>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-4 col-lg-4">
<div class="card">
<div class="body">
<h5><i class="material-icons md-18">list <%= t("views.right_panel.header.button_lists") %></i> </h5>
<p>
1) <%= t("views.right_panel.button.edit") %> - <%= t("views.right_panel.detail.edit_btn_txt") %> <%= t("views.right_panel.detail.shop_txt") %> <br>
</p>
<h5><i class="material-icons md-18">list <%= t("views.right_panel.header.link_lists") %></i> </h5>
<p>
1) <%= t("views.right_panel.button.home") %> - <%= t("views.right_panel.detail.home_txt") %> <br>
2) <%= t("views.right_panel.button.back") %> - <%= t("views.right_panel.detail.back_txt") %> <%= t("views.right_panel.detail.dashboard_txt") %> <br>
</p>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1 @@
json.partial! "settings_accounts/settings_account", settings_account: @settings_account

View File

@@ -1,6 +0,0 @@
# config = YAML.load_file(Rails.root.join("config/smartsales.yml"))
# config.fetch(Rails.env, {}).each do |key, value|
# ENV[key.upcase] = value.to_s
# end
SECRETS_CONFIG = YAML.load_file("#{Rails.root}/config/secrets.yml")[Rails.env]

View File

@@ -1,4 +0,0 @@
config = YAML.load_file(Rails.root.join("config/sx.yml"))
config.fetch(Rails.env, {}).each do |key, value|
ENV[key.upcase] = value.to_s
end

View File

@@ -246,6 +246,7 @@ scope "(:locale)", locale: /en|mm/ do
#--------- System Settings ------------#
namespace :settings do
resources :shops
#employees
resources :employees
#menu

View File

@@ -11,8 +11,10 @@
# if you're sharing your code publicly.
development:
secret_key_base: b61d85f8ed2a1a9e0eeece3443b3e8f838d002cc1d9f32115d8e93db920e2957adfedc57501d44741211538f3108b742cdeada87d5bfae796c53da1f90a3cd61
provision_key: IAAXHpbSWAfvlWGYpDoXvZdmuRABNGk
secret_key_base: b61d85f8ed2a1a9e0eeece3443b3e8f838d002cc1d9f32115d8e93db920e2957adfedc57501d44741211538f3108b742cdeada87d5bfae796c53da1f90a3cd61
sx_provision_url: secure.smartsales.asia/api
aes_key: <%= ENV['aes_key'] %>
aes_iv: <%= ENV['aes_iv'] %>
test:
secret_key_base: 5c92143fd4a844fdaf8b22aba0cda22ef1fc68f1b26dd3d40656866893718ae5e58625b4c3a5dc86b04c8be0a505ec0ebc0be3bf52249a3d1e0c1334ee591cf0
@@ -20,6 +22,8 @@ test:
# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
secret_key_base: c4bc81065013f9a3506d385bcbd49586c42e586488144b0de90c7da36867de9fa880f46b5c4f86f0ce9b7c783bb5a73bdb0e5605a47716567294390e726d3e22
provision_key: IAAXHpbSWAfvlWGYpDoXvZdmuRABNGk
secret_key_base: c4bc81065013f9a3506d385bcbd49586c42e586488144b0de90c7da36867de9fa880f46b5c4f86f0ce9b7c783bb5a73bdb0e5605a47716567294390e726d3e22
sx_provision_url: secure.smartsales.asia/api
aes_key: <%= ENV['aes_key'] %>
aes_iv: <%= ENV['aes_iv'] %>

View File

@@ -1,15 +0,0 @@
development:
server_mode: local
sx_provision_url: http://192.168.1.162:3005/api
expired_date: 2017-11-09 05:02:33
test:
sx_provision_url: secure.smartsales.asia/api
# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
server_mode: cloud
sx_provision_url: secure.smartsales.asia/api