From ca817197d917b017674a20f310741be6b2dd8c03 Mon Sep 17 00:00:00 2001 From: Aung Myo Date: Mon, 19 Mar 2018 18:13:38 +0630 Subject: [PATCH] update menu import and export --- Gemfile | 5 +- Gemfile.lock | 18 +++- app/controllers/settings/menus_controller.rb | 11 +-- app/models/menu.rb | 42 ++++++++- app/views/settings/menus/index.html.erb | 5 +- app/views/settings/menus/index.xlsx.axlsx | 86 +++++++++++++++++++ config/application.rb | 2 + config/initializers/mime_types.rb | 1 + out.xls | Bin 0 -> 3584 bytes 9 files changed, 155 insertions(+), 15 deletions(-) create mode 100644 app/views/settings/menus/index.xlsx.axlsx create mode 100644 out.xls diff --git a/Gemfile b/Gemfile index 4ca47865..c20dec66 100755 --- a/Gemfile +++ b/Gemfile @@ -46,8 +46,11 @@ gem 'mini_magick' gem 'cups' gem 'prawn' gem 'prawn-table' -gem 'spreadsheet' gem 'to_xls-rails' +gem 'rubyzip', '= 1.0.0' +gem 'axlsx', '= 2.0.1' +gem 'axlsx_rails' +gem 'roo' #Reporting gem #gem 'compendium' #gem "cancan" diff --git a/Gemfile.lock b/Gemfile.lock index 1c7e6534..254ff760 100755 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -50,6 +50,13 @@ GEM airbrussh (1.3.0) sshkit (>= 1.6.1, != 1.7.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) bindex (0.5.0) builder (3.2.3) @@ -100,6 +107,7 @@ GEM railties (>= 3.2, < 5.2) globalid (0.4.1) activesupport (>= 4.2.0) + htmlentities (4.3.4) httparty (0.15.6) multi_xml (>= 0.5.2) i18n (0.9.1) @@ -197,6 +205,10 @@ GEM rb-inotify (0.9.10) ffi (>= 0.5.0, < 2) redis (3.3.5) + roo (1.13.2) + nokogiri + rubyzip + spreadsheet (> 0.6.4) rspec-core (3.7.0) rspec-support (~> 3.7.0) rspec-expectations (3.7.0) @@ -215,6 +227,7 @@ GEM rspec-support (~> 3.7.0) rspec-support (3.7.0) ruby-ole (1.2.12.1) + rubyzip (1.0.0) sass (3.5.3) sass-listen (~> 4.0.0) sass-listen (4.0.0) @@ -286,6 +299,8 @@ PLATFORMS DEPENDENCIES aescrypt + axlsx (= 2.0.1) + axlsx_rails bcrypt (~> 3.1.7) byebug cancancan (~> 1.10) @@ -320,13 +335,14 @@ DEPENDENCIES rack-cors rails (~> 5.1.0) redis (~> 3.0) + roo rspec-rails (~> 3.5) + rubyzip (= 1.0.0) sass-rails (~> 5.0) schema_to_scaffold shoulda-matchers (~> 3.1) sidekiq simple_form - spreadsheet spring spring-watcher-listen (~> 2.0.0) tether-rails diff --git a/app/controllers/settings/menus_controller.rb b/app/controllers/settings/menus_controller.rb index 0a6d87c7..8fed1e97 100755 --- a/app/controllers/settings/menus_controller.rb +++ b/app/controllers/settings/menus_controller.rb @@ -7,12 +7,9 @@ class Settings::MenusController < ApplicationController def index @settings_menus = Menu.all.page(params[:page]).per(10) respond_to do |format| - format.html - # format.csv { send_data MenuCsvExport.generate } - -format.csv { send_data Menu.to_csv } -# format.csv { send_data MenuCategory.to_csv } - end + format.html + format.xlsx + end end # GET /settings/menus/1 @@ -76,7 +73,7 @@ format.csv { send_data Menu.to_csv } def import Menu.import(params[:file]) - redirect_to settings_menu_path, notice: "imported" + redirect_to settings_menus_path, notice: "imported" end private diff --git a/app/models/menu.rb b/app/models/menu.rb index 12784eea..09e36928 100755 --- a/app/models/menu.rb +++ b/app/models/menu.rb @@ -1,4 +1,6 @@ class Menu < ApplicationRecord + + require 'spreadsheet' has_many :menu_categories, dependent: :destroy validates_presence_of :name, :valid_days, :valid_time_from, :valid_time_to @@ -34,7 +36,7 @@ class Menu < ApplicationRecord def self.to_csv 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 menu = Menu.all menu.each do |user| @@ -44,9 +46,41 @@ class Menu < ApplicationRecord end def self.import(file) - CSV.foreach(file.path, headers:true) do |row| - Menu.create! row.to_hash - end + spreadsheet = Roo::Spreadsheet.open(file.path) + 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 \ No newline at end of file diff --git a/app/views/settings/menus/index.html.erb b/app/views/settings/menus/index.html.erb index ed215031..11ae575f 100755 --- a/app/views/settings/menus/index.html.erb +++ b/app/views/settings/menus/index.html.erb @@ -7,11 +7,12 @@ - +<%end%> +<%= link_to "Export users as spreadsheet", settings_menus_path(format: "xlsx") %>


diff --git a/app/views/settings/menus/index.xlsx.axlsx b/app/views/settings/menus/index.xlsx.axlsx new file mode 100644 index 00000000..977e9782 --- /dev/null +++ b/app/views/settings/menus/index.xlsx.axlsx @@ -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 diff --git a/config/application.rb b/config/application.rb index e9a4e634..5e672414 100755 --- a/config/application.rb +++ b/config/application.rb @@ -2,6 +2,8 @@ require_relative 'boot' require 'csv' require 'rails/all' +require 'creek' +# require 'iconv' # Require the gems listed in Gemfile, including any gems # you've limited to :test, :development, or :production. diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb index 3859c754..3e0fb279 100755 --- a/config/initializers/mime_types.rb +++ b/config/initializers/mime_types.rb @@ -3,3 +3,4 @@ # Add new mime types for use in respond_to blocks: # Mime::Type.register "text/richtext", :rtf Mime::Type.register 'application/vnd.ms-excel', :xls +Mime::Type.register "application/xlsx", :xlsx diff --git a/out.xls b/out.xls new file mode 100644 index 0000000000000000000000000000000000000000..ffe4b922dd3da5584007d3d2209613a7f913243e GIT binary patch literal 3584 zcmeHJy=xRv5dXc+UcA%G*Ckpg$P(}i(#SS~#53YyqZTKUQlhyK zGLV13Mhgqi&SD{ooz*D_mO(5v&)>}59x+^D1dAg(yYpt=yf^dS&b*m@?>DD9>o1Oe z#x6LI5p25xMt8^!`H{3g3Haniw(Xn~agInfgCX)jAb>V6UGaTQ*4;KJ@^M2m<&<-;B|M7!5d4QjH%b$Bp^BC?KzMva!o^EKq z_Zmrlm5_-+=ru8EEFCiKcAF%IwGK9nSSAuAoFDOVlp|t45rbSx9%0p+y2qT9uNhs%RK}(EiKC)=FTHpkPmV%Hk(JE3FQkQ}!IEKqwQCgkuP!*A?-?9qr<+5Qf8jB%>)&Kc>)v?Jeo8KQCA`$!OeI3snQ;ZKAa)Ej=gges7ok&5sln;~ez(de z`~0`^sU7^8KEG9#ugPFPd7z30pH)`e3RXy)SliR*A3@Hfzq{T6{44#E9DTwfS8t+@ z+q#c>SGb3kf2RKWvX6nPA2w$nzWHd7Qcg2_Gqm&QM%!{>oC{&I&;@z?NuMz-UB^uTWm^