update menu import and export
This commit is contained in:
5
Gemfile
5
Gemfile
@@ -46,8 +46,11 @@ gem 'mini_magick'
|
|||||||
gem 'cups'
|
gem 'cups'
|
||||||
gem 'prawn'
|
gem 'prawn'
|
||||||
gem 'prawn-table'
|
gem 'prawn-table'
|
||||||
gem 'spreadsheet'
|
|
||||||
gem 'to_xls-rails'
|
gem 'to_xls-rails'
|
||||||
|
gem 'rubyzip', '= 1.0.0'
|
||||||
|
gem 'axlsx', '= 2.0.1'
|
||||||
|
gem 'axlsx_rails'
|
||||||
|
gem 'roo'
|
||||||
#Reporting gem
|
#Reporting gem
|
||||||
#gem 'compendium'
|
#gem 'compendium'
|
||||||
#gem "cancan"
|
#gem "cancan"
|
||||||
|
|||||||
18
Gemfile.lock
18
Gemfile.lock
@@ -50,6 +50,13 @@ GEM
|
|||||||
airbrussh (1.3.0)
|
airbrussh (1.3.0)
|
||||||
sshkit (>= 1.6.1, != 1.7.0)
|
sshkit (>= 1.6.1, != 1.7.0)
|
||||||
arel (8.0.0)
|
arel (8.0.0)
|
||||||
|
axlsx (2.0.1)
|
||||||
|
htmlentities (~> 4.3.1)
|
||||||
|
nokogiri (>= 1.4.1)
|
||||||
|
rubyzip (~> 1.0.0)
|
||||||
|
axlsx_rails (0.5.1)
|
||||||
|
actionpack (>= 3.1)
|
||||||
|
axlsx (>= 2.0.1)
|
||||||
bcrypt (3.1.11)
|
bcrypt (3.1.11)
|
||||||
bindex (0.5.0)
|
bindex (0.5.0)
|
||||||
builder (3.2.3)
|
builder (3.2.3)
|
||||||
@@ -100,6 +107,7 @@ GEM
|
|||||||
railties (>= 3.2, < 5.2)
|
railties (>= 3.2, < 5.2)
|
||||||
globalid (0.4.1)
|
globalid (0.4.1)
|
||||||
activesupport (>= 4.2.0)
|
activesupport (>= 4.2.0)
|
||||||
|
htmlentities (4.3.4)
|
||||||
httparty (0.15.6)
|
httparty (0.15.6)
|
||||||
multi_xml (>= 0.5.2)
|
multi_xml (>= 0.5.2)
|
||||||
i18n (0.9.1)
|
i18n (0.9.1)
|
||||||
@@ -197,6 +205,10 @@ GEM
|
|||||||
rb-inotify (0.9.10)
|
rb-inotify (0.9.10)
|
||||||
ffi (>= 0.5.0, < 2)
|
ffi (>= 0.5.0, < 2)
|
||||||
redis (3.3.5)
|
redis (3.3.5)
|
||||||
|
roo (1.13.2)
|
||||||
|
nokogiri
|
||||||
|
rubyzip
|
||||||
|
spreadsheet (> 0.6.4)
|
||||||
rspec-core (3.7.0)
|
rspec-core (3.7.0)
|
||||||
rspec-support (~> 3.7.0)
|
rspec-support (~> 3.7.0)
|
||||||
rspec-expectations (3.7.0)
|
rspec-expectations (3.7.0)
|
||||||
@@ -215,6 +227,7 @@ GEM
|
|||||||
rspec-support (~> 3.7.0)
|
rspec-support (~> 3.7.0)
|
||||||
rspec-support (3.7.0)
|
rspec-support (3.7.0)
|
||||||
ruby-ole (1.2.12.1)
|
ruby-ole (1.2.12.1)
|
||||||
|
rubyzip (1.0.0)
|
||||||
sass (3.5.3)
|
sass (3.5.3)
|
||||||
sass-listen (~> 4.0.0)
|
sass-listen (~> 4.0.0)
|
||||||
sass-listen (4.0.0)
|
sass-listen (4.0.0)
|
||||||
@@ -286,6 +299,8 @@ PLATFORMS
|
|||||||
|
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
aescrypt
|
aescrypt
|
||||||
|
axlsx (= 2.0.1)
|
||||||
|
axlsx_rails
|
||||||
bcrypt (~> 3.1.7)
|
bcrypt (~> 3.1.7)
|
||||||
byebug
|
byebug
|
||||||
cancancan (~> 1.10)
|
cancancan (~> 1.10)
|
||||||
@@ -320,13 +335,14 @@ DEPENDENCIES
|
|||||||
rack-cors
|
rack-cors
|
||||||
rails (~> 5.1.0)
|
rails (~> 5.1.0)
|
||||||
redis (~> 3.0)
|
redis (~> 3.0)
|
||||||
|
roo
|
||||||
rspec-rails (~> 3.5)
|
rspec-rails (~> 3.5)
|
||||||
|
rubyzip (= 1.0.0)
|
||||||
sass-rails (~> 5.0)
|
sass-rails (~> 5.0)
|
||||||
schema_to_scaffold
|
schema_to_scaffold
|
||||||
shoulda-matchers (~> 3.1)
|
shoulda-matchers (~> 3.1)
|
||||||
sidekiq
|
sidekiq
|
||||||
simple_form
|
simple_form
|
||||||
spreadsheet
|
|
||||||
spring
|
spring
|
||||||
spring-watcher-listen (~> 2.0.0)
|
spring-watcher-listen (~> 2.0.0)
|
||||||
tether-rails
|
tether-rails
|
||||||
|
|||||||
@@ -8,10 +8,7 @@ class Settings::MenusController < ApplicationController
|
|||||||
@settings_menus = Menu.all.page(params[:page]).per(10)
|
@settings_menus = Menu.all.page(params[:page]).per(10)
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html
|
format.html
|
||||||
# format.csv { send_data MenuCsvExport.generate }
|
format.xlsx
|
||||||
|
|
||||||
format.csv { send_data Menu.to_csv }
|
|
||||||
# format.csv { send_data MenuCategory.to_csv }
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -76,7 +73,7 @@ format.csv { send_data Menu.to_csv }
|
|||||||
|
|
||||||
def import
|
def import
|
||||||
Menu.import(params[:file])
|
Menu.import(params[:file])
|
||||||
redirect_to settings_menu_path, notice: "imported"
|
redirect_to settings_menus_path, notice: "imported"
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
class Menu < ApplicationRecord
|
class Menu < ApplicationRecord
|
||||||
|
|
||||||
|
require 'spreadsheet'
|
||||||
has_many :menu_categories, dependent: :destroy
|
has_many :menu_categories, dependent: :destroy
|
||||||
|
|
||||||
validates_presence_of :name, :valid_days, :valid_time_from, :valid_time_to
|
validates_presence_of :name, :valid_days, :valid_time_from, :valid_time_to
|
||||||
@@ -34,7 +36,7 @@ class Menu < ApplicationRecord
|
|||||||
|
|
||||||
def self.to_csv
|
def self.to_csv
|
||||||
m_attributes = %w{name is_active valid_days valid_time_from valid_time_to created_by created_at updated_at}
|
m_attributes = %w{name is_active valid_days valid_time_from valid_time_to created_by created_at updated_at}
|
||||||
CSV.generate(headers: true) do |csv|
|
CSV.generate(headers: true, row_sep: "\r\n") do |csv|
|
||||||
csv << m_attributes
|
csv << m_attributes
|
||||||
menu = Menu.all
|
menu = Menu.all
|
||||||
menu.each do |user|
|
menu.each do |user|
|
||||||
@@ -44,8 +46,40 @@ class Menu < ApplicationRecord
|
|||||||
end
|
end
|
||||||
|
|
||||||
def self.import(file)
|
def self.import(file)
|
||||||
CSV.foreach(file.path, headers:true) do |row|
|
spreadsheet = Roo::Spreadsheet.open(file.path)
|
||||||
Menu.create! row.to_hash
|
puts spreadsheet.info
|
||||||
|
|
||||||
|
spreadsheet = Roo::Excelx.new(file.path)
|
||||||
|
puts spreadsheet.info
|
||||||
|
|
||||||
|
# Use the extension option if the extension is ambiguous.
|
||||||
|
spreadsheet = Roo::Spreadsheet.open(file.path, extension: :xlsx)
|
||||||
|
|
||||||
|
puts spreadsheet.info
|
||||||
|
|
||||||
|
header = spreadsheet.row(1)
|
||||||
|
|
||||||
|
(2..spreadsheet.last_row).each do |i|
|
||||||
|
|
||||||
|
row = Hash[[header,spreadsheet.row(i)].transpose]
|
||||||
|
|
||||||
|
menu = Menu.new
|
||||||
|
menu.name = row["name"]
|
||||||
|
menu.is_active = row["is_active"]
|
||||||
|
menu.valid_days = row["valid_days"]
|
||||||
|
menu.valid_time_from = row["valid_time_from"]
|
||||||
|
menu.valid_time_to = row["valid_time_to"]
|
||||||
|
menu.created_by = row["created_by"]
|
||||||
|
menu.save
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.open_spreadsheet(file)
|
||||||
|
case File.extname(file.original_filename)
|
||||||
|
when ".csv" then Roo::CSV.new(file.path,nil,:ignore)
|
||||||
|
when ".xls" then Roo::Excel.new(file.path,nil,:ignore)
|
||||||
|
when ".xlsx" then Roo::Excelx.new(file.path,nil,:ignore)
|
||||||
|
else raise "Unknown File type: #{original_filename}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -7,11 +7,12 @@
|
|||||||
</span>
|
</span>
|
||||||
</ol>
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
<!-- <h4>Import</h4>
|
<h4>Import</h4>
|
||||||
<%= form_tag import_settings_menus_path, multipart:true do%>
|
<%= form_tag import_settings_menus_path, multipart:true do%>
|
||||||
<%=file_field_tag :file%>
|
<%=file_field_tag :file%>
|
||||||
<%=submit_tag "Import CSV"%>
|
<%=submit_tag "Import CSV"%>
|
||||||
<%end%> -->
|
<%end%>
|
||||||
|
<%= link_to "Export users as spreadsheet", settings_menus_path(format: "xlsx") %>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-12 col-sm-12 col-md-2 col-lg-2">
|
<div class="col-xs-12 col-sm-12 col-md-2 col-lg-2">
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|||||||
86
app/views/settings/menus/index.xlsx.axlsx
Normal file
86
app/views/settings/menus/index.xlsx.axlsx
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
wb = xlsx_package.workbook
|
||||||
|
wb.styles do |s|
|
||||||
|
date = s.add_style(:format_code => "yyyy-mm-dd", :border => Axlsx::STYLE_THIN_BORDER)
|
||||||
|
wrap_text = s.add_style :sz => 11,
|
||||||
|
:alignment => { :horizontal => :left,:vertical => :center ,
|
||||||
|
:wrap_text => true}
|
||||||
|
header_text = s.add_style :fg_color=> "FFFFFF",
|
||||||
|
:b => true,
|
||||||
|
:bg_color => "004586",
|
||||||
|
:sz => 12,
|
||||||
|
:border => { :style => :thin, :color => "00" },
|
||||||
|
:alignment => { :horizontal => :left,
|
||||||
|
:vertical => :center ,
|
||||||
|
:header_text => true}
|
||||||
|
|
||||||
|
wb.add_worksheet(name: "Menu") do |sheet|
|
||||||
|
sheet.add_row %w( name is_active valid_days valid_time_from valid_time_to created_by ), :style=>header_text
|
||||||
|
@settings_menus.each do |menu|
|
||||||
|
sheet.add_row [ menu.name, menu.is_active, menu.valid_days, menu.valid_time_from,menu.valid_time_to, menu.created_by], :style=>[date,wrap_text]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
wb.add_worksheet(name: "Menu Category") do |sheet|
|
||||||
|
sheet.add_row %w(menu_id code name alt_name order_by created_by menu_category_id is_available created_at updated_at), :style=>header_text
|
||||||
|
MenuCategory.all.each do |mc|
|
||||||
|
sheet.add_row [mc.menu_id, mc.code, mc.name, mc.alt_name, mc.order_by, mc.created_by, mc.menu_category_id, mc.is_available, mc.created_at, mc.updated_at], :style=>wrap_text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
wb.add_worksheet(name: "Menu Item") do |sheet|
|
||||||
|
sheet.add_row %w(item_code name alt_name image_path description information unit type menu_category_id item_attributes item_options account_id _qty taxable is_sub_item is_available created_by created_at updated_at), :style=>header_text
|
||||||
|
MenuItem.all.each do |mi|
|
||||||
|
sheet.add_row [mi.item_code, mi.name, mi.alt_name, mi.image_path, mi.description, mi.information, mi.unit, mi.type, mi.menu_category_id, mi.item_attributes, mi.item_options, mi.account_id, mi.min_qty, mi.taxable, mi.is_sub_item, mi.is_available, mi.created_by, mi.created_at, mi.updated_at], :style=>wrap_text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
wb.add_worksheet(name: "Menu Item Instance") do |sheet|
|
||||||
|
sheet.add_row %w(menu_item_id item_instance_code item_instance_name item_attributes price is_on_promotion promotion_price is_available is_default created_at updated_at), :style=>header_text
|
||||||
|
MenuItemInstance.all.each do |mii|
|
||||||
|
sheet.add_row [mii.menu_item_id, mii.item_instance_code, mii.item_instance_name, mii.item_attributes, mii.price, mii.is_on_promotion, mii.promotion_price, mii.is_available, mii.is_default, mii.created_at, mii.updated_at], :style=>wrap_text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
wb.add_worksheet(name: "Menu Options") do |sheet|
|
||||||
|
sheet.add_row %w(option_type name value created_at updated_at), :style=>header_text
|
||||||
|
MenuItemOption.all.each do |option|
|
||||||
|
sheet.add_row [option.option_type, option.name, option.value, option.created_at, option.updated_at], :style=>wrap_text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
wb.add_worksheet(name: "Item Attributes") do |sheet|
|
||||||
|
sheet.add_row %w(attribute_type name value created_at updated_at), :style=>header_text
|
||||||
|
MenuItemAttribute.all.each do |attr|
|
||||||
|
sheet.add_row [ attr.attribute_type,attr.name,attr.value,attr.created_at,attr.updated_at], :style=>wrap_text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
wb.add_worksheet(name: "Account") do |sheet|
|
||||||
|
sheet.add_row %w(title account_type discount point bonus rebate created_at updated_at), :style=>header_text
|
||||||
|
Account.all.each do |acc|
|
||||||
|
sheet.add_row [acc.title,acc.account_type,acc.discount,acc.point,acc.bonus,acc.rebate,acc.created_at,acc.updated_at], :style=>wrap_text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
wb.add_worksheet(name: "Item Set") do |sheet|
|
||||||
|
sheet.add_row %w(name alt_name min_selectable_qty max_selectable_qty created_at updated_at), :style=>header_text
|
||||||
|
ItemSet.all.each do |set|
|
||||||
|
sheet.add_row [set.name, set.alt_name, set.min_selectable_qty, set.max_selectable_qty, set.created_at, set.updated_at], :style=>wrap_text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
wb.add_worksheet(name: "Menu Instance Item Set") do |sheet|
|
||||||
|
sheet.add_row %w(item_set_id menu_item_instance_id created_at updated_at), :style=>header_text
|
||||||
|
MenuInstanceItemSet.all.each do |miis|
|
||||||
|
sheet.add_row [miis.item_set_id, miis.menu_item_instance_id, miis.created_at, miis.updated_at], :style=>wrap_text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
wb.add_worksheet(name: "Menu Item Set") do |sheet|
|
||||||
|
sheet.add_row %w(item_set_id menu_item_id created_at updated_at), :style=>header_text
|
||||||
|
MenuItemSet.all.each do |mis|
|
||||||
|
sheet.add_row [mis.item_set_id, mis.menu_item_id, mis.created_at, mis.updated_at], :style=>wrap_text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -2,6 +2,8 @@ require_relative 'boot'
|
|||||||
|
|
||||||
require 'csv'
|
require 'csv'
|
||||||
require 'rails/all'
|
require 'rails/all'
|
||||||
|
require 'creek'
|
||||||
|
# require 'iconv'
|
||||||
|
|
||||||
# Require the gems listed in Gemfile, including any gems
|
# Require the gems listed in Gemfile, including any gems
|
||||||
# you've limited to :test, :development, or :production.
|
# you've limited to :test, :development, or :production.
|
||||||
|
|||||||
@@ -3,3 +3,4 @@
|
|||||||
# Add new mime types for use in respond_to blocks:
|
# Add new mime types for use in respond_to blocks:
|
||||||
# Mime::Type.register "text/richtext", :rtf
|
# Mime::Type.register "text/richtext", :rtf
|
||||||
Mime::Type.register 'application/vnd.ms-excel', :xls
|
Mime::Type.register 'application/vnd.ms-excel', :xls
|
||||||
|
Mime::Type.register "application/xlsx", :xlsx
|
||||||
|
|||||||
Reference in New Issue
Block a user