diff --git a/Gemfile b/Gemfile index 11a34b3c..92b133de 100644 --- a/Gemfile +++ b/Gemfile @@ -1,6 +1,6 @@ source 'https://rubygems.org' -#ruby '2.4.1' +ruby '2.6.5' #ruby '2.5.7' git_source(:github) do |repo_name| @@ -15,7 +15,7 @@ gem 'rails', '~> 5.1.0' #gem 'mysql2', '>= 0.3.18', '< 0.5' gem 'pg' -gem 'mysql2' +gem 'mysql2', '~> 0.5.2' #Use PosgreSQL diff --git a/Gemfile.lock b/Gemfile.lock index 50647fba..4cdc2ded 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -96,7 +96,6 @@ GEM concurrent-ruby (1.1.5) connection_pool (2.2.2) crass (1.0.5) - cups (0.0.7) database_cleaner (1.7.0) diff-lcs (1.3) erubi (1.9.0) @@ -335,7 +334,6 @@ DEPENDENCIES carrierwave (~> 1.0) chartkick coffee-rails (~> 4.2) - cups (~> 0.0.7) database_cleaner factory_girl_rails (~> 4.0) faker @@ -351,7 +349,7 @@ DEPENDENCIES material_icons mini_magick momentjs-rails - mysql2 + mysql2 (~> 0.5.2) nested_form pdfjs_viewer-rails pg @@ -380,5 +378,8 @@ DEPENDENCIES web-console (>= 3.3.0) whenever +RUBY VERSION + ruby 2.6.5p114 + BUNDLED WITH 2.0.2 diff --git a/README.md b/README.md index 67fcc40b..b8c1cb62 100755 --- a/README.md +++ b/README.md @@ -4,161 +4,151 @@ SXRestuarant is a new Dedicate project for SmartSales Restaurant. It is improvem Things you may want to cover: -* Ruby version -ruby 2.4.1p111 +- Ruby version + ruby 2.4.1p111 -* Membership Details -Osaka => - Auth Token => wu8YvlLmah0CL => New => v3 - => rj0MJ0XI5GsKZehE => Old => v2 - => code2lab => Old +- Membership Details + Osaka => + Auth Token => wu8YvlLmah0CL => New => v3 + => rj0MJ0XI5GsKZehE => Old => v2 + => code2lab => Old - Merchant account => RxzaYyAGzm7VqAZ4hKnv - Campaign Id => {"campaign_type_id": 5} + Merchant account => RxzaYyAGzm7VqAZ4hKnv + Campaign Id => {"campaign_type_id": 5} BITP - Auth Token => pZBHXEFbGNj/G => New => V3 - iua0SjUHzRaQw - => rj0MJ0XI5GsKZehE => Old => V2 - => code2lab => Old +Auth Token => pZBHXEFbGNj/G => New => V3 +iua0SjUHzRaQw +=> rj0MJ0XI5GsKZehE => Old => V2 +=> code2lab => Old - Merchant account => vWSsseoZCzxd6xcNf_uS + Merchant account => vWSsseoZCzxd6xcNf_uS Campaign Id => {"campaign_type_id": 1} java -jar ~/Documents/Jade.jar http://192.168.1.88:3002 java -jar ~/Documents/c2l_jade.jar http://192.168.1.151:3002 Person and Extra Time - category_code = SPL... //for menu categories special - 1) must create Person in settings/accounts - 2) must create Adult and Child in settings/item_attributes - 3) must be PSA_[a-z/0-9] for Adult and PSC_[a-z/0-9] for Child in settings/menu_categories/[cat_id]/simple_menu_items - 3) must be PSAI_[a-z/0-9] for Adult and PSCI_[a-z/0-9] for Child in settings/simple_menu_items/[item_id]/menu_item_instances +category_code = SPL... //for menu categories special + +1. must create Person in settings/accounts +2. must create Adult and Child in settings/item_attributes +3. must be PSA*[a-z/0-9] for Adult and PSC*[a-z/0-9] for Child in settings/menu_categories/[cat_id]/simple_menu_items +4. must be PSAI*[a-z/0-9] for Adult and PSCI*[a-z/0-9] for Child in settings/simple_menu_items/[item_id]/menu_item_instances For Extra Time - item_instance_code - * must start with 'Ext'[a..z]'_'[1..100] - * note : don't add character after '_' +item_instance_code + +- must start with 'Ext'[a..z]'\_'[1..100] +- note : don't add character after '\_' For Order Printing - 1)) ********* Order Pdf ********* - 1) settings/print_settings - (a) Unique Code => OrderItemPdf & OrderSummaryPdf - (b) Font is present => {Header font size:11, Item Font Size:9} - Font is blank => {Header font size:12, Item Font Size:10} - 2)) ********* Order Set Pdf ********* - 1) settings/print_settings - (a) Unique Code => OrderSetItemPdf & OrderSummarySetPdf - (b) Font is present => {Header font size:11, Item Font Size:9} - Font is blank => {Header font size:12, Item Font Size:10} - 3)) ********* Order Slim Pdf ********* - 1) settings/print_settings - (a) Unique Code => OrderItemSlimPdf & OrderSummarySlimPdf - (b) Font is present => {Header font size:11, Item Font Size:9} - Font is blank => {Header font size:12, Item Font Size:10} - 4)) ********* Order Customise PDF ********* - 1) settings/print_settings - (a) Unique Code => OrderItemCustomisePdf & OrderSummaryCustomisePdf - (b) Can change Header font size and Item Font Size as you like - 5)) ********* Order Set Pdf ********* - 1) settings/print_settings - (a) Unique Code => OrderSetItemCustomisePdf & OrderSummarySetCustomisePdf - (b) Can change Header font size and Item Font Size as you like - 6)) ********* Order Slim Customise PDF - 1) settings/print_settings - (a) Unique Code => OrderItemSlimCustomisePdf & OrderSummarySlimCustomisePdf - (b) Can change Header font size and Item Font Size as you like -For Check in-out Printing - ********* Check in-out Pdf ********* - 1) settings/print_settings - (a) Unique Code => CheckInOutPdf - (b) Heading Space => 5 +1)) \***\*\*\*\*** Order Pdf \***\*\*\*\*** 1) settings/print_settings +(a) Unique Code => OrderItemPdf & OrderSummaryPdf +(b) Font is present => {Header font size:11, Item Font Size:9} +Font is blank => {Header font size:12, Item Font Size:10} +2)) \***\*\*\*\*** Order Set Pdf \***\*\*\*\*** 1) settings/print_settings +(a) Unique Code => OrderSetItemPdf & OrderSummarySetPdf +(b) Font is present => {Header font size:11, Item Font Size:9} +Font is blank => {Header font size:12, Item Font Size:10} +3)) \***\*\*\*\*** Order Slim Pdf \***\*\*\*\*** 1) settings/print_settings +(a) Unique Code => OrderItemSlimPdf & OrderSummarySlimPdf +(b) Font is present => {Header font size:11, Item Font Size:9} +Font is blank => {Header font size:12, Item Font Size:10} +4)) \***\*\*\*\*** Order Customise PDF \***\*\*\*\*** 1) settings/print_settings +(a) Unique Code => OrderItemCustomisePdf & OrderSummaryCustomisePdf +(b) Can change Header font size and Item Font Size as you like +5)) \***\*\*\*\*** Order Set Pdf \***\*\*\*\*** 1) settings/print_settings +(a) Unique Code => OrderSetItemCustomisePdf & OrderSummarySetCustomisePdf +(b) Can change Header font size and Item Font Size as you like +6)) \***\*\*\*\*** Order Slim Customise PDF 1) settings/print_settings +(a) Unique Code => OrderItemSlimCustomisePdf & OrderSummarySlimCustomisePdf +(b) Can change Header font size and Item Font Size as you like +For Check in-out Printing \***\*\*\*\*** Check in-out Pdf \***\*\*\*\*** 1) settings/print_settings +(a) Unique Code => CheckInOutPdf +(b) Heading Space => 5 For ReceiptBillA5Pdf - *** change ReceiptBillPdf to ReceiptBillA5Pdf - 1) settings/print_settings , width:680, height:1450, Header font Size:16, Item font size:14 - 2) settings/lookups => { type:print_settings, name:ReceiptBillA5Pdf, value:1 } +\*\*\* change ReceiptBillPdf to ReceiptBillA5Pdf 1) settings/print_settings , width:680, height:1450, Header font Size:16, Item font size:14 2) settings/lookups => { type:print_settings, name:ReceiptBillA5Pdf, value:1 } -For ReceiptBillAltName options - 1) settings/lookups => { type:print_settings, name:ReceiptBillAltName, value:1 } +For ReceiptBillAltName options 1) settings/lookups => { type:print_settings, name:ReceiptBillAltName, value:1 } For Using Star Printer - *** Need to change these print settings - 1) settings/print_settings/unique_code => OrderItemStarPdf - 2) settings/print_settings/unique_code => ReceiptBillStarPdf - 3) settings/print_settings/unique_code => SaleItemsStarPdf - *** Other print settings aren't need to change. +**_ Need to change these print settings 1) settings/print_settings/unique_code => OrderItemStarPdf 2) settings/print_settings/unique_code => ReceiptBillStarPdf 3) settings/print_settings/unique_code => SaleItemsStarPdf +_** Other print settings aren't need to change. -For Show Sale Items Summary at CloseCashierPrint - 1) settings/print_settings - a) Check => Shift Sale Items +For Show Sale Items Summary at CloseCashierPrint 1) settings/print_settings +a) Check => Shift Sale Items -For Show/Hide AddOrder Button in QuickService - 1) settings/lookups => {type:quickservice_add_order, name: QuickServiceAddOrder, value:1 OR 0} +For Show/Hide AddOrder Button in QuickService 1) settings/lookups => {type:quickservice_add_order, name: QuickServiceAddOrder, value:1 OR 0} -For Show Print Button in ReceiptNo Report - 1) settings/lookups => {type:reprint_receipt, name: Reprint Receipt in Report, value:1} +For Show Print Button in ReceiptNo Report 1) settings/lookups => {type:reprint_receipt, name: Reprint Receipt in Report, value:1} + +For Credit Payment Receipt Pdf and Print + +1. settings/lookups => { type:credit_pdf, name: Credit Pdf, value:1 } For Bank Integration setting - 1) rake db:migrate for card_sale_trans, card_settle_trans - 2) settings/lookups => { type:bank_integration, name: Bank Integration, value:1 } + +1. rake db:migrate for card_sale_trans, card_settle_trans +2. settings/lookups => { type:bank_integration, name: Bank Integration, value:1 } For checkout time and checkout alert time - 1) checkout time => { type: checkout_time, name: 9:00 AM - 12:00 PM, value: 120 } - 2) checkout alert time => { type: checkout_alert_time, name: 8:00 AM - 12:00 PM, value: 60 } - * you can add multiple record for checkout time and checkout alert time - * type must be 'checkout_time' and 'checkout_alert_time' - * you can change name and value - * name must be time range [12hr => 8:30 AM - 1:45 PM, 24hr => 8:00 - 13:45] - * value must be minutes[60] + +1. checkout time => { type: checkout_time, name: 9:00 AM - 12:00 PM, value: 120 } +2. checkout alert time => { type: checkout_alert_time, name: 8:00 AM - 12:00 PM, value: 60 } + +- you can add multiple record for checkout time and checkout alert time +- type must be 'checkout_time' and 'checkout_alert_time' +- you can change name and value +- name must be time range [12hr => 8:30 AM - 1:45 PM, 24hr => 8:00 - 13:45] +- value must be minutes[60] For call waiter pdf - * Backend > Printer > Print Settings > New - i) Name : Calling Waiter - ii) Unique Code: CallWaiterPdf - iii)Template: ... - iv) Font: Zawgyi-One - v) Printer: #printer name -Membership Actions SQL - * update membership_actions set additional_parameter='{\"campaign_type_id\":5}' where id=10; +- Backend > Printer > Print Settings > New + i) Name : Calling Waiter + ii) Unique Code: CallWaiterPdf + iii)Template: ... + iv) Font: Zawgyi-One + v) Printer: #printer name -SQL Update after rake clear:data runned - * update seed_generators - i) TableBooking, Order, OrderItem, sale, SaleOrder, SaleItem, SaleTax, SalePayment, SaleAudit, AssignedOrderItem => { current:0, next:0 } - ** Note :: do not update Customer +Membership Actions SQL \* update membership_actions set additional_parameter='{\"campaign_type_id\":5}' where id=10; + +SQL Update after rake clear:data runned \* update seed_generators +i) TableBooking, Order, OrderItem, sale, SaleOrder, SaleItem, SaleTax, SalePayment, SaleAudit, AssignedOrderItem => { current:0, next:0 } +\*\* Note :: do not update Customer Change type in mysql - *run if you got font error for Myanmar, Chinese, etc... - => ALTER TABLE [table_name] CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci #for table - => ALTER DATABASE [database_name] CHARACTER SET utf8 COLLATE utf8_unicode_ci #for database +\*run if you got font error for Myanmar, Chinese, etc... +=> ALTER TABLE [table_name] CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci #for table +=> ALTER DATABASE [database_name] CHARACTER SET utf8 COLLATE utf8_unicode_ci #for database -For split bill - 1) settings/lookups => { type:split_bill, name:SplitBill, value:1 } +For split bill 1) settings/lookups => { type:split_bill, name:SplitBill, value:1 } -For Sidekiq - 1) If you want to use sidekiq - => Create New Lookups => lookup_type = sidekiq, Name = sidekiq , Value = 1 or 0 +For Sidekiq 1) If you want to use sidekiq +=> Create New Lookups => lookup_type = sidekiq, Name = sidekiq , Value = 1 or 0 -For Clear Menu - 1) rake clear:menu # menu,menu item,menu category,menu item instance,account,item option,item attribute,item set +For Clear Menu 1) rake clear:menu # menu,menu item,menu category,menu item instance,account,item option,item attribute,item set For Check CUp status -###please open +###please open sudo cat /etc/sudoers + ### cope and parse + %superuser ALL=(ALL) NOPASSWD: ALL <---- Extra Fields Script -----> DROP TABLE IF EXISTS `display_images`; CREATE TABLE `display_images` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `shop_id` int(11) DEFAULT NULL, - `image` blob, - `created_by` varchar(255) DEFAULT NULL, - `created_at` datetime NOT NULL, - `updated_at` datetime NOT NULL, - PRIMARY KEY (`id`) +`id` bigint(20) NOT NULL AUTO_INCREMENT, +`shop_id` int(11) DEFAULT NULL, +`image` blob, +`created_by` varchar(255) DEFAULT NULL, +`created_at` datetime NOT NULL, +`updated_at` datetime NOT NULL, +PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; ALTER TABLE customers @@ -190,118 +180,104 @@ ADD COLUMN group_type VARCHAR(255) after name; <---- Extra Fields Script -----> For CloseCashierCustomisePdf in lookups - *** change CloseCashierPdf to CloseCashierCustomisePdf - 1) settings/print_settings - 2) settings/lookups => { type:print_settings, name: CloseCashierCustomisePdf, value:1 } +\*\*\* change CloseCashierPdf to CloseCashierCustomisePdf 1) settings/print_settings 2) settings/lookups => { type:print_settings, name: CloseCashierCustomisePdf, value:1 } <---- Extra Fields Script -----> For MoveTablePdf in lookups - *** Both Table and Room Moving *** - 1) settings/lookups => { type:print_settings, name: MoveTablePdf, value:1 } +**_ Both Table and Room Moving _** 1) settings/lookups => { type:print_settings, name: MoveTablePdf, value:1 } -For MoveTablePdf in print settings - * Backend > Printer > Print Settings > New - i) Name : Move Table - ii) Unique Code: MoveTablePdf - iii)Template: ... - iv) Font: Zawgyi-One v) Printer: #printer name +For MoveTablePdf in print settings \* Backend > Printer > Print Settings > New +i) Name : Move Table +ii) Unique Code: MoveTablePdf +iii)Template: ... +iv) Font: Zawgyi-One v) Printer: #printer name -/* Tax Profile Group Types in lookups */ -1) settings/lookups => { type:tax_profiles, name: Cashier, value:cashier } -2) settings/lookups => { type:tax_profiles, name: Quick Service, value: quick_service } -3) settings/lookups => { type:tax_profiles, name: Doemal, value: doemal } -4) settings/lookups => { type:tax_profiles, name: Food Court, value: food_court } -/* Tax Profile Group Types in lookups */ +/_ Tax Profile Group Types in lookups _/ -/*Receipt Pdf View in lookups */ -1) settings/lookups => { type:ReceiptPdfView, name: Receipt Pdf View, value:1 or 0 } +1. settings/lookups => { type:tax_profiles, name: Cashier, value:cashier } +2. settings/lookups => { type:tax_profiles, name: Quick Service, value: quick_service } +3. settings/lookups => { type:tax_profiles, name: Doemal, value: doemal } +4. settings/lookups => { type:tax*profiles, name: Food Court, value: food_court } + /* Tax Profile Group Types in lookups \_/ + +/_Receipt Pdf View in lookups _/ + +1. settings/lookups => { type:ReceiptPdfView, name: Receipt Pdf View, value:1 or 0 } => 1 is active and 0 is in-active -Add Kitchen Role of Employee - => 1) settings/lookups => { type:employee_roles, name: Kitchen, value:kitchen } +Add Kitchen Role of Employee +=> 1) settings/lookups => { type:employee_roles, name: Kitchen, value:kitchen } -Add Base URL for DOEMAL - 1) settings/lookups => { type:order_reservation, name: BaseURL, value:'{doemal url}' } - 2) settings/lookups => { type:order_reservation, name: Token, value:'{doemal token}' } +Add Base URL for DOEMAL 1) settings/lookups => { type:order_reservation, name: BaseURL, value:'{doemal url}' } 2) settings/lookups => { type:order_reservation, name: Token, value:'{doemal token}' } Add Feature for Dine-in Cashier - ** '0' means can not use dine-in cashier and '1' means can use dine-in cashier ** - => settings/lookups => { type:dinein_cashier, name: DineInCashier, value:'{0 or 1}' } +** '0' means can not use dine-in cashier and '1' means can use dine-in cashier ** +=> settings/lookups => { type:dinein_cashier, name: DineInCashier, value:'{0 or 1}' } Add Feature for Quick Service - ** '0' means can not use quick service and '1' means can use quick service ** - => settings/lookups => { type:quick_service, name: QuickService, value:'{0 or 1}' } +** '0' means can not use quick service and '1' means can use quick service ** +=> settings/lookups => { type:quick_service, name: QuickService, value:'{0 or 1}' } Add Feature for Order and Reservation - ** '0' means can not use order reservation and '1' means can use order reservation ** - => settings/lookups => { type:order_reservation, name: OrderReservation, value:'{0 or 1}' } +** '0' means can not use order reservation and '1' means can use order reservation ** +=> settings/lookups => { type:order_reservation, name: OrderReservation, value:'{0 or 1}' } -For Price 0 in receipt bill - 2) settings/lookups => { type:show_price, name:Show Price, value:1 } +For Price 0 in receipt bill 2) settings/lookups => { type:show_price, name:Show Price, value:1 } +For Price 0 in receipt bill 2) settings/lookups => { type:order_by, name:Order By, value:name } -For Price 0 in receipt bill - 2) settings/lookups => { type:order_by, name:Order By, value:name } +For Aston Request => Gift Voucher 1) settings/payment_method_settings => {payment_method:'GiftVoucher', is_active:true, ...} -For Aston Request => Gift Voucher - 1) settings/payment_method_settings => {payment_method:'GiftVoucher', is_active:true, ...} - -For Login expiry time - 1) settings/lookups => {type:expity_time, name:login, value: {minutes}} - * value should be minute only (30 / 60 / 120 / etc.) +For Login expiry time 1) settings/lookups => {type:expity_time, name:login, value: {minutes}} \* value should be minute only (30 / 60 / 120 / etc.) Menu Image (Import guideline) - => First, check shop_code, is there in shops table and prefix shop_code in image name? - => You all must do this step - * If there is shop_code in shops table (mark in one place/ note and set NULL for this record for a while) and prefix shop_code for image name (like (121_ABC.png)), and copy and paste images into Application/[sxrestaurant]/public/image/menu_images. - * If there is shop_code/ no shop_code in shops table but no prefix in image name (* skip set NULL step) , copy and paste images into Application/…./image/menu_images. - => Second, import [menu].xlsx file in /settings/menus and then checked image is uploaded into Application/[sxrestaurant]/public/image/menu_images and insert into menu_items table in database. - => Last, if shop has shop_code, update marked/noted shop_code into shops table again. + => First, check shop_code, is there in shops table and prefix shop_code in image name? + => You all must do this step + * If there is shop_code in shops table (mark in one place/ note and set NULL for this record for a while) and prefix shop_code for image name (like (121_ABC.png)), and copy and paste images into Application/[sxrestaurant]/public/image/menu_images. + * If there is shop_code/ no shop_code in shops table but no prefix in image name (* skip set NULL step) , copy and paste images into Application/…./image/menu_images. + => Second, import [menu].xlsx file in /settings/menus and then checked image is uploaded into Application/[sxrestaurant]/public/image/menu_images and insert into menu_items table in database. + => Last, if shop has shop_code, update marked/noted shop_code into shops table again. -For Edit Order Open & Close - 1) settings/lookups => {type:edit_order, name:EditOrderOrigami, value: {1 or 0}} +For Edit Order Open & Close 1) settings/lookups => {type:edit_order, name:EditOrderOrigami, value: {1 or 0}} -For Dashboard Settings for supervisor and cashier - 1) settings/lookups => {type:dashboard_settings, name:supervisor, value: {1 or 0}} - 2) settings/lookups => {type:dashboard_settings, name:cashier, value: {1 or 0}} +For Dashboard Settings for supervisor and cashier 1) settings/lookups => {type:dashboard_settings, name:supervisor, value: {1 or 0}} 2) settings/lookups => {type:dashboard_settings, name:cashier, value: {1 or 0}} -For Customer Settings On/Off - 1) settings/lookups => {type:customer_settings, name:create, value: {1 or 0}} +For Customer Settings On/Off 1) settings/lookups => {type:customer_settings, name:create, value: {1 or 0}} -For TaxProfiles On/Off - 1) settings/lookups => {type:changable_tax, name:change, value: {1 or 0}} +For TaxProfiles On/Off 1) settings/lookups => {type:changable_tax, name:change, value: {1 or 0}} -For Add Kitchen Role - 1) settings/lookups => {type:employee_roles, name:Kitchen, value:kitchen} +For Add Kitchen Role 1) settings/lookups => {type:employee_roles, name:Kitchen, value:kitchen} For Food Court Settings On/Off - ** '0' means can not use food court and '1' means can use food court ** - => settings/lookups => { type:food_court, name: FoodCourt, value:'{0 or 1}' } +** '0' means can not use food court and '1' means can use food court ** +=> settings/lookups => { type:food_court, name: FoodCourt, value:'{0 or 1}' } For Number Formats - Precision - => settings/lookups => { lookup_type: number_format, name: precision, value: {0..2} } - Delimiter - => settings/lookups => { lookup_type: number_format, name: delimiter, value: { ',', '\u0020', '', ... } - Strip insignificant zeros - => settings/lookups => { lookup_type: number_format, name: strip_insignificant_zeros, - value: {true: => ['1', 't', 'true', 'on', 'y', 'yes'], false: => ['0', 'f', 'false', 'off', 'n', 'no', ...] } +Precision +=> settings/lookups => { lookup_type: number_format, name: precision, value: {0..2} } +Delimiter +=> settings/lookups => { lookup_type: number_format, name: delimiter, value: { ',', '\u0020', '', ... } +Strip insignificant zeros +=> settings/lookups => { lookup_type: number_format, name: strip_insignificant_zeros, +value: {true: => ['1', 't', 'true', 'on', 'y', 'yes'], false: => ['0', 'f', 'false', 'off', 'n', 'no', ...] } For Booking checkin time limit - settings/lookups => - { lookup_type: checkin_time_limit, name: CheckinTimeLimit, value: total hours before checkout (e.g., '48')) } +settings/lookups => +{ lookup_type: checkin_time_limit, name: CheckinTimeLimit, value: total hours before checkout (e.g., '48')) } -/* Customer Types in lookups */ -1) settings/lookups => { type:customer_type, name: Dinein, value:Dinein } -2) settings/lookups => { type:customer_type, name: Takeaway, value: Takeaway } -3) settings/lookups => { type:customer_type, name: Doemal, value: Doemal } -4) settings/lookups => { type:customer_type, name: FoodCourt, value: FoodCourt } -/* Tax Profile Group Types in lookups */ +/_ Customer Types in lookups _/ + +1. settings/lookups => { type:customer_type, name: Dinein, value:Dinein } +2. settings/lookups => { type:customer_type, name: Takeaway, value: Takeaway } +3. settings/lookups => { type:customer_type, name: Doemal, value: Doemal } +4. settings/lookups => { type:customer*type, name: FoodCourt, value: FoodCourt } + /* Tax Profile Group Types in lookups \_/ For Online Order Receipt Setting -1) settings/lookups => { type:order_reservation, name:ReceiptBill, value: {0 or 1} } -2) settings/print_settings => {name: ReceiptBillOrder, unique_code: ReceiptBillOrderPdf, ....} + +1. settings/lookups => { type:order_reservation, name:ReceiptBill, value: {0 or 1} } +2. settings/print_settings => {name: ReceiptBillOrder, unique_code: ReceiptBillOrderPdf, ....} For Close Cashier Print Settings settings/lookups => {type:close_cashier_print, name:CloseCashierPrint, value: {0 or 1} } @@ -315,99 +291,94 @@ settings/lookups => {type:show_total_before_tax, name:Show Total Before Tax, val For Using Staff Meal settings/lookups => { type:customer_type, name: Staff, value:Staff } -* ToDo list +- ToDo list 1. Migration 2. Quick Service 3. Order & Reservation +- System Dependencies -* System Dependencies +- Configuration -* Configuration +- Database creation -* Database creation +- Database initialization -* Database initialization +- How to run the test suite -* How to run the test suite - -* Services (job queues, cache servers, search engines, etc.) - -* Deployment instructions +- Services (job queues, cache servers, search engines, etc.) +- Deployment instructions * Features 1. OQS - 1. Filter - 2. Order Item to each Stations - 3. Edit Order Item + 1. Filter + 2. Order Item to each Stations + 3. Edit Order Item 2. Origami(Sale) - 1. Sale - 2. Add Customer for membership - 3. Discount and Member Discount for Sale - 4. Assign Commissioner - 5. Add other charges to Sale + 1. Sale + 2. Add Customer for membership + 3. Discount and Member Discount for Sale + 4. Assign Commissioner + 5. Add other charges to Sale 3. CRM - 1. Customer Management + 1. Customer Management - 2. Queue Management + 2. Queue Management 4. Backend - 1. Dining Setup + 1. Dining Setup - 2. Queue Station Setup + 2. Queue Station Setup - 3. Menu Setup + 3. Menu Setup - 4. Cashier Terminal Setup + 4. Cashier Terminal Setup - 5. Tax Profile Setup + 5. Tax Profile Setup - 6. Printer Setup + 6. Printer Setup - 7. Payment Integration + 7. Payment Integration - 8. Employee Management + 8. Employee Management - 9. Promotion Setup + 9. Promotion Setup - 10. Commissioner Setup + 10. Commissioner Setup - 11. Membership Integration - - -5. Inventory + 11. Membership Integration +5) Inventory 6. Report - -* UI Standard +- UI Standard 1. Layout - 1. 2-Column => Main Content - col-9, Information - col-3 - 2. 3-Column => Sub Lint - col-2, Main Content - col-7, Information - col-3 + 1. 2-Column => Main Content - col-9, Information - col-3 + 2. 3-Column => Sub Lint - col-2, Main Content - col-7, Information - col-3 - > Pixel + > Pixel - Main Header Bar - height => 50 px - Side Navigation - Weight => 230 px - Main Content Padding => 15 px + Main Header Bar - height => 50 px + Side Navigation - Weight => 230 px + Main Content Padding => 15 px 2. Color - > BUTTON + > BUTTON - 1. Submit/Add/Edit/Confirm buttons => btn-primary (theme color) - 2. Show/Detail Buttons => btn-info - 3. Delete => btn-delete - 4. Cancel/Back => btn-default + 1. Submit/Add/Edit/Confirm buttons => btn-primary (theme color) + 2. Show/Detail Buttons => btn-info + 3. Delete => btn-delete + 4. Cancel/Back => btn-default diff --git a/app/assets/javascripts/origami.js b/app/assets/javascripts/origami.js index 8c910119..d282b611 100755 --- a/app/assets/javascripts/origami.js +++ b/app/assets/javascripts/origami.js @@ -326,8 +326,8 @@ function setCommPorts(comPortLists) { /** pay with CB bank **/ function pay_withBank(cmd_type, payment_type, bnk_bill_amount,sale_id,receipt_no,cashier_type) { $("#loading_wrapper").show(); - var com_port = $("#com_port_name").val(); - reqCardSaleTrans(cmd_type, payment_type, bnk_bill_amount, sale_id, receipt_no, com_port,cashier_type); + var com_port = $("#com_port_name").val(); + reqCardSaleTrans(cmd_type, payment_type, bnk_bill_amount, sale_id, receipt_no, com_port,cashier_type); } //add req data to card_sale_trans table diff --git a/app/assets/stylesheets/BSBMaterial/style.css b/app/assets/stylesheets/BSBMaterial/style.css index a4620cf5..004439e9 100755 --- a/app/assets/stylesheets/BSBMaterial/style.css +++ b/app/assets/stylesheets/BSBMaterial/style.css @@ -11,7 +11,7 @@ box-shadow: 0 1px 5px rgba(0, 0, 0, 0.3); border: none; position: fixed; - top: 0; + /*top: 0;*/ left: 0; z-index: 12; width: 100%; } @@ -6649,7 +6649,7 @@ fieldset[disabled] .form-control { box-shadow: 0 1px 5px rgba(0, 0, 0, 0.3); border: none; position: fixed; - top: 0; + /*top: 0;*/ left: 0; z-index: 12; width: 100%; } diff --git a/app/controllers/api/check_in_process_controller.rb b/app/controllers/api/check_in_process_controller.rb index 2a04ff6b..c12ae517 100644 --- a/app/controllers/api/check_in_process_controller.rb +++ b/app/controllers/api/check_in_process_controller.rb @@ -19,12 +19,13 @@ class Api::CheckInProcessController < Api::ApiController table = DiningFacility.find(params[:dining_id]) #Send to background job for processing - if ENV["SERVER_MODE"] == 'cloud' - from = request.subdomain + "." + request.domain - else - from = "" - end - ActionCable.server.broadcast "check_in_booking_channel",table: table,from:from + if ENV["SERVER_MODE"] == 'cloud' + from = request.subdomain + "." + request.domain + else + from = "" + end + ActionCable.server.broadcast "check_in_booking_channel",table: table,from:from + check_out_time = nil extra_minutes = nil alert_time_min = 0 @@ -65,93 +66,59 @@ class Api::CheckInProcessController < Api::ApiController if params[:dining_id] dining_facility = DiningFacility.find(params[:dining_id]) if dining_facility.is_active && dining_facility.status == "available" - if params[:checkin_time] - checkin_at = nil - if !params[:checkin_time].empty? - checkin_at = Time.parse(params[:checkin_time]).utc + if dining_facility.current_checkin_booking.nil? + if params[:checkin_time].present? + checkin_at = Time.parse(params[:checkin_time]) else - checkin_at = Time.now.utc + checkin_at = Time.now end - if !checkin_at.nil? - if dining_facility.check_time(checkin_at, "checkin") - booking = dining_facility.get_current_booking - if booking.nil? + checkout_at = nil + lookup_checkout_time = Lookup.collection_of("checkout_time") + today = Time.now + if !lookup_checkout_time.empty? - booking = Booking.create({:dining_facility_id => params[:dining_id],:type => "TableBooking", - :checkin_by=>current_login_employee.name,:checkin_at => checkin_at,:checkout_at =>nil, :booking_status => "assign", :reserved_at => nil, :reserved_by => nil }) - if booking.save! - dining_facility.status = "occupied" - dining_facility.save! - render :json => { :status => true, :booking_id => booking.booking_id, :checkin_at => booking.checkin_at.utc.getlocal.strftime("%Y-%m-%d %H:%M:%S"), :message => "Check-in success" } - else - render :json => { :status => false, :error_message => "Booking does not create successfully!" } - end - else - render :json => { :status => false, :error_message => "Booking already exist!" } + lookup_checkout_time.each do |checkout_time| + start_time, end_time = checkout_time[0].split("-").map{ |t| Time.parse(t.strip).strftime("%H:%M%p") } + if start_time <= today.strftime("%H:%M%p") && today.strftime("%H:%M%p") <= end_time + checkout_at = checkin_at + (checkout_time[1]).to_i.minutes end - else - render :json => { :status => false, :error_message => "Checkin time not available!" } end - else - render :json => { :status => false, :error_message => "Operation failed!" } end + + booking = nil + ActiveRecord::Base.transaction do + booking = Booking.create({ + :dining_facility_id => params[:dining_id], + :type => "TableBooking", + :checkin_by => current_login_employee.name, + :checkin_at => checkin_at, + :checkout_at => checkout_at, + :booking_status => "assign", + :reserved_at => checkout_at, + :reserved_by => current_login_employee.name }) + + dining_facility.status = "occupied" + dining_facility.save! + end + + terminal = DiningFacility.find_by_id(booking.dining_facility_id) + cashier_terminal = CashierTerminal.find_by_id(terminal.zone_id) + + if ENV["SERVER_MODE"] != "cloud" #no print in cloud server + unique_code = "CheckInOutPdf" + printer = PrintSetting.find_by_unique_code(unique_code) + + # print when complete click + order_queue_printer = Printer::OrderQueuePrinter.new(printer) + + if !printer.nil? + order_queue_printer.print_check_in_out(printer, cashier_terminal, booking, dining_facility) + end + end + render :json => { :status => true, :booking_id => booking.booking_id, :checkin_at => booking.checkin_at.strftime("%Y-%m-%d %H:%M"), :checkout_at => booking.checkout_at.strftime("%Y-%m-%d %H:%M") } else - booking = dining_facility.current_checkout_booking - if booking.nil? - lookup_checkout_time = Lookup.collection_of("checkout_time") - - if !lookup_checkout_time.empty? - today = Time.now.utc.getlocal - checkout_at = Time.now.utc.getlocal - - lookup_checkout_time.each do |checkout_time| - arr_time = checkout_time[0].split("-") - start_time = Time.parse(arr_time[0].strip).utc.getlocal.strftime("%H:%M%p") - end_time = Time.parse(arr_time[1].strip).utc.getlocal.strftime("%H:%M%p") - if start_time <= today.strftime("%H:%M%p") && today.strftime("%H:%M%p") <= end_time - checkout_at = checkout_at + (checkout_time[1]).to_i.minutes - end - end - - if checkout_at.strftime("%Y-%m-%d %H:%M%p") >= today.strftime("%Y-%m-%d %H:%M%p") - # if dining_facility.type == "Table" - # type = "TableBooking" - # else - # type = "RoomBooking" - # end - - booking = Booking.create({:dining_facility_id => params[:dining_id],:type => "TableBooking", - :checkin_by=>current_login_employee.name,:checkin_at => Time.now.utc,:checkout_at =>checkout_at, :booking_status => "assign", :reserved_at => checkout_at, :reserved_by => current_login_employee.name }) - if booking.save! - dining_facility.status = "occupied" - dining_facility.save! - end - terminal = DiningFacility.find_by_id(booking.dining_facility_id) - cashier_terminal = CashierTerminal.find_by_id(terminal.zone_id) - - if ENV["SERVER_MODE"] != "cloud" #no print in cloud server - - unique_code = "CheckInOutPdf" - printer = PrintSetting.find_by_unique_code(unique_code) - - # print when complete click - order_queue_printer = Printer::OrderQueuePrinter.new(printer) - - if !printer.nil? - order_queue_printer.print_check_in_out(printer, cashier_terminal, booking, dining_facility) - end - end - render :json => { :status => true, :booking_id => booking.booking_id, :checkout_at => booking.checkout_at.utc.getlocal.strftime("%Y-%m-%d %H:%M") } - else - render :json => { :status => true } - end - else - render :json => { :status => true } - end - else - render :json => { :status => false, :error_message => "Booking already exist!" } - end + render :json => { :status => false, :error_message => "Booking already exist!" } end else error_message = "#{dining_facility.type} is not available!" @@ -161,6 +128,8 @@ class Api::CheckInProcessController < Api::ApiController error_message = "dining_id is required!" render :json => { :status => false, :error_message => error_message } end + rescue ActiveRecord::RecordInvalid => exception + render :json => { :status => false, :error_message => exception.message } end def request_time diff --git a/app/controllers/api/orders_controller.rb b/app/controllers/api/orders_controller.rb index 0c79f303..4f94ae9b 100755 --- a/app/controllers/api/orders_controller.rb +++ b/app/controllers/api/orders_controller.rb @@ -37,18 +37,16 @@ class Api::OrdersController < Api::ApiController @booking = table.get_booking end - @tax_profile = nil + @tax_profile = TaxProfile.where("lower(group_type)='cashier'") # arr_tax = [] # if !arr_tax.empty? # @tax_profile = TaxProfile.where(:id => arr_tax) # else - @tax_profile = TaxProfile.where("lower(group_type)='cashier'") + # @tax_profile = TaxProfile.where("lower(group_type)='cashier'") # end @shop = Shop.current_shop - puts "Hello world" - puts @shop.to_json return @shop.to_json end diff --git a/app/controllers/install_controller.rb b/app/controllers/install_controller.rb index 1ff003db..594c99ea 100755 --- a/app/controllers/install_controller.rb +++ b/app/controllers/install_controller.rb @@ -1,7 +1,6 @@ class InstallController < BaseController - skip_before_action :lookup_domain + # skip_before_action :set_current_tenant_by_subdomain_or_name skip_before_action :verify_authenticity_token - # before_action :check_license def index end @@ -9,7 +8,7 @@ class InstallController < BaseController def activate flag = "<%= ENV['AES_IV'] %>" key_base = "<%= ENV['secret_key_base'] %>" - + restaurant = params[:restaurant_name] license_key = params[:license_key] # admin_user = params[:admin_user] @@ -18,20 +17,20 @@ class InstallController < BaseController db_schema = params[:db_schema] db_user = params[:db_user] db_password = params[:db_password] - phrase = license_key - + phrase = license_key + # Check Exists IV # if flag == "<%= ENV['AES_IV'] %>" - # # Export for Key - # aes = MyAesCrypt.new + # # Export for Key + # aes = MyAesCrypt.new # aes_key, aes_iv = aes.export_key(phrase) - # else + # else # aes_key = ENV["AES_KEY"] # aes_iv = ENV["AES_IV"] # end - @license = License.new(ENV["SX_PROVISION_URL"]) - response = @license.license_activate(restaurant, license_key, db_host, db_schema, db_user, db_password) + @license = License.new(ENV["SX_PROVISION_URL"], request.host) + response = @license.license_activate(restaurant, license_key, db_host, db_schema, db_user, db_password) if response[:status] redirect_to root_url, notice: response["message"] else @@ -39,28 +38,24 @@ class InstallController < BaseController end end - def check_license - if License.check_license_file - redirect_to root_url + def lookup_domain + if ENV["SERVER_MODE"] == "cloud" + not_found + elsif ENV["SERVER_MODE"] == "application" + if check_license #(request.host) + redirect_to root_url + end + elsif request.subdomains.last && request.subdomains.last != "www" + if check_license #(request.host) + redirect_to root_url + elsif !check_subdomain(request.host) + not_found + end + else + not_found end 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 current_license(url, key) # @license = License.new(url, key) diff --git a/app/controllers/origami/discounts_controller.rb b/app/controllers/origami/discounts_controller.rb index 6f4690f0..19a9f087 100755 --- a/app/controllers/origami/discounts_controller.rb +++ b/app/controllers/origami/discounts_controller.rb @@ -87,7 +87,7 @@ class Origami::DiscountsController < BaseOrigamiController remark = "Discount Item Name ->#{sale_item.product_name}-Product Code ->#{sale_item.product_code} | Price [#{sale_item.price}] | Receipt No #{sale.receipt_no} " sale_audit = SaleAudit.record_audit_discount(sale_item.sale_id,sale.cashier_name, action_by,remark,"ITEMDISCOUNT" ) - + end end diff --git a/app/controllers/origami/others_payments_controller.rb b/app/controllers/origami/others_payments_controller.rb index 3d95bbb0..fb75288d 100755 --- a/app/controllers/origami/others_payments_controller.rb +++ b/app/controllers/origami/others_payments_controller.rb @@ -5,7 +5,7 @@ class Origami::OthersPaymentsController < BaseOrigamiController @cashier_type = params[:type] path = request.fullpath if path.include? ("credit_payment") - @payment_method_setting = PaymentMethodSetting.where("LOWER(payment_method) in ('mpu','visa','master','jcb','unionpay','alipay') and is_active='1'") + @payment_method_setting = PaymentMethodSetting.where("is_active='1'") else @payment_method_setting = PaymentMethodSetting.all end @@ -39,7 +39,92 @@ class Origami::OthersPaymentsController < BaseOrigamiController # end end + def new + @sale_id = params[:sale_id] + @cashier_type = params[:type] + payment_methods = PaymentMethodSetting.pluck(:payment_method) + if @payment_method = payment_methods.find { |m| m.parameterize == params[:method] } + path = request.fullpath + # limit master_amount + if path.include? ("credit_payment") + sale_data = Sale.get_sale_data_for_other_payment_credit(@sale_id) + else + sale_data = Sale.find_by_sale_id(@sale_id) + end + total = 0 + @shop = Shop.current_shop + @paid_amount = 0 + @can_paid = 0 + @rounding_adj = 0 + @member_discount = 0 + @sub_total = 0 + @membership_id = nil + @receipt_no = nil + if !sale_data.nil? + total = sale_data.grand_total + + others = 0 + + if @shop.is_rounding_adj + new_total = Sale.get_rounding_adjustment(sale_data.grand_total) + else + new_total = sale_data.grand_total + end + + @rounding_adj = new_total-sale_data.grand_total + + if path.include? ("credit_payment") + sale_payment_data = SalePayment.get_sale_payment_for_credit(sale_data) + else + sale_payment_data = sale_data.sale_payments + end + + sale_payment_data.each do |sale_payment| + if sale_payment.payment_method == @payment_method.parameterize + @paid_amount = @paid_amount + sale_payment.payment_amount + else + others = others + sale_payment.payment_amount + end + end + @can_paid = total - @paid_amount - others + @member_discount = MembershipSetting.find_by_discount(1) + @sub_total = sale_data.total_amount + @membership_id = sale_data.customer.membership_id + #for bank integration + @receipt_no = sale_data.receipt_no + end + bank_integration = Lookup.collection_of('bank_integration') + @bank_integration = 0 + if !bank_integration[0].nil? + @bank_integration = bank_integration[0][1] + end + else + if path.include? ("credit_payment") + redirect_to "sale/#{@sale_id}/#{@cashier_type}/payment/others_payment" + else + redirect_to "sale/#{@sale_id}/#{@cashier_type}/credit_payment/others_payment" + end + end + end + def create + cash = params[:amount] + sale_id = params[:sale_id] + ref_no = params[:ref_no] + payment_method = params[:method] + if PaymentMethodSetting.pluck(:payment_method).map(&:parameterize).include? payment_method + if saleObj = Sale.find(sale_id) + shop_details = Shop.current_shop + + path = request.fullpath + payment_for = false + if path.include? ("credit_payment") + payment_for = true + end + sale_payment = SalePayment.new + @status, @sale = sale_payment.process_payment(saleObj, current_user, cash, payment_method, ref_no, payment_for) + end + end end end diff --git a/app/controllers/origami/payments_controller.rb b/app/controllers/origami/payments_controller.rb index 82e76119..e86449ac 100755 --- a/app/controllers/origami/payments_controller.rb +++ b/app/controllers/origami/payments_controller.rb @@ -51,7 +51,8 @@ class Origami::PaymentsController < BaseOrigamiController #TODO :: KBZPAY ( QR ) # On/Off setting ( show or not qr ) # qrCode = "00020101021202021110500346KBZ005ab0ed5c1ed09d1c4585ff1313170389160831435294600062000040732kp1e78f7efddca190042638341afb88d50200006KBZPay0106KBZPay5303MMK5802MM62170813PAY_BY_QRCODE64060002my6304FBBD" - kbz_pay_method = PaymentMethodSetting.where(:payment_method => KbzPay::KBZ_PAY).last + kbz_pay_method = PaymentMethodSetting.where(payment_method: KbzPay::KBZ_PAY, gateway_communication_type: ['api', 'Api'], is_active: true) + .where.not(gateway_url: [nil, ''], auth_token: [nil, ''], merchant_account_id: [nil, '']).last status = false qr = nil @@ -90,6 +91,7 @@ class Origami::PaymentsController < BaseOrigamiController latest_order_no = nil is_kbz = params[:is_kbz] + if saleObj = Sale.find(sale_id) sale_items = SaleItem.get_all_sale_items(sale_id) @@ -106,7 +108,7 @@ class Origami::PaymentsController < BaseOrigamiController sp.kbz_edit_sale_payment(sp.received_amount.to_f, current_user) end - if !path.include? ("credit_payment") + rebate_amount = nil # For Cashier by Zone @@ -200,12 +202,18 @@ class Origami::PaymentsController < BaseOrigamiController item_price_by_accounts = SaleItem.calculate_price_by_accounts(saleObj.sale_items) discount_price_by_accounts = SaleItem.get_discount_price_by_accounts(saleObj.sale_items) other_amount = SaleItem.calculate_other_charges(sale_items) + credit_pdf = Lookup.find_by_lookup_type("credit_pdf") + if (path.include? ("credit_payment")) && !credit_pdf.nil? && credit_pdf.value.to_i == 1 + printed_status = 'credit_payment' + else + printed_status = 'Paid' + end printer = Printer::ReceiptPrinter.new(print_settings) - filename, sale_receipt_no, printer_name = printer.print_receipt_bill(print_settings, false, nil, cashier_terminal,sale_items,saleObj,customer.name, item_price_by_accounts, discount_price_by_accounts, member_info,rebate_amount,shop_detail, "Paid",current_balance,card_data,other_amount,latest_order_no,card_balance_amount,nil) + filename, sale_receipt_no, printer_name = printer.print_receipt_bill(print_settings, false, nil, cashier_terminal,sale_items,saleObj,customer.name, item_price_by_accounts, discount_price_by_accounts, member_info,rebate_amount,shop_detail, printed_status,current_balance,card_data,other_amount,latest_order_no,card_balance_amount,nil) #end - end + if !saleObj.nil? # InventoryJob.perform_now(self.id) # InventoryDefinition.calculate_product_count(saleObj) @@ -225,15 +233,29 @@ class Origami::PaymentsController < BaseOrigamiController # end def show + @sale = Sale.find(params[:sale_id]) + @shop = Shop.current_shop + @customer = @sale.customer + @customer_lists = Customer.where(name: ["WALK-IN", "TAKEAWAY"]) + @member_discount = MembershipSetting.find_by_discount(1) + + if dining_facility = @sale.booking.dining_facility + @table_no = dining_facility.type + ' ' + dining_facility.name + @checkin_time = @sale.booking.checkin_at + @dining = dining_facility + end + display_type = Lookup.find_by_lookup_type("display_type") - if !display_type.nil? && display_type.value.to_i ==2 + if !display_type.nil? && display_type.value.to_i ==2 @display_type = display_type.value else @display_type = nil - end + end + path = request.fullpath - sale_id = params[:sale_id] + @trans_flag = true + if params[:type] == "transaction" @trans_flag = false @cashier_type = "cashier" @@ -241,201 +263,111 @@ class Origami::PaymentsController < BaseOrigamiController @cashier_type = params[:type] end - if path.include? ("credit_payment") - @sale_payment = SalePayment.where(sale_id: sale_id, payment_method: 'creditnote').select("SUM(payment_amount) as payment_amount") + if path.include? 'credit_payment' + @sale_payment = false + @amount_due = @sale.sale_payments.where(payment_method: 'creditnote').pluck('SUM(payment_amount)').first + payments = @sale.sale_payments.joins(:sale_audit).group_by(&:payment_method).map { |method, payments| [method, payments.sum { |payment| payment.payment_amount }] } + else + @sale_payment = true + @amount_due = @sale.grand_total + payments = @sale.sale_payments.left_joins(:sale_audit).where(sale_audits: {sale_audit_id: nil}).group_by(&:payment_method).map { |method, payments| [method, payments.sum { |payment| payment.payment_amount }] } end - @member_discount = MembershipSetting.find_by_discount(1) - @membership_rebate_balance=0 + @payment_methods = PaymentMethodSetting.where(is_active: true).pluck(:payment_method) + @cash = payments.inject(0) { |sum, payment| sum + payment[1] if payment[0] == 'cash' } + @credit = payments.inject(0) { |sum, payment| sum + payment[1] if payment[0] == 'creditnote' } + @other_payments = payments.select { |payment| !['cash', 'creditnote'].include? payment[0] }.map { |method, amount| [ @payment_methods.find { |payment_method| payment_method.parameterize == method }, amount ] } + @other_payment = @other_payments.sum { |payment| payment[1] } - if Sale.exists?(sale_id) - @cash = 0.0 - @kbz_pay_amount = 0.0 - @other = 0.0 - @ppamount = 0.0 - @visacount= 0.0 - @jcbcount= 0.0 - @mastercount = 0.0 - @unionpaycount = 0.0 - @alipaycount = 0.0 - @junctionpaycount = 0.0 - @credit = 0.0 - @paymalcount = 0.0 - @dingacount = 0.0 - @giftvouchercount = 0.0 - @sale_data = Sale.find_by_sale_id(sale_id) - @balance = 0 - @accountable_type = '' - @table_no = '' - @dining = '' - @other_payment = 0.0 - @pdf_view = nil - @lookup_pdf = Lookup.find_by_lookup_type("ReceiptPdfView") - if !@lookup_pdf.nil? - @pdf_view = @lookup_pdf.value - end + #total customer with individual total amount + @individual_total = Array.new + if !@sale.equal_persons.nil? + per_person_amount = @sale.grand_total / @sale.equal_persons.to_i + @individual_total.push({'total_customer' => @sale.equal_persons.to_i, 'per_person_amount' => per_person_amount }) + end - amount = SalePayment.get_kbz_pay_amount(sale_id, current_user) - @kbz_pay_amount += amount.to_f - - #for changable on/off - @changable_tax = true - lookup_changable_tax = Lookup.collection_of('changable_tax') - if !lookup_changable_tax.empty? - lookup_changable_tax.each do |changable_tax| - if changable_tax[0].downcase == "change" - if changable_tax[1] == '0' - @changable_tax = false - end + #for changable on/off + @changable_tax = true + lookup_changable_tax = Lookup.collection_of('changable_tax') + if !lookup_changable_tax.empty? + lookup_changable_tax.each do |changable_tax| + if changable_tax[0].downcase == "change" + if changable_tax[1] == '0' + @changable_tax = false end end end + end - @shop = shop_detail #show shop info + # get printer info + @print_settings = PrintSetting.get_precision_delimiter() - @customer_lists = Customer.where(name: ["WALK-IN", "TAKEAWAY"]) + @pdf_view = nil + @lookup_pdf = Lookup.find_by_lookup_type("ReceiptPdfView") + if !@lookup_pdf.nil? + @pdf_view = @lookup_pdf.value + end - saleObj = Sale.find(sale_id) + # amount = SalePayment.get_kbz_pay_amount(sale_id, current_user) + # @kbz_pay_amount += amount.to_f - #total customer with individual total amount - @individual_total = Array.new - if !saleObj.equal_persons.nil? - per_person_amount = saleObj.grand_total.to_f / saleObj.equal_persons.to_i - @individual_total.push({'total_customer' => saleObj.equal_persons.to_i, 'per_person_amount' => per_person_amount.to_f }) + # rounding adjustment + # if @shop.is_rounding_adj + # a = saleObj.grand_total % 25 # Modulus + # b = saleObj.grand_total / 25 # Division + # #not calculate rounding if modulus is 0 and division is even + # #calculate rounding if modulus is zero or not zero and division are not even + # if (a != 0.0 && b%2 != 0.0) || (a==0.0 && b%2 !=0) + # new_total = Sale.get_rounding_adjustment(saleObj.grand_total) + # @rounding_adj = new_total-saleObj.grand_total + # saleObj.update_attributes(grand_total: new_total,old_grand_total: saleObj.grand_total,rounding_adjustment:@rounding_adj) + # @sale_data.grand_total = new_total + # @sale_data.old_grand_total = saleObj.grand_total + # @sale_data.rounding_adjustment = @rounding_adj + # else + # @rounding_adj = @sale_data.rounding_adjustment + # end + # else + # @rounding_adj = @sale_data.rounding_adjustment + # end + #end rounding adjustment + + # accounts = @customer.tax_profiles + accounts = TaxProfile.where("group_type = ?",@cashier_type).order("order_by ASC") + @account_arr =[] + @tax_arr =[] + + accounts.each do |acc| + account = TaxProfile.find(acc.id) + # @account_arr.push(account) + @tax_arr.push(account.name) + end + + sale_taxes = @sale.sale_taxes + if !sale_taxes.empty? + sale_taxes.each do |sale_tax| + @account_arr.push(sale_tax) end + end - # rounding adjustment - # if @shop.is_rounding_adj - # a = saleObj.grand_total % 25 # Modulus - # b = saleObj.grand_total / 25 # Division - # #not calculate rounding if modulus is 0 and division is even - # #calculate rounding if modulus is zero or not zero and division are not even - # if (a != 0.0 && b%2 != 0.0) || (a==0.0 && b%2 !=0) - # new_total = Sale.get_rounding_adjustment(saleObj.grand_total) - # @rounding_adj = new_total-saleObj.grand_total - # else - # @rounding_adj = @sale_data.rounding_adjustment - # end - # else - # @rounding_adj = @sale_data.rounding_adjustment - # end - #end rounding adjustment + rebate = MembershipSetting.find_by_rebate(1) - # rounding adjustment - if @shop.is_rounding_adj - a = saleObj.grand_total % 25 # Modulus - b = saleObj.grand_total / 25 # Division - #not calculate rounding if modulus is 0 and division is even - #calculate rounding if modulus is zero or not zero and division are not even - if (a != 0.0 && b%2 != 0.0) || (a==0.0 && b%2 !=0) - new_total = Sale.get_rounding_adjustment(saleObj.grand_total) - @rounding_adj = new_total-saleObj.grand_total - saleObj.update_attributes(grand_total: new_total,old_grand_total: saleObj.grand_total,rounding_adjustment:@rounding_adj) - @sale_data.grand_total = new_total - @sale_data.old_grand_total = saleObj.grand_total - @sale_data.rounding_adjustment = @rounding_adj - else - @rounding_adj = @sale_data.rounding_adjustment - end - else - @rounding_adj = @sale_data.rounding_adjustment - end - #end rounding adjustment - - # get printer info - @print_settings = PrintSetting.get_precision_delimiter() - - #get customer amount - @customer = Customer.find(@sale_data.customer_id) - # accounts = @customer.tax_profiles - accounts = TaxProfile.where("group_type = ?",@cashier_type).order("order_by ASC") - @account_arr =[] - @tax_arr =[] - accounts.each do |acc| - account = TaxProfile.find(acc.id) - # @account_arr.push(account) - @tax_arr.push(account.name) - end - sale_taxes = SaleTax.where("sale_id = ?", saleObj.sale_id) - if !sale_taxes.empty? - sale_taxes.each do |sale_tax| - @account_arr.push(sale_tax) - end - end - rebate = MembershipSetting.find_by_rebate(1) - # get member information - if @customer.membership_id != nil && rebate - response = Customer.get_member_account(@customer) - if response["status"]==true - response["account_data"].each do |res| + # get member information + @balance = 0 + @accountable_type = '' + if @customer.membership_id != nil && rebate + response = Customer.get_member_account(@customer) + if response["status"]==true + response["account_data"].each do |res| if res["accountable_type"] == "RebateAccount" || res["accountable_type"] == "RebatebonusAccount" @balance = @balance.to_f + res["balance"].to_f # @accountable_type = res["accountable_type"] @accountable_type = "Rebate Balance" end end - end - end - - #end customer amount - - #paymal payment - - @sale_data.bookings.each do |sbk| - if sbk.dining_facility_id.to_i >0 - df = DiningFacility.find(sbk.dining_facility_id) - @table_no = df.type + ' ' + df.name - @checkin_time = sbk.checkin_at - @dining = df - break - else - @table_no = nil - @checkin_time = nil - @dining = nil - end - end - - if path.include? ("credit_payment") - @sale_payment_data = SalePayment.get_sale_payment_for_credit(@sale_data) - else - @sale_payment_data = SalePayment.get_sale_payments(@sale_data) - end - @sale_payment_data.each do |spay| - if spay.payment_method == "cash" - @cash += spay.payment_amount - end - if spay.payment_method !="creditnote" - @other_payment += spay.payment_amount - end - - if spay.payment_method == "mpu" - @other += spay.payment_amount - elsif spay.payment_method == "paypar" - @ppamount += spay.payment_amount - elsif spay.payment_method == "visa" - @visacount += spay.payment_amount - elsif spay.payment_method == "jcb" - @jcbcount += spay.payment_amount - elsif spay.payment_method == "master" - @mastercount += spay.payment_amount - elsif spay.payment_method == "unionpay" - @unionpaycount += spay.payment_amount - elsif spay.payment_method == "JunctionPay" - @junctionpaycount += spay.payment_amount - elsif spay.payment_method == "creditnote" - @credit += spay.payment_amount - elsif spay.payment_method == "paymal" - @paymalcount += spay.payment_amount - elsif spay.payment_method == "alipay" - @alipaycount += spay.payment_amount - elsif spay.payment_method == "dinga" - @dingacount += spay.payment_amount - elsif spay.payment_method == "giftvoucher" - @giftvouchercount += spay.payment_amount - end - end end + #end customer amount end def reprint diff --git a/app/controllers/origami/shifts_controller.rb b/app/controllers/origami/shifts_controller.rb index f28c1428..be13f2d0 100755 --- a/app/controllers/origami/shifts_controller.rb +++ b/app/controllers/origami/shifts_controller.rb @@ -112,7 +112,7 @@ class Origami::ShiftsController < BaseOrigamiController @total_takeway = ShiftSale.get_total_takeway(@shift).total_takeway_amount @total_other_charges = ShiftSale.get_total_other_charges(@shift).total_other_charges_amount @total_credit_payments = ShiftSale.get_shift_sales_with_credit_payment(shift_id).total_credit_payments - + @payment_methods = PaymentMethodSetting.where("is_active='1'").pluck("payment_method") # get printer info print_settings = PrintSetting.find_by_unique_code(unique_code) printer = Printer::CashierStationPrinter.new(print_settings) @@ -125,7 +125,7 @@ class Origami::ShiftsController < BaseOrigamiController end find_close_cashier_print = Lookup.collection_of('close_cashier_print') if find_close_cashier_print[0][1].to_i > 0 - printer.print_close_cashier(print_settings,cashier_terminal,@shift, @sale_items, @total_other_charges_info, shop_details,@sale_taxes,@other_payment,@total_amount_by_account,@total_discount_by_account,@total_member_discount,@total_dinein,@total_takeway,@total_other_charges,@total_waste,@total_spoile,@total_credit_payments) + printer.print_close_cashier(print_settings,cashier_terminal,@shift, @sale_items, @total_other_charges_info, shop_details,@sale_taxes,@other_payment,@total_amount_by_account,@total_discount_by_account,@total_member_discount,@total_dinein,@total_takeway,@total_other_charges,@total_waste,@total_spoile,@total_credit_payments,@payment_methods) end end end diff --git a/app/controllers/renew_license_controller.rb b/app/controllers/renew_license_controller.rb new file mode 100644 index 00000000..7ef245fe --- /dev/null +++ b/app/controllers/renew_license_controller.rb @@ -0,0 +1,17 @@ +class RenewLicenseController < ApplicationController + + def expire + @license = current_license + @plan = @license.read_license("plan_name") + @bis_name = @license.read_license_no_decrypt("shop_name") + @expired_at = @license.read_license("renewable_date") + @license_status = @license.detail_with_local_file + end + + def renew + status, message = current_license.verify_license + + redirect_to expire_url(message: message, status: status) + end + +end \ No newline at end of file diff --git a/app/controllers/reports/payment_method_controller.rb b/app/controllers/reports/payment_method_controller.rb index 414c4e07..752a2f4e 100644 --- a/app/controllers/reports/payment_method_controller.rb +++ b/app/controllers/reports/payment_method_controller.rb @@ -1,28 +1,30 @@ -class Reports::PaymentMethodController < BaseReportController +class Reports::PaymentMethodController < BaseReportController # authorize_resource :class => false def index - @payments = [["All Payment",''],["Cash Payment","cash"], ["KBZ Payment", KbzPay::KBZ_PAY], ["Credit Payment","creditnote"], - ["FOC Payment","foc"], ["MPU Payment","mpu"], ["Visa Payment","visa"], - ["Master Payment","master"], ["JCB Payment","jcb"],["UnionPay Payment","unionpay"], - ["Alipay Payment","alipay"],["Paymal Payment", "paymal"],["Dinga Payment","dinga"], - ["JunctionPay","junctionpay"],["Redeem Payment","paypar"],["Gift Voucher","giftvoucher"]] + @payment_methods = PaymentMethodSetting.where("is_active='1'").pluck("payment_method") + + @payments = [["All Payment",''],["Cash Payment","cash"], ["Credit Payment","creditnote"], + ["FOC Payment","foc"]] + + @payment_methods.each do |m| + @payments.push(["#{m} Payment", m.parameterize]) + end from, to = get_date_range_from_params - @shift_sale_range = Sale.get_by_shift_sale_by_item(from,to,Sale::SALE_STATUS_COMPLETED) @shift = '' if params[:shift_name].to_i != 0 shift_sale = ShiftSale.find(params[:shift_name]) - if to.blank? + if to.blank? @shift = ShiftSale.where('shift_started_at = ? and shift_closed_at is NULL ',shift_sale.shift_started_at) else - @shift = ShiftSale.where('shift_started_at = ? and shift_closed_at = ? ',shift_sale.shift_started_at, shift_sale.shift_closed_at) + @shift = ShiftSale.where('shift_started_at = ? and shift_closed_at = ? ',shift_sale.shift_started_at, shift_sale.shift_closed_at) end end @payment_type = params[:payment_type] - @sale_data,@pyament_method = Sale.get_payment_method_by_shift(@shift_sale_range,@shift,from,to,@payment_type) + @sale_data,@pyament_method = Sale.get_payment_method_by_shift(@shift,from,to,@payment_type) @from = from @to = to # get printer info @@ -58,10 +60,10 @@ class Reports::PaymentMethodController < BaseReportController end out = {:status => 'ok', :message => date_arr} - + respond_to do |format| format.json { render json: out } end end -end \ No newline at end of file +end diff --git a/app/controllers/reports/shiftsale_controller.rb b/app/controllers/reports/shiftsale_controller.rb index 0c42a05f..ce927f8e 100755 --- a/app/controllers/reports/shiftsale_controller.rb +++ b/app/controllers/reports/shiftsale_controller.rb @@ -80,6 +80,7 @@ class Reports::ShiftsaleController < BaseReportController @total_spoile = Sale.get_total_spoile(shift_id).sum(:grand_total) #other payment details for mpu or visa like card @other_payment = ShiftSale.get_by_shift_other_payment(@shift) + @payment_methods = PaymentMethodSetting.where("is_active='1'").pluck("payment_method") # Calculate price_by_accounts @total_amount_by_account = ShiftSale.calculate_total_price_by_accounts(@shift,'amount') @@ -95,8 +96,8 @@ class Reports::ShiftsaleController < BaseReportController printer = Printer::CashierStationPrinter.new(print_settings) # printer.print_close_cashier(print_settings,cashier_terminal,@shift, nil, shop_details,@sale_taxes,@other_payment,@total_amount_by_account,@total_discount_by_account,@total_member_discount,@total_dinein,@total_takeway,@total_other_charges,@total_waste,@total_spoile,@total_credit_payments) - printer.print_close_cashier(print_settings,cashier_terminal,@shift, @sale_items, @total_other_charges_info, shop_details,@sale_taxes,@other_payment,@total_amount_by_account,@total_discount_by_account,@total_member_discount,@total_dinein,@total_takeway,@total_other_charges,@total_waste,@total_spoile,@total_credit_payments) - + printer.print_close_cashier(print_settings,cashier_terminal,@shift, @sale_items, @total_other_charges_info, shop_details,@sale_taxes,@other_payment,@total_amount_by_account,@total_discount_by_account,@total_member_discount,@total_dinein,@total_takeway,@total_other_charges,@total_waste,@total_spoile,@total_credit_payments,@payment_methods) + respond_to do |format| format.html { redirect_to '/en/reports/shiftsale/', notice: 'Printing Completed.'} format diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 16e44953..93664fef 100755 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -5,8 +5,8 @@ module ApplicationHelper case level when :notice then "alert alert-info fade-in" when :success then "alert alert-success fade-in" - when :error then "alert alert-error fade-in" - when :alert then "alert alert-error fade-in" + when :error then "alert alert-warning fade-in" + when :alert then "alert alert-danger fade-in" end end diff --git a/app/models/card_sale_tran.rb b/app/models/card_sale_tran.rb index ea76e45a..ba624d0e 100644 --- a/app/models/card_sale_tran.rb +++ b/app/models/card_sale_tran.rb @@ -67,7 +67,6 @@ class CardSaleTran < ApplicationRecord shift_closed_at As closing_date,") .order("shift_sales.id DESC") return query = query.where("shift_sales.shift_started_at >= ?" , from) - byebug end end \ No newline at end of file diff --git a/app/models/card_settle_tran.rb b/app/models/card_settle_tran.rb index 2f087ef3..dd526020 100644 --- a/app/models/card_settle_tran.rb +++ b/app/models/card_settle_tran.rb @@ -64,6 +64,5 @@ class CardSettleTran < ApplicationRecord shift_closed_at As closing_date,") .order("shift_sales.id DESC") return query = query.where("shift_sales.shift_started_at >= ?" , from) - byebug end end diff --git a/app/models/inventory_definition.rb b/app/models/inventory_definition.rb index fc535853..a7f91477 100755 --- a/app/models/inventory_definition.rb +++ b/app/models/inventory_definition.rb @@ -1,5 +1,8 @@ class InventoryDefinition < ApplicationRecord + has_many :stock_journals + has_one :menu_item_instance, foreign_key: "item_instance_code", primary_key: "item_code" + scope :active, -> {where(:is_active => true)} def self.calculate_product_count(saleObj=nil,saleobj_after_req_bill=nil) @@ -69,7 +72,7 @@ class InventoryDefinition < ApplicationRecord end def self.search_by_category(cat_id) - @inventory_definitions = InventoryDefinition.select("inventory_definitions.*, + inventory_definitions = InventoryDefinition.select("inventory_definitions.*, mi.name as item_name,mii.item_instance_name as instance_name," + "mi.item_code as item_code,mii.item_instance_code as instance_code," + "mc.name as menu_category_name,mc.id as menu_category_id ") @@ -82,27 +85,29 @@ class InventoryDefinition < ApplicationRecord end def self.get_by_category(filter) - least_stock = StockJournal.select(:balance).joins("JOIN inventory_definitions ON stock_journals.item_code = inventory_definitions.item_code").order(:id => :desc).limit(1).to_sql + least_stock = StockJournal.select(:inventory_definition_id, :credit, :debit, :balance) + .joins("JOIN ( + #{StockJournal.select("item_code, MAX(created_at) created_at").group(:item_code).to_sql}) last_stock_journals + ON last_stock_journals.item_code = stock_journals.item_code + AND last_stock_journals.created_at = stock_journals.created_at").to_sql - @inventory_definitions = InventoryDefinition.select("inventory_definitions.*, - (CASE WHEN sj.credit IS NULL THEN 0 ELSE sj.credit END) as credit, - (CASE WHEN sj.debit IS NULL THEN 0 ELSE sj.debit END) as debit, - (#{least_stock}) as balance,"+ - "acc.title as account_name,mi.name as item_name, - mii.item_instance_name as instance_name," + - "mc.name as menu_category_name,mc.id as menu_category_id " - ) - .joins(" LEFT JOIN stock_journals sj ON sj.inventory_definition_id=inventory_definitions.id") - .joins("JOIN menu_item_instances mii ON mii.item_instance_code = inventory_definitions.item_code" + - " JOIN menu_items mi ON mi.id = mii.menu_item_id" + - " JOIN menu_categories mc ON mc.id = mi.menu_category_id ") - .joins(" JOIN accounts acc ON acc.id = mi.account_id") - .where("inventory_definitions.item_code LIKE ? OR inventory_definitions.min_order_level LIKE ? - OR inventory_definitions.max_stock_level LIKE ? OR sj.balance LIKE ? OR mi.name LIKE ? - OR mii.item_instance_name LIKE ? OR mc.name LIKE ?","%#{filter}%","%#{filter}%","%#{filter}%", - "%#{filter}%","%#{filter}%","%#{filter}%","%#{filter}%") - .group("mi.menu_category_id,inventory_definitions.item_code") - .order("balance asc, mi.name asc,acc.title desc,mi.menu_category_id desc") + inventory_definitions = InventoryDefinition + .select("inventory_definitions.*, + stock_journals.credit as credit, + stock_journals.debit as debit, + stock_journals.balance as balance, + accounts.title as account_name, + menu_items.name as item_name, + menu_item_instances.item_instance_name as instance_name, + menu_categories.name as menu_category_name, + menu_categories.id as menu_category_id") + .joins("LEFT JOIN (#{least_stock}) stock_journals on stock_journals.inventory_definition_id = inventory_definitions.id") + .joins(menu_item_instance: { menu_item: [:menu_category, :account]}) + .where("inventory_definitions.item_code LIKE :filter OR inventory_definitions.min_order_level LIKE :filter + OR inventory_definitions.max_stock_level LIKE :filter OR stock_journals.balance LIKE :filter OR menu_items.name LIKE :filter + OR menu_item_instances.item_instance_name LIKE :filter OR menu_categories.name LIKE :filter", filter: "%#{filter}%") + .group("menu_items.menu_category_id, inventory_definitions.item_code") + .order("balance asc, menu_items.name asc, accounts.title desc, menu_items.menu_category_id desc") end end diff --git a/app/models/license.rb b/app/models/license.rb index 2c550a1e..92781a22 100755 --- a/app/models/license.rb +++ b/app/models/license.rb @@ -1,12 +1,15 @@ +require 'yaml' + class License include HTTParty + include ActionDispatch::Http - base_uri "connect.smartsales.asia/api" + base_uri "https://l.doemal.app//api" attr_accessor :name, :address_1, :address_2, :township, :city, :country, :email, :phone, :fax, :logo, :subdomain, :plan_activation_date, :plan_next_renewal_date, :plan_max_products,:plan_max_customers, :plan_active_connections, :dbhost, :dbschema, :dbusername, :dbpassword, :exchange_unqiue_id, :localqueue_host,:server_mode,:localhost_address, - :localqueue_user, :localqueue_password, :remotequeue_host, :remotequeue_user, :remotequeue_password, :api_token, :app_token + :localqueue_user, :localqueue_password, :remotequeue_host, :remotequeue_user, :remotequeue_password, :api_token, :app_token, :lookup @license = nil @secret = nil @@ -14,14 +17,17 @@ class License def initialize(server = "", lookup = "") #this code is hard-code to reflect server mode - Very important. self.server_mode = ENV["SERVER_MODE"] - + unless ENV["SERVER_MODE"] == "cloud" + self.server_mode = "application" + end + self.lookup = lookup if (server != "") self.class.base_uri server end end # For Cloud - def detail_with_local_cache(lookup) + def detail_with_local_cache aes = MyAesCrypt.new aes_key, aes_iv = aes.export_to_file(lookup) @@ -69,65 +75,75 @@ class License end # For Local System - def detail_with_local_file() - renewal_date_str = read_license("renewable_date") - if check_expiring(renewal_date_str) - # return for all ok - return 1 + def detail_with_local_file + if expired? + return 0 + elsif expire_in?(10) + return 2 else - has_license = verify_license() - if has_license - # return for expiring - return 2 - else - return 0 - end + return 1 end - # end end # License Activation def license_activate (shop, license_key, db_host, db_schema, db_user, db_password) + aes = MyAesCrypt.new aes_key, aes_iv = aes.export_key(license_key) @params = { query: { lookup_type: self.server_mode, iv_key: aes_iv, license_key: license_key } } - response = self.class.get("/activate", @params) - @activate = response.parsed_response - if (@activate["status"]) - ##Check from local redis - if available load local otherwise get from remote - cache_key = "shop:#{@activate["shop_name"]}" + begin + response = self.class.get("/activate", @params) + @activate = response.parsed_response - cache_license = nil + if (@activate["status"]) - ##Get redis connection from connection pool - redis = Redis.new - cache_license = redis.get(cache_key) + ##Check from local redis - if available load local otherwise get from remote + cache_key = "shop:#{@activate["shop_name"]}" - Rails.logger.info "Cache key - " + cache_key.to_s + ##Get redis connection from connection pool + # redis = Redis.new + # cache_license = redis.get(cache_key) - if cache_license.nil? + Rails.logger.info "Cache key - " + cache_key.to_s + + # if cache_license.nil? cache = {"shop" => @activate["shop_name"], "key" => aes_key, "iv" => @activate["iv_key"], "renewable_date" => @activate["renewable_date"] } redis = Redis.new redis.set(cache_key, Marshal.dump(cache)) - end + # end - Rails.logger.info "License - " + response.parsed_response.to_s + Rails.logger.info "License - " + response.parsed_response.to_s - response = create_license_file(@activate) - if(response[:status]) - #sym_path = "/home/user/symmetric/" - sym_path = File.expand_path("~/symmetric/") - - response = create_symmetric_config(sym_path, db_host, db_schema, db_user, db_password) + response = create_license_file(@activate) if(response[:status]) - response = run_symmetric(sym_path) + #sym_path = "/home/user/symmetric/" + sym_path = File.expand_path("~/symmetric/") + + response = create_symmetric_config(sym_path, db_host, db_schema, db_user, db_password) + + if(response[:status]) + response = run_symmetric(sym_path) + end end + else + response = { "status": false, "message": "Activation Failed! Please contact code2lab call center!"} end - else - response = { "status": false, "message": "Activation Failed! Please contact code2lab call center!"} + + rescue SocketError => e + Rails.logger.debug "In SocketError No Internet connection !" + response = { "status": false, "message": "In SocketError No Internet connection !"} + rescue HTTParty::Error + Rails.logger.debug "Server Error HTTParty" + response = { "status": false, "message": "Server Error HTTParty"} + rescue Net::OpenTimeout + Rails.logger.debug "connection Timeout" + response = { "status": false, "message": "Connection Timeout"} + rescue OpenURI::HTTPError + Rails.logger.debug "Can't connect server" + response = { "status": false, "message": "Can't connect server"} end return response end @@ -135,18 +151,26 @@ class License def verify_license api_token = read_license_no_decrypt("api_token") @params = { query: {lookup_type: "application", api_token: api_token} } + old_renewable_date = read_license("renewable_date") begin - response = self.class.get("/verify", @params) - @varified = response.parsed_response - Rails.logger.debug "License Remote Response - " + response.parsed_response.to_s - if (@varified["status"]) - if (!check_expired(@varified["renewable_date"])) - return true - end - else - delete_license_file + response = self.class.get("/verify", @params) + @varified = response.parsed_response + Rails.logger.debug "License Remote Response - " + response.parsed_response.to_s + if (@varified["status"]) + if old_renewable_date.to_date == @varified['renewable_date'].to_date + message = "*** License can't be verified. ***" + status = 2 + elsif old_renewable_date.to_date < @varified['renewable_date'].to_date + update_license("renewable_date", @varified['renewable_date']) + status = 1 + message = "*** License con be verified. ***" end + return status, message + + else + delete_license_file + end rescue SocketError => e Rails.logger.debug "In SocketError No Internet connection ! " @@ -164,12 +188,23 @@ class License return false end - - # Check Expired before 30 days - def check_expiring(renewal_date_str) - if !renewal_date_str.empty? + def expired? + if renewal_date_str = read_license("renewable_date") renewal_date = DateTime.parse(renewal_date_str) - renewal_date > Date.today.advance(:days => 30) + renewal_date < Date.today + end + end + + def expire_in?(days) + if renewal_date_str = read_license("renewable_date") + renewal_date = DateTime.parse(renewal_date_str) + renewal_date < days.days.from_now + end + end + + def days_to_expire + if renewal_date_str = read_license("renewable_date") + Date.today - DateTime.parse(renewal_date_str).to_date end end @@ -188,39 +223,59 @@ class License end end + def check_license_subdomain + aes = MyAesCrypt.new + aes_key, aes_iv = aes.export_key(lookup) + + params = { query: { lookup_type: "cloud", lookup: lookup, iv_key: aes_iv} } + response = self.class.get("/subdomain", params) + response.parsed_response["status"] + end + # Check License File exists - def self.check_license_file - return File.exist?("config/license.yml") + def self.check_license_file(lookup) + return unless File.exist?("config/license.yml") + if license = YAML.load_file("config/license.yml") + if license[lookup].nil? + if ENV["SERVER_MODE"] == "application" + license[lookup] = license.values.first + else + tld_length = Rails.application.config.action_dispatch.tld_length + subdomains = URL.extract_subdomains(lookup, tld_length) + if key = license.keys.find { |k| URL.extract_subdomains(k, tld_length).last == subdomains.last} + license[lookup] = license[key] + end + end + if license[lookup] + File.open("config/license.yml", "w") { |file| file.write license.to_yaml } + end + end + return license[lookup] + end end # read line by key for license file def read_license(key_name) - decrypted_line = "" key, iv = get_redis_key() if File.exist?("config/license.yml") - File.open("config/license.yml").each do |line| - if line.include? (key_name) - decrypted_line_array = line.split(": ") - decrypted_line = AESCrypt.decrypt_data(decode_str(decrypted_line_array[1]), decode_str(key), decode_str(iv), ENV['CIPHER_TYPE']) + if license = YAML.load(File.read("config/license.yml")) + if license[lookup] + AESCrypt.decrypt_data(decode_str(license[lookup][key_name]), decode_str(key), decode_str(iv), ENV['CIPHER_TYPE']) end end end - return decrypted_line end # read line by key for license file without decrypt def read_license_no_decrypt(key) - decrypted_line = "" if File.exist?("config/license.yml") - File.open("config/license.yml").each do |line| - if line.include? (key) - decrypted_line_array = line.split(": ") - decrypted_line = decrypted_line_array[1] + if license = YAML.load_file("config/license.yml") + if license[lookup] + decrypted_line = license[lookup][key] end end end - return decrypted_line end # Update license file for line @@ -231,18 +286,13 @@ class License crypted_str = AESCrypt.encrypt_data(new_content, decode_str(key), decode_str(iv), ENV['CIPHER_TYPE']) end - content_str = read_license_no_decrypt(content) if File.exist?("config/license.yml") - file_str = File.read("config/license.yml") - new_file_str = file_str.gsub(content_str, encode_str(crypted_str)) + if license = YAML.load_file("config/license.yml") + license[lookup][content] = encode_str(crypted_str) - # To write changes to the file, use: - File.open("config/license.yml", "w") {|file| file.puts new_file_str } - - # File.open("config/license.yml").each do |line| - # new_file_str = line.gsub(content, crypted_str) - # f.put - # end + # To write changes to the file, use: + File.open("config/license.yml", "w") {|file| file.write(license.to_yaml) } + end end end @@ -284,8 +334,6 @@ class License ##Check from local redis - if available load local otherwise get from remote cache_key = "shop:#{shop.chomp}" - cache_shop = nil - ##Get redis connection from connection pool redis = Redis.new cache_shop = redis.get(cache_key) @@ -308,29 +356,38 @@ class License # License File Creation def create_license_file(response_data) - if File.exist?("config/license.yml") - delete_license_file - end - begin # Licese File Creation - File.open("config/license.yml", "w") do |f| - f.puts("iv_key: #{response_data['iv_key']}") - f.puts("shop_name: #{response_data['shop_name']}") - f.puts("email: #{response_data['email']}") - f.puts("telephone: #{response_data['telephone']}") - f.puts("fax: #{response_data['fax']}") - f.puts("address: #{response_data['address']}") - f.puts("dbhost: #{response_data['dbhost']}") - f.puts("dbschema: #{response_data['dbschema']}") - f.puts("dbusername: #{response_data['dbusername']}") - f.puts("dbpassword: #{response_data['dbpassword']}") - f.puts("api_token: #{response_data['api_token']}") - f.puts("app_token: #{response_data['app_token']}") - f.puts("plan_sku: #{response_data['plan_sku']}") - f.puts("renewable_date: #{response_data['renewable_date']}") - f.puts("plan_name: #{response_data['plan_name']}") + config = { "iv_key" => response_data['iv_key'], + "shop_name" => response_data['shop_name'], + "email" => response_data['email'], + "telephone" => response_data['telephone'], + "fax" => response_data['fax'], + "address" => response_data['address'], + "dbhost" => response_data['dbhost'], + "dbschema" => response_data['dbschema'], + "dbusername" => response_data['dbusername'], + "dbpassword" => response_data['dbpassword'], + "api_token" => response_data['api_token'], + "app_token" => response_data['app_token'], + "plan_sku" => response_data['plan_sku'], + "renewable_date" => response_data['renewable_date'], + "plan_name" => response_data['plan_name'] } + + if File.exist?("config/license.yml") + license = YAML.load_file("config/license.yml") end + + if license + license.each do |k,v| + license[k] = config if v["shop_name"] == config["shop_name"] + end + license[lookup] = config + end + + license ||= {lookup => config} + + File.open("config/license.yml", "w"){ |file| file.write(license.to_yaml) } rescue IOError response = { "status": false, "message": "Activation is success but something is wrong. \n Please contact code2lab call center!"} end @@ -387,10 +444,10 @@ class License # f.write("initial.load.use.extract.job.enabled=true\n") f.close rescue IOError - response = { "status": false, "message": "Activation is success but something is wrong. \n Please contact code2lab call center!"} + return { "status": false, "message": "Activation is success but something is wrong. \n Please contact code2lab call center!"} end - response = { "status": true, "message": "Success Activation. License also created."} end + { "status": true, "message": "Success Activation. License also created." } end # Run Symmetric diff --git a/app/models/printer/cashier_station_printer.rb b/app/models/printer/cashier_station_printer.rb index 5e37164f..63ffc53e 100755 --- a/app/models/printer/cashier_station_printer.rb +++ b/app/models/printer/cashier_station_printer.rb @@ -38,7 +38,7 @@ class Printer::CashierStationPrinter < Printer::PrinterWorker # self.print(filename, cashier_terminal.printer_name) # end - def print_close_cashier(printer_settings,cashier_terminal,shift_sale, sale_items, total_other_charges_info,shop_details,sale_taxes,other_payment,amount,discount,member_discount,total_dinein,total_takeway,total_other_charges,total_waste,total_spoile,total_credit_payments) + def print_close_cashier(printer_settings,cashier_terminal,shift_sale, sale_items, total_other_charges_info,shop_details,sale_taxes,other_payment,amount,discount,member_discount,total_dinein,total_takeway,total_other_charges,total_waste,total_spoile,total_credit_payments,payment_methods) if !sale_items.blank? or !sale_items.nil? @account_cate_count = Hash.new {|hash, key| hash[key] = 0} @@ -59,7 +59,7 @@ class Printer::CashierStationPrinter < Printer::PrinterWorker cashier = shift_sale.employee.name shift_name = shift_sale.shift_started_at.utc.getlocal.strftime("%d-%m-%Y %I:%M %p") + "_" + shift_sale.shift_closed_at.utc.getlocal.strftime("%d-%m-%Y %I:%M %p") filename = "tmp/close_cashier_#{cashier}_#{shift_name}.pdf" - pdf = CloseCashierPdf.new(printer_settings,shift_sale, sale_items, total_other_charges_info, @account_cate_count, @menu_cate_count, @totalByAccount, shop_details,sale_taxes,other_payment,amount,discount,member_discount,total_dinein,total_takeway,total_other_charges,total_waste,total_spoile,total_credit_payments) + pdf = CloseCashierPdf.new(printer_settings,shift_sale, sale_items, total_other_charges_info, @account_cate_count, @menu_cate_count, @totalByAccount, shop_details,sale_taxes,other_payment,amount,discount,member_discount,total_dinein,total_takeway,total_other_charges,total_waste,total_spoile,total_credit_payments,payment_methods) close_cashier_pdf = Lookup.collection_of("print_settings") #print_settings with name:CloseCashierPdf if !close_cashier_pdf.empty? @@ -68,7 +68,7 @@ class Printer::CashierStationPrinter < Printer::PrinterWorker if close_cashier[1] == '1' pdf = CloseCashierCustomisePdf.new(printer_settings,shift_sale,shop_details,sale_taxes,other_payment,amount,discount,member_discount,total_dinein,total_takeway,total_other_charges,total_waste,total_spoile,total_credit_payments) else - pdf = CloseCashierPdf.new(printer_settings,shift_sale, sale_items, total_other_charges_info, @account_cate_count, @menu_cate_count, @totalByAccount, shop_details,sale_taxes,other_payment,amount,discount,member_discount,total_dinein,total_takeway,total_other_charges,total_waste,total_spoile,total_credit_payments) + pdf = CloseCashierPdf.new(printer_settings,shift_sale, sale_items, total_other_charges_info, @account_cate_count, @menu_cate_count, @totalByAccount, shop_details,sale_taxes,other_payment,amount,discount,member_discount,total_dinein,total_takeway,total_other_charges,total_waste,total_spoile,total_credit_payments,payment_methods) end end end diff --git a/app/models/printer/receipt_printer.rb b/app/models/printer/receipt_printer.rb index 4d96112f..ac3e6f3f 100755 --- a/app/models/printer/receipt_printer.rb +++ b/app/models/printer/receipt_printer.rb @@ -119,11 +119,15 @@ class Printer::ReceiptPrinter < Printer::PrinterWorker if count == 1 filename = directory_name + "/receipt_bill_#{sale_data.receipt_no}.pdf" pdf.render_file filename - if printed_status != 'Paid' + if printed_status != 'Paid' && printed_status != 'credit_payment' #no print in cloud server if ENV["SERVER_MODE"] != "cloud" self.print(directory_name + "/receipt_bill_#{sale_data.receipt_no}.pdf", cashier_terminal.printer_name) end + elsif printed_status == 'credit_payment' + filename = directory_name + "/receipt_bill_credit_#{sale_data.receipt_no}.pdf" + pdf.render_file filename + self.print(directory_name + "/receipt_bill_credit_#{sale_data.receipt_no}.pdf", cashier_terminal.printer_name) end else filename = directory_name + "/receipt_bill_#{sale_data.receipt_no}_#{count}.pdf" diff --git a/app/models/sale.rb b/app/models/sale.rb index ce7caf7c..aa2b6992 100644 --- a/app/models/sale.rb +++ b/app/models/sale.rb @@ -748,64 +748,46 @@ class Sale < ApplicationRecord return num end -def self.daily_sales_list(from,to) + def self.daily_sales_list(from,to) + payment_methods = SalePayment.where.not(payment_method: ['cash', 'creditnote', 'foc']).distinct.pluck(:payment_method) + sales = select(" - sales.*, - SUM(case when (sale_payments.payment_method='KBZPay') then sale_payments.payment_amount else 0 end) as kbzpay_amount, - SUM(case when (sale_payments.payment_method='mpu') then sale_payments.payment_amount else 0 end) as mpu_amount, - SUM(case when (sale_payments.payment_method='master') then sale_payments.payment_amount else 0 end) as master_amount, - SUM(case when (sale_payments.payment_method='visa') then sale_payments.payment_amount else 0 end) as visa_amount, - SUM(case when (sale_payments.payment_method='jcb') then sale_payments.payment_amount else 0 end) as jcb_amount, - SUM(case when (sale_payments.payment_method='paypar') then sale_payments.payment_amount else 0 end) as paypar_amount, - SUM(case when (sale_payments.payment_method='unionpay') then sale_payments.payment_amount else 0 end) as unionpay_amount, - SUM(case when (sale_payments.payment_method='alipay') then sale_payments.payment_amount else 0 end) as alipay_amount, - SUM(case when (sale_payments.payment_method='paymal') then sale_payments.payment_amount else 0 end) as paymal_amount, - SUM(case when (sale_payments.payment_method='dinga') then sale_payments.payment_amount else 0 end) as dinga_amount, - SUM(case when (sale_payments.payment_method='JunctionPay') then sale_payments.payment_amount else 0 end) as junctionpay_amount, - SUM(case when (sale_payments.payment_method='cash') then sale_payments.payment_amount else 0 end) as cash_amount, - CASE WHEN SUM(case when sale_payments.payment_method not in('creditnote') then sale_payments.payment_amount end) < sales.grand_total - THEN sales.grand_total - SUM(case when sale_payments.payment_method not in('creditnote') then sale_payments.payment_amount end) - ELSE 0 END as credit_amount, - SUM(case when (sale_payments.payment_method='giftvoucher') then sale_payments.payment_amount else 0 end) as giftvoucher_amount, - SUM(case when (sale_payments.payment_method='foc') then sale_payments.payment_amount else 0 end) as foc_amount") - .along_with_sale_payments_except_void_between(from, to) - .where("(sale_status = ? OR sale_status = ?) AND sales.receipt_date between ? AND ? ", 'completed', 'void', from, to) - .group("sale_id").to_sql + sales.*, + #{payment_methods.map { |method| "SUM(case when (sale_payments.payment_method='#{method}') then sale_payments.payment_amount else 0 end) as #{method}"}.join(', ')}, + SUM(case when (sale_payments.payment_method='cash') then sale_payments.payment_amount else 0 end) as cash_amount, + CASE WHEN SUM(case when sale_payments.payment_method not in('creditnote') + then sale_payments.payment_amount else 0 end) < sales.grand_total + THEN sales.grand_total - SUM(case when sale_payments.payment_method not in('creditnote') + then sale_payments.payment_amount else 0 end) + ELSE 0 END as credit_amount, + SUM(case when (sale_payments.payment_method='foc') then sale_payments.payment_amount else 0 end) as foc_amount") + .along_with_sale_payments_except_void_between(from, to) + .where("(sale_status = ? OR sale_status = ?) AND sales.receipt_date between ? AND ? ", 'completed', 'void', from, to) + .group("sale_id").to_sql daily_total = connection.select_all("SELECT - IFNULL(SUM(case when (sale_status='completed') then grand_total else 0 end),0) as grand_total, - IFNULL(SUM(case when (sale_status='completed') then grand_total else 0 end),0) as total_sale, - IFNULL(SUM(case when (sale_status='completed') then old_grand_total else 0 end),0) as old_grand_total, - IFNULL(SUM(case when (sale_status='completed') then total_discount else 0 end),0) as total_discount, - IFNULL(SUM(case when (sale_status='completed') then amount_changed else 0 end),0) as total_change_amount, - IFNULL(SUM(case when (sale_status='void') then grand_total else 0 end),0) as void_amount, - IFNULL(SUM(case when (sale_status='completed') then rounding_adjustment else 0 end),0) as rounding_adj, - IFNULL(SUM(case when (sale_status='completed') then grand_total else 0 end),0) / 21 as tax, - (IFNULL(SUM(case when (sale_status='completed') then grand_total else 0 end),0))-(IFNULL(SUM(case when (sale_status='completed') then grand_total else 0 end),0) / 21) as net_sale, - (IFNULL(SUM(case when (sale_status='completed') then grand_total else 0 end),0)) + (IFNULL(SUM(case when (sale_status='completed') then total_discount else 0 end),0)) as gross_sale, - CAST((CONVERT_TZ(receipt_date,'+00:00','+06:30')) AS DATE) as sale_date, - SUM(kbzpay_amount) as kbzpay_amount, - SUM(mpu_amount) as mpu_amount, - SUM(master_amount) as master_amount, - SUM(visa_amount) as visa_amount, - SUM(jcb_amount) as jcb_amount, - SUM(paypar_amount) as paypar_amount, - SUM(unionpay_amount) as unionpay_amount, - SUM(alipay_amount) as alipay_amount, - SUM(paymal_amount) as paymal_amount, - SUM(dinga_amount) as dinga_amount, - SUM(junctionpay_amount) as junctionpay_amount, - SUM(cash_amount) as cash_amount, - SUM(credit_amount) as credit_amount, - SUM(giftvoucher_amount) as giftvoucher_amount, - SUM(foc_amount) as foc_amount - FROM ( - #{sales} - ) as s - GROUP BY DATE(CONVERT_TZ(receipt_date,'+00:00','+06:30'))").to_hash.map(&:symbolize_keys) + IFNULL(SUM(case when (sale_status='completed') then grand_total else 0 end),0) as grand_total, + IFNULL(SUM(case when (sale_status='completed') then grand_total else 0 end),0) as total_sale, + IFNULL(SUM(case when (sale_status='completed') then old_grand_total else 0 end),0) as old_grand_total, + IFNULL(SUM(case when (sale_status='completed') then total_discount else 0 end),0) as total_discount, + IFNULL(SUM(case when (sale_status='completed') then amount_changed else 0 end),0) as total_change_amount, + IFNULL(SUM(case when (sale_status='void') then grand_total else 0 end),0) as void_amount, + IFNULL(SUM(case when (sale_status='completed') then rounding_adjustment else 0 end),0) as rounding_adj, + IFNULL(SUM(case when (sale_status='completed') then grand_total else 0 end),0) / 21 as tax, + (IFNULL(SUM(case when (sale_status='completed') then grand_total else 0 end),0))-(IFNULL(SUM(case when (sale_status='completed') then grand_total else 0 end),0) / 21) as net_sale, + (IFNULL(SUM(case when (sale_status='completed') then grand_total else 0 end),0)) + (IFNULL(SUM(case when (sale_status='completed') then total_discount else 0 end),0)) as gross_sale, + CAST((CONVERT_TZ(receipt_date,'+00:00','+06:30')) AS DATE) as sale_date, + #{payment_methods.map { |method| "SUM(#{method}) as #{method}"}.join(', ')}, + SUM(cash_amount) as cash_amount, + SUM(credit_amount) as credit_amount, + SUM(foc_amount) as foc_amount + FROM ( + #{sales} + ) as s + GROUP BY DATE(CONVERT_TZ(receipt_date,'+00:00','+06:30'))").to_hash.map(&:symbolize_keys) return daily_total -end + end def self.get_by_range_by_saleitems(from,to,status,report_type) query = Sale.select(" @@ -971,6 +953,7 @@ def self.get_by_shift_items(shift_sale_range, shift, from, to, status,type,accou other_charges = self.get_other_charges() end product = self.get_product_sale() + payment_methods = SalePayment.where.not(payment_method: ['cash', 'creditnote', 'foc']).distinct.pluck(:payment_method) if shift.present? query = query.where("sales.shift_sale_id IN (?) #{account_type} and sale_status='completed'",shift.to_a) @@ -980,7 +963,7 @@ def self.get_by_shift_items(shift_sale_range, shift, from, to, status,type,accou product = product.where("sales.shift_sale_id IN (?) and sale_status='completed'",shift.to_a) discount_query = Sale.where("sales.shift_sale_id in (?) and sale_status= 'completed' ", shift.to_a).sum(:total_discount) change_amount = Sale.where("sales.shift_sale_id in (?) and sale_status= 'completed' ", shift.to_a).sum(:amount_changed) - sale_cash = Sale.select("SUM(case when (sale_payments.payment_method ='mpu' or sale_payments.payment_method = 'visa' or sale_payments.payment_method = 'master' or sale_payments.payment_method = 'jcb' or sale_payments.payment_method = 'paypar' or sale_payments.payment_method = 'unionpay' or sale_payments.payment_method = 'alipay' or sale_payments.payment_method = 'paymal' or sale_payments.payment_method = 'dinga' or sale_payments.payment_method = 'JunctionPay' or sale_payments.payment_method = 'giftvoucher') then (sale_payments.payment_amount) else 0 end) as card_amount, + sale_cash = Sale.select("SUM(case when (sale_payments.payment_method IN (#{payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') })) then (sale_payments.payment_amount) else 0 end) as card_amount, SUM(case when (sale_payments.payment_method='cash') then (sale_payments.payment_amount) else 0 end) as cash_amount, SUM(case when (sale_payments.payment_method='creditnote') then (sale_payments.payment_amount) else 0 end) as credit_amount, SUM(case when (sale_payments.payment_method='foc') then (sale_payments.payment_amount) else 0 end) as foc_amount") @@ -1003,7 +986,7 @@ def self.get_by_shift_items(shift_sale_range, shift, from, to, status,type,accou product = product.where("sales.shift_sale_id IN (?) and sale_status='completed'",shift_sale_range.to_a) discount_query = Sale.where("sales.shift_sale_id IN (?) and sale_status ='completed'", shift_sale_range.to_a).sum(:total_discount) change_amount = Sale.where("sales.shift_sale_id IN (?) and sale_status ='completed'", shift_sale_range.to_a).sum(:amount_changed) - sale_cash = Sale.select("SUM(case when (sale_payments.payment_method = 'mpu' or sale_payments.payment_method = 'visa' or sale_payments.payment_method = 'master' or sale_payments.payment_method = 'jcb' or sale_payments.payment_method = 'paypar' or sale_payments.payment_method = 'unionpay' or sale_payments.payment_method = 'alipay' sale_payments.payment_method = 'paymal' or sale_payments.payment_method = 'dinga' or sale_payments.payment_method = 'JunctionPay' or sale_payments.payment_method = 'giftvoucher') then (sale_payments.payment_amount) else 0 end) as card_amount, + sale_cash = Sale.select("SUM(case when (sale_payments.payment_method IN (#{payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') })) then (sale_payments.payment_amount) else 0 end) as card_amount, SUM(case when (sale_payments.payment_method='cash') then (sale_payments.payment_amount) else 0 end) as cash_amount, SUM(case when (sale_payments.payment_method='creditnote') then (sale_payments.payment_amount) else 0 end) as credit_amount, SUM(case when (sale_payments.payment_method='foc') then (sale_payments.payment_amount) else 0 end) as foc_amount") @@ -1027,7 +1010,7 @@ def self.get_by_shift_items(shift_sale_range, shift, from, to, status,type,accou discount_query = Sale.where("sales.receipt_date between ? and ? and sale_status ='completed'", from,to).sum(:total_discount) change_amount = Sale.where("sales.receipt_date between ? and ? and sale_status ='completed'", from,to).sum(:amount_changed) - sale_cash = Sale.select("SUM(case when (sale_payments.payment_method = 'mpu' or sale_payments.payment_method = 'visa' or sale_payments.payment_method = 'master' or sale_payments.payment_method = 'jcb' or sale_payments.payment_method = 'paypar' or sale_payments.payment_method = 'unionpay' or sale_payments.payment_method = 'alipay' or sale_payments.payment_method = 'paymal' or sale_payments.payment_method = 'dinga' or sale_payments.payment_method = 'JunctionPay' or sale_payments.payment_method = 'giftvoucher') then (sale_payments.payment_amount) else 0 end) as card_amount, + sale_cash = Sale.select("SUM(case when (sale_payments.payment_method IN (#{payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') })) then (sale_payments.payment_amount) else 0 end) as card_amount, SUM(case when (sale_payments.payment_method='cash') then (sale_payments.payment_amount) else 0 end) as cash_amount, SUM(case when (sale_payments.payment_method='creditnote') then (sale_payments.payment_amount) else 0 end) as credit_amount, SUM(case when (sale_payments.payment_method='foc') then (sale_payments.payment_amount) else 0 end) as foc_amount") @@ -1058,6 +1041,8 @@ def self.get_staff_meal_items(shift_sale_range, shift, from, to, status, account customer_id = customer_id.to_s customer_id[0] = "" customer_id = customer_id.chomp("]") + else + customer_id = "''" end query = self.get_staff_meal_query() @@ -1074,16 +1059,17 @@ def self.get_staff_meal_items(shift_sale_range, shift, from, to, status, account # other_charges = self.get_other_charges() # end product = self.get_product_sale() + payment_methods = SalePayment.where.not(payment_method: ['cash', 'creditnote', 'foc']).distinct.pluck(:payment_method) if shift.present? - query = query.where("sales.shift_sale_id IN (?) #{account_type} and sale_status='completed' and sales.customer_id IN(#{customer_id})",shift.to_a) + query = query.where("sales.shift_sale_id IN (?) #{account_type} and sale_status='completed' and sales.customer_id IN (#{customer_id})",shift.to_a) # if type.nil? || type == 'all' || type == "other" # other_charges = other_charges.where("sales.shift_sale_id IN (?) and sale_status='completed'",shift.to_a) # end product = product.where("sales.shift_sale_id IN (?) and sale_status='completed'",shift.to_a) discount_query = Sale.where("sales.shift_sale_id in (?) and sale_status= 'completed' ", shift.to_a).sum(:total_discount) change_amount = Sale.where("sales.shift_sale_id in (?) and sale_status= 'completed' ", shift.to_a).sum(:amount_changed) - sale_cash = Sale.select("SUM(case when (sale_payments.payment_method ='mpu' or sale_payments.payment_method = 'visa' or sale_payments.payment_method = 'master' or sale_payments.payment_method = 'jcb' or sale_payments.payment_method = 'paypar' or sale_payments.payment_method = 'unionpay' or sale_payments.payment_method = 'alipay' or sale_payments.payment_method = 'paymal' or sale_payments.payment_method = 'dinga' or sale_payments.payment_method = 'JunctionPay' or sale_payments.payment_method = 'giftvoucher') then (sale_payments.payment_amount) else 0 end) as card_amount, + sale_cash = Sale.select("SUM(case when (sale_payments.payment_method IN (#{payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') })) then (sale_payments.payment_amount) else 0 end) as card_amount, SUM(case when (sale_payments.payment_method='cash') then (sale_payments.payment_amount) else 0 end) as cash_amount, SUM(case when (sale_payments.payment_method='creditnote') then (sale_payments.payment_amount) else 0 end) as credit_amount, SUM(case when (sale_payments.payment_method='foc') then (sale_payments.payment_amount) else 0 end) as foc_amount") @@ -1099,14 +1085,14 @@ def self.get_staff_meal_items(shift_sale_range, shift, from, to, status, account ### => get all sales range in shift_sales elsif shift_sale_range.present? - query = query.where("sales.shift_sale_id IN (?) #{account_type} and sale_status='completed' and sales.customer_id IN(#{customer_id})",shift_sale_range.to_a) + query = query.where("sales.shift_sale_id IN (?) #{account_type} and sale_status='completed' and sales.customer_id IN (#{customer_id})",shift_sale_range.to_a) # if type.nil? || type == 'all' || type == "other" # other_charges = other_charges.where("sales.shift_sale_id IN (?) and sale_status='completed'",shift_sale_range.to_a) # end product = product.where("sales.shift_sale_id IN (?) and sale_status='completed'",shift_sale_range.to_a) discount_query = Sale.where("sales.shift_sale_id IN (?) and sale_status ='completed'", shift_sale_range.to_a).sum(:total_discount) change_amount = Sale.where("sales.shift_sale_id IN (?) and sale_status ='completed'", shift_sale_range.to_a).sum(:amount_changed) - sale_cash = Sale.select("SUM(case when (sale_payments.payment_method = 'mpu' or sale_payments.payment_method = 'visa' or sale_payments.payment_method = 'master' or sale_payments.payment_method = 'jcb' or sale_payments.payment_method = 'paypar' or sale_payments.payment_method = 'unionpay' or sale_payments.payment_method = 'alipay' sale_payments.payment_method = 'paymal' or sale_payments.payment_method = 'dinga' or sale_payments.payment_method = 'JunctionPay' or sale_payments.payment_method = 'giftvoucher') then (sale_payments.payment_amount) else 0 end) as card_amount, + sale_cash = Sale.select("SUM(case when (sale_payments.payment_method IN (#{payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') })) then (sale_payments.payment_amount) else 0 end) as card_amount, SUM(case when (sale_payments.payment_method='cash') then (sale_payments.payment_amount) else 0 end) as cash_amount, SUM(case when (sale_payments.payment_method='creditnote') then (sale_payments.payment_amount) else 0 end) as credit_amount, SUM(case when (sale_payments.payment_method='foc') then (sale_payments.payment_amount) else 0 end) as foc_amount") @@ -1122,7 +1108,7 @@ def self.get_staff_meal_items(shift_sale_range, shift, from, to, status, account total_grand_total = total_cash_amount.to_f + total_card_amount.to_f + total_credit_amount.to_f else - query = query.where("sales.receipt_date between ? and ? #{account_type} and sale_status='completed' and sales.customer_id IN(#{customer_id})",from,to) + query = query.where("sales.receipt_date between ? and ? #{account_type} and sale_status='completed' and sales.customer_id IN (#{customer_id})",from,to) # if type.nil? || type == 'all' || type == "other" # other_charges = other_charges.where("sales.receipt_date between ? and ? and sale_status='completed'",from,to) # end @@ -1130,7 +1116,7 @@ def self.get_staff_meal_items(shift_sale_range, shift, from, to, status, account discount_query = Sale.where("sales.receipt_date between ? and ? and sale_status ='completed'", from,to).sum(:total_discount) change_amount = Sale.where("sales.receipt_date between ? and ? and sale_status ='completed'", from,to).sum(:amount_changed) - sale_cash = Sale.select("SUM(case when (sale_payments.payment_method = 'mpu' or sale_payments.payment_method = 'visa' or sale_payments.payment_method = 'master' or sale_payments.payment_method = 'jcb' or sale_payments.payment_method = 'paypar' or sale_payments.payment_method = 'unionpay' or sale_payments.payment_method = 'alipay' or sale_payments.payment_method = 'paymal' or sale_payments.payment_method = 'dinga' or sale_payments.payment_method = 'JunctionPay' or sale_payments.payment_method = 'giftvoucher') then (sale_payments.payment_amount) else 0 end) as card_amount, + sale_cash = Sale.select("SUM(case when (sale_payments.payment_method IN (#{payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') })) then (sale_payments.payment_amount) else 0 end) as card_amount, SUM(case when (sale_payments.payment_method='cash') then (sale_payments.payment_amount) else 0 end) as cash_amount, SUM(case when (sale_payments.payment_method='creditnote') then (sale_payments.payment_amount) else 0 end) as credit_amount, SUM(case when (sale_payments.payment_method='foc') then (sale_payments.payment_amount) else 0 end) as foc_amount") @@ -1341,20 +1327,12 @@ def self.get_separate_tax(shift_sale_range=nil,shift,from,to,payment_type) end end -def self.get_payment_method_by_shift(shift_sale_range,shift,from,to,payment_type) +def self.get_payment_method_by_shift(shift,from,to,payment_type) + payment_methods = SalePayment.where.not(payment_method: ['cash', 'creditnote', 'foc']).distinct.pluck(:payment_method) + payments_total = SalePayment.select(" sales.receipt_date as sale_date, - SUM(case when (sale_payments.payment_method='mpu') then sale_payments.payment_amount else 0 end) as mpu_amount, - SUM(case when (sale_payments.payment_method='master') then sale_payments.payment_amount else 0 end) as master_amount, - SUM(case when (sale_payments.payment_method='visa') then sale_payments.payment_amount else 0 end) as visa_amount, - SUM(case when (sale_payments.payment_method='jcb') then sale_payments.payment_amount else 0 end) as jcb_amount, - SUM(case when (sale_payments.payment_method='paypar') then sale_payments.payment_amount else 0 end) as paypar_amount, - SUM(case when (sale_payments.payment_method='unionpay') then sale_payments.payment_amount else 0 end) as unionpay_amount, - SUM(case when (sale_payments.payment_method='alipay') then sale_payments.payment_amount else 0 end) as alipay_amount, - SUM(case when (sale_payments.payment_method='KBZPay') then sale_payments.payment_amount else 0 end) as kbzpay_amount, - SUM(case when (sale_payments.payment_method='paymal') then sale_payments.payment_amount else 0 end) as paymal_amount, - SUM(case when (sale_payments.payment_method='dinga') then sale_payments.payment_amount else 0 end) as dinga_amount, - SUM(case when (sale_payments.payment_method='JunctionPay') then sale_payments.payment_amount else 0 end) as junctionpay_amount, + #{payment_methods.map { |method| "SUM(case when (sale_payments.payment_method='#{method}') then sale_payments.payment_amount else 0 end) as #{method}"}.join(', ')}, SUM(case when (sale_payments.payment_method='cash') then sale_payments.payment_amount else 0 end) as cash_amount, SUM(case when (sale_payments.payment_method='cash') then sales.amount_changed else 0 end) as total_change_amount, @@ -1382,9 +1360,6 @@ def self.get_payment_method_by_shift(shift_sale_range,shift,from,to,payment_type if shift.present? payments_total = payments_total.where(sales: {shift_sale_id: shift.to_a}) sale_payment = sale_payment.merge(Sale.where(sales: {shift_sale_id: shift.to_a})) - elsif shift_sale_range.present? - payments_total = payments_total.where(sales: {shift_sale_id: shift_sale_range.to_a}) - sale_payment = sale_payment.merge(Sale.where(sales: {shift_sale_id: shift_sale_range.to_a})) end if payment_type.present? @@ -1421,33 +1396,32 @@ def grand_total_after_rounding end def get_cash_amount - cash = 0.0 - self.sale_payments.each do |pay| - if pay.payment_method == 'cash' - cash += pay.payment_amount - end - end - return cash - self.amount_changed + self.sale_payments.where(payment_method: 'cash', payment_status: 'paid') + .pluck(:payment_amount).reduce(0, :+) - self.amount_changed end def get_credit_amount - credit = 0.0 - self.sale_payments.each do |pay| - if pay.payment_method == 'creditnote' - credit += pay.payment_amount - end - end - return credit + self.sale_payments.where(payment_method: 'creditnote') + .pluck(:payment_status, :payment_amount) + .inject(0.0) { |sum, pay| + if pay[0] == 'outstanding' + sum += pay[1] + else + sum -= pay[1] + end + } end def get_other_amount - other = 0.0 - self.sale_payments.each do |pay| - if pay.payment_method != 'cash' && pay.payment_method != 'creditnote' - other += pay.payment_amount - end - end - return other + self.sale_payments.where.not(payment_method: ['cash', 'creditnote']) + .pluck(:payment_status, :payment_amount) + .inject(0.0) { |sum, pay| + if pay[0] == 'paid' + sum += pay[1] + else + sum -= pay[1] + end + } end def get_commerical_tax @@ -1512,11 +1486,12 @@ end end payments_for_credits = SalePayment.joins(:sale_audit).to_sql + payment_methods = SalePayment.where.not(payment_method: ['cash', 'creditnote', 'foc']).distinct.pluck(:payment_method) query = employee_sale(shift, from, to) .joins("LEFT JOIN (#{payments_for_credits}) payments_for_credits ON payments_for_credits.sale_id = sales.sale_id") .select("SUM(sale_payments.payment_amount) - CASE WHEN sale_payments.payment_method = 'creditnote' THEN IFNULL(SUM(payments_for_credits.payment_amount), 0) ELSE ABS(SUM(CASE WHEN sale_payments.outstanding_amount < 0 THEN sale_payments.outstanding_amount ELSE 0 END)) END AS payment_amount, - CASE WHEN sale_payments.payment_method IN ('mpu', 'visa', 'master', 'jcb', 'unionpay', 'alipay', 'paymal', 'dinga', 'JunctionPay', 'giftvoucher') THEN 'card' + CASE WHEN sale_payments.payment_method IN (#{payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') }) THEN 'card' ELSE sale_payments.payment_method END AS payment_method, employees.name AS e_name") end @@ -1540,8 +1515,9 @@ end end def self.total_card_sale(current_user=nil,from=nil,to=nil) + payment_methods = SalePayment.where.not(payment_method: ['cash', 'creditnote', 'foc']).distinct.pluck(:payment_method) query = Sale.joins("JOIN sale_payments sp ON sp.sale_id = sales.sale_id") - .where('sales.sale_status = "completed" and (sp.payment_method = "mpu" or sp.payment_method = "visa" or sp.payment_method = "master" or sp.payment_method = "jcb" or sp.payment_method = "unionpay" or sp.payment_method = "alipay" or sp.payment_method = "paymal" or sp.payment_method = "dinga" or sp.payment_method = "JunctionPay")') + .where("sales.sale_status = 'completed' and (sp.payment_method IN (#{payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') }))") if (!from.nil? && !to.nil?) query = query.receipt_date_between(from, to) @@ -1601,10 +1577,11 @@ end end def self.total_payment_methods(current_user=nil,from=nil,to=nil) - query = Sale.select("CASE WHEN sp.payment_method IN ('mpu', 'visa', 'master', 'jcb', 'unionpay', 'alipay', 'paymal', 'dinga', 'JunctionPay', 'giftvoucher') THEN 'card' ELSE sp.payment_method END as payment_method") + payment_methods = SalePayment.where.not(payment_method: ['cash', 'creditnote', 'foc']).distinct.pluck(:payment_method) + query = Sale.select("CASE WHEN sp.payment_method IN (#{payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') }) THEN 'card' ELSE sp.payment_method END as payment_method") .where("sales.sale_status = 'completed'") .joins("JOIN sale_payments as sp ON sp.sale_id = sales.sale_id") - .group("CASE WHEN sp.payment_method IN ('mpu', 'visa', 'master', 'jcb', 'unionpay', 'alipay', 'paymal', 'dinga', 'JunctionPay', 'giftvoucher') THEN 'card' ELSE sp.payment_method END") + .group("CASE WHEN sp.payment_method IN (#{payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') }) THEN 'card' ELSE sp.payment_method END") if (!from.nil? && !to.nil?) query = query.receipt_date_between(from, to) @@ -2038,6 +2015,7 @@ def self.get_by_hourly_items(shift_sale_range, shift, from, to, status,type,acco other_charges = self.get_other_charges() end product = self.get_product_sale() + payment_methods = SalePayment.where.not(payment_method: ['cash', 'creditnote', 'foc']).distinct.pluck(:payment_method) if shift.present? query = query.where("sales.shift_sale_id IN (?) #{account_type} and sale_status='completed'",shift.to_a) @@ -2047,7 +2025,7 @@ def self.get_by_hourly_items(shift_sale_range, shift, from, to, status,type,acco product = product.where("sales.shift_sale_id IN (?) and sale_status='completed'",shift.to_a) discount_query = Sale.where("sales.shift_sale_id in (?) and sale_status= 'completed' ", shift.to_a).sum(:total_discount) change_amount = Sale.where("sales.shift_sale_id in (?) and sale_status= 'completed' ", shift.to_a).sum(:amount_changed) - sale_cash = Sale.select("SUM(case when (sale_payments.payment_method ='mpu' or sale_payments.payment_method = 'visa' or sale_payments.payment_method = 'master' or sale_payments.payment_method = 'jcb' or sale_payments.payment_method = 'paypar' or sale_payments.payment_method = 'unionpay' or sale_payments.payment_method = 'alipay' or sale_payments.payment_method = 'paymal' or sale_payments.payment_method = 'dinga' or sale_payments.payment_method = 'JunctionPay' or sale_payments.payment_method = 'giftvoucher') then (sale_payments.payment_amount) else 0 end) as card_amount, + sale_cash = Sale.select("SUM(case when (sale_payments.payment_method IN (#{payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') })) then (sale_payments.payment_amount) else 0 end) as card_amount, SUM(case when (sale_payments.payment_method='cash') then (sale_payments.payment_amount) else 0 end) as cash_amount, SUM(case when (sale_payments.payment_method='creditnote') then (sale_payments.payment_amount) else 0 end) as credit_amount, SUM(case when (sale_payments.payment_method='foc') then (sale_payments.payment_amount) else 0 end) as foc_amount") @@ -2070,7 +2048,7 @@ def self.get_by_hourly_items(shift_sale_range, shift, from, to, status,type,acco product = product.where("sales.shift_sale_id IN (?) and sale_status='completed'",shift_sale_range.to_a) discount_query = Sale.where("sales.shift_sale_id IN (?) and sale_status ='completed'", shift_sale_range.to_a).sum(:total_discount) change_amount = Sale.where("sales.shift_sale_id IN (?) and sale_status ='completed'", shift_sale_range.to_a).sum(:amount_changed) - sale_cash = Sale.select("SUM(case when (sale_payments.payment_method = 'mpu' or sale_payments.payment_method = 'visa' or sale_payments.payment_method = 'master' or sale_payments.payment_method = 'jcb' or sale_payments.payment_method = 'paypar' or sale_payments.payment_method = 'unionpay' or sale_payments.payment_method = 'alipay' sale_payments.payment_method = 'paymal' or sale_payments.payment_method = 'dinga' or sale_payments.payment_method = 'JunctionPay' or sale_payments.payment_method = 'giftvoucher') then (sale_payments.payment_amount) else 0 end) as card_amount, + sale_cash = Sale.select("SUM(case when (sale_payments.payment_method IN (#{payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') })) then (sale_payments.payment_amount) else 0 end) as card_amount, SUM(case when (sale_payments.payment_method='cash') then (sale_payments.payment_amount) else 0 end) as cash_amount, SUM(case when (sale_payments.payment_method='creditnote') then (sale_payments.payment_amount) else 0 end) as credit_amount, SUM(case when (sale_payments.payment_method='foc') then (sale_payments.payment_amount) else 0 end) as foc_amount") @@ -2094,7 +2072,7 @@ def self.get_by_hourly_items(shift_sale_range, shift, from, to, status,type,acco discount_query = Sale.where("sales.receipt_date between ? and ? and sale_status ='completed'", from,to).sum(:total_discount) change_amount = Sale.where("sales.receipt_date between ? and ? and sale_status ='completed'", from,to).sum(:amount_changed) - sale_cash = Sale.select("SUM(case when (sale_payments.payment_method = 'mpu' or sale_payments.payment_method = 'visa' or sale_payments.payment_method = 'master' or sale_payments.payment_method = 'jcb' or sale_payments.payment_method = 'paypar' or sale_payments.payment_method = 'unionpay' or sale_payments.payment_method = 'alipay' or sale_payments.payment_method = 'paymal' or sale_payments.payment_method = 'dinga' or sale_payments.payment_method = 'JunctionPay' or sale_payments.payment_method = 'giftvoucher') then (sale_payments.payment_amount) else 0 end) as card_amount, + sale_cash = Sale.select("SUM(case when (sale_payments.payment_method IN (#{payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') })) then (sale_payments.payment_amount) else 0 end) as card_amount, SUM(case when (sale_payments.payment_method='cash') then (sale_payments.payment_amount) else 0 end) as cash_amount, SUM(case when (sale_payments.payment_method='creditnote') then (sale_payments.payment_amount) else 0 end) as credit_amount, SUM(case when (sale_payments.payment_method='foc') then (sale_payments.payment_amount) else 0 end) as foc_amount") @@ -2254,8 +2232,9 @@ def self.get_daily_sale_data(transaction_date) end def self.get_check_sale_data(transaction_date) + payment_methods = SalePayment.where.not(payment_method: ['cash', 'creditnote', 'foc']).distinct.pluck(:payment_method) sale_receivables_subquery = "SELECT sale_payments.sale_id, - CASE WHEN sale_payments.payment_method = 'mpu' OR sale_payments.payment_method = 'visa' OR sale_payments.payment_method = 'master' OR sale_payments.payment_method = 'jcb' OR sale_payments.payment_method = 'paypar' OR sale_payments.payment_method = 'unionpay' OR sale_payments.payment_method = 'alipay' OR sale_payments.payment_method = 'paymal' OR sale_payments.payment_method = 'dinga' OR sale_payments.payment_method = 'JunctionPay' THEN SUM(sale_payments.payment_amount) ELSE SUM(0) END as credit_card_sales, + SUM(case when (sale_payments.payment_method IN (#{payment_methods.map{ |pm| "\"#{pm}\"" }.join(', ') })) then (sale_payments.payment_amount) else 0 end) as credit_card_sales, CASE WHEN sale_payments.payment_method = 'giftvoucher' THEN SUM(sale_payments.payment_amount) ELSE SUM(0) END as voucher_sales FROM sale_payments GROUP BY sale_payments.sale_id, sale_payments.payment_method" @@ -2308,13 +2287,13 @@ private end def round_to_precision - if (self.total_amount != self.total_amount_was || self.total_discount != self.total_discount_was || self.total_tax != self.total_tax_was) - if (self.total_amount % 1 > 0 || self.total_discount % 1 > 0 || self.total_tax % 1 > 0) - self.total_amount = self.total_amount.round(precision) - self.total_discount = self.total_discount.round(precision) - self.total_tax = self.total_tax.round(precision) - self.grand_total = (self.total_amount - self.total_discount) + self.total_tax - end + if (self.total_amount % 1 > 0 || self.total_discount % 1 > 0 || self.total_tax % 1 > 0) + self.total_amount = self.total_amount.round(precision) + self.total_discount = self.total_discount.round(precision) + self.total_tax = self.total_tax.round(precision) + end + self.grand_total = (self.total_amount - self.total_discount) + self.total_tax + if (!['foc'].include? self.payment_status) adjust_rounding end end diff --git a/app/models/sale_audit.rb b/app/models/sale_audit.rb index 0cc5b9e7..e566182a 100755 --- a/app/models/sale_audit.rb +++ b/app/models/sale_audit.rb @@ -143,7 +143,7 @@ class SaleAudit < ApplicationRecord remark = paymal[0].remark.split("}") response = "["+remark[0]+'}]' response = JSON.parse(response) - puts response + # puts response if response[0]["status"] == true if response[0]["current_rebate_amount"].present? amount = response[0]["current_rebate_amount"] diff --git a/app/models/sale_payment.rb b/app/models/sale_payment.rb index 36bc6de3..9ade9920 100755 --- a/app/models/sale_payment.rb +++ b/app/models/sale_payment.rb @@ -11,7 +11,7 @@ class SalePayment < ApplicationRecord attr_accessor :received_amount, :card_payment_reference, :voucher_no, :giftcard_no, :customer_id, :external_payment_status,:action_by scope :credits, -> { where(payment_method: 'creditnote') } - scope :cards, -> { where(payment_method: ['mpu', 'visa', 'master', 'jcb', 'unionpay', 'alipay', 'paymal', 'dinga', 'JunctionPay', 'giftvoucher']) } + scope :cards, -> { where(payment_method: PaymentMethodSetting.where("is_active='1'").pluck("payment_method")) } def self.sync_sale_payment_records(sale_payments) if !sale_payments.nil? @@ -36,7 +36,8 @@ class SalePayment < ApplicationRecord def self.get_kbz_pay_amount(sale_id, current_user) amount = 0 - kbz_pay_method = PaymentMethodSetting.where(:payment_method => KbzPay::KBZ_PAY).last + kbz_pay_method = PaymentMethodSetting.where(payment_method: KbzPay::KBZ_PAY, gateway_communication_type: ['api', 'Api'], is_active: true) + .where.not(gateway_url: [nil, ''], auth_token: [nil, ''], merchant_account_id: [nil, '']).last sale_payment = SalePayment.where('sale_id=? and payment_method=? and payment_status!=?', sale_id, KbzPay::KBZ_PAY, 'dead').last if !sale_payment.nil? and !kbz_pay_method.nil? if sale_payment.payment_status == 'pending' @@ -75,6 +76,8 @@ class SalePayment < ApplicationRecord #get all payment for this invoices if payment_for amount_due = SalePayment.get_credit_amount_due_left(self.sale_id).first.payment_amount + elsif payment_method == 'foc' + amount_due = invoice.total_amount else amount_due = invoice.sale_payments .map(&:payment_amount).reduce(invoice.grand_total, :-) @@ -119,10 +122,8 @@ class SalePayment < ApplicationRecord payment_status,membership_data = dinga_payment when "GiftVoucher" payment_status = giftvoucher_payment - when KbzPay::KBZ_PAY - payment_status = kbz_payment - else - puts "it was something else" + else + payment_status = external_terminal_card_payment(payment_method, payment_for) end if payment_status @@ -140,9 +141,6 @@ class SalePayment < ApplicationRecord remark = "#{self.sale_payment_id}||#{shift_sale_id} -> #{remark}" sale_audit = SaleAudit.record_payment(invoice.id, remark, action_by.name) - if payment_method == "cash" - update_shift_for_credit_payment - end else sale_audit = SaleAudit.record_payment(invoice.id, remark, action_by.name) end @@ -233,9 +231,9 @@ class SalePayment < ApplicationRecord return response; end - def self.redeem(paypar_url,token,membership_id,received_amount,sale_id) - # membership_actions_data = MembershipAction.find_by_membership_type("redeem"); - membership_actions_data = PaymentMethodSetting.find_by_payment_method("Redeem") + def redeem(paypar_url,token,membership_id,received_amount,sale_id) + membership_actions_data = MembershipAction.find_by_membership_type("redeem"); + # membership_actions_data = PaymentMethodSetting.find_by_payment_method("Redeem") puts "This is membership_actions_data" puts membership_actions_data.to_json if !membership_actions_data.nil? @@ -243,8 +241,9 @@ class SalePayment < ApplicationRecord url = paypar_url.to_s + membership_actions_data.gateway_url.to_s merchant_uid = membership_actions_data.merchant_account_id auth_token = membership_actions_data.auth_token - campaign_type_id = JSON.parse(membership_actions_data.additional_parameters)["campaign_type_id"] + campaign_type_id = membership_actions_data.additional_parameter["campaign_type_id"] sale_data = Sale.find_by_sale_id(sale_id) + account_no = Customer.find_by_customer_id(self.sale.customer_id).paypar_account_no if sale_data others = 0 @@ -261,7 +260,7 @@ class SalePayment < ApplicationRecord redeem_amount:received_amount, receipt_no:sale_data.receipt_no, campaign_type_id:campaign_type_id, - account_no:"", + account_no: account_no, merchant_uid:merchant_uid, auth_token:auth_token}.to_json, :headers => { @@ -365,21 +364,23 @@ class SalePayment < ApplicationRecord # Check for Card Payment def self.get_sale_payments_by_card(sale_payments) # Check for Card Payment + payment_methods = SalePayment.where.not(payment_method: ['cash', 'creditnote', 'foc']).distinct.pluck(:payment_method) sale_payments.each do |sp| - if sp.payment_method == "jcb" || sp.payment_method == "mpu" || sp.payment_method == "visa" || sp.payment_method == "master" || sp.payment_method == "unionpay" || sp.payment_method == "alipay" - return true; + payment_methods.each do |m| + if sp.payment_method == m + return true; + end end + # if sp.payment_method == "jcb" || sp.payment_method == "mpu" || sp.payment_method == "visa" || sp.payment_method == "master" || sp.payment_method == "unionpay" || sp.payment_method == "alipay" + # return true; + # end end end private def cash_payment(payment_for=false) - status = false - sale_payments_data = SalePayment.find_by_sale_id(self.sale_id) - if sale_payments_data.nil? - status = true - end + sale_payments_data = SalePayment.find_by_sale_id(self.sale_id) payment_status = false self.payment_method = "cash" @@ -394,8 +395,11 @@ class SalePayment < ApplicationRecord self.payment_status = "paid" payment_status = self.save! if !payment_for - sale_update_payment_status(self.received_amount,status) + sale_update_payment_status(self.received_amount) + else + update_shift_for_credit_payment() end + balance_amount =0.0 outstanding_amount =0.0 if self.sale.grand_total.to_f > self.received_amount.to_f @@ -411,6 +415,7 @@ class SalePayment < ApplicationRecord def foc_payment payment_status = false sale = self.sale + sale.sale_payments.update_all(payment_status: "cancelled") # add to sale item with foc sale_items = sale.sale_items @@ -427,7 +432,7 @@ class SalePayment < ApplicationRecord self.payment_status = "paid" payment_status = self.save! # sale_update_payment_status(self.received_amount) - sale_update_payment_status(0) + sale_update_payment_status(0, true) return payment_status end @@ -504,7 +509,7 @@ class SalePayment < ApplicationRecord #Next time - validate if the vochure number is valid - within customer_data = Customer.find_by_customer_id(self.sale.customer_id) membership_setting = MembershipSetting.find_by_membership_type("paypar_url") - membership_data = SalePayment.redeem(membership_setting.gateway_url,membership_setting.auth_token,customer_data.membership_id,self.received_amount,self.sale.sale_id) + membership_data = redeem(membership_setting.gateway_url,membership_setting.auth_token,customer_data.membership_id,self.received_amount,self.sale.sale_id) #record an payment in sale-audit remark = "#{membership_data} Redeem- for Customer #{self.sale.customer_id} Sale Id [#{self.sale.sale_id}]| pay amount -> #{self.received_amount} " @@ -623,39 +628,38 @@ class SalePayment < ApplicationRecord return payment_status end - def kbz_payment - payment_status = false - self.payment_amount = self.received_amount - self.payment_reference = self.payment_reference - self.outstanding_amount = self.sale.grand_total.to_f - self.received_amount.to_f - self.payment_status = "paid" - payment_status = self.save! - # sale_update_payment_status(self.received_amount) - return payment_status - end - def sale_update_payment_status(paid_amount, check_foc = false) #update amount_outstanding + if ['completed'].include? sale.sale_status + return + end sale = self.sale - total_payment_amount = sale.sale_payments.reload.sum(&:payment_amount) + sale_payments = sale.sale_payments.reload + + is_credit = sale_payments.any? { |x| x.payment_method == "creditnote" } + is_foc = sale_payments.any? { |x| x.payment_method == "foc" } || check_foc + + if is_foc + total_payment_amount = 0.0 + else + total_payment_amount = sale_payments.sum(&:payment_amount) + end + sale.amount_received = sale.amount_received.to_f + paid_amount.to_f sale.amount_changed = total_payment_amount - sale.grand_total.to_f - is_credit = sale.sale_payments.any? { |x| x.payment_method == "creditnote" } - is_foc = sale.sale_payments.any? { |x| x.payment_method == "foc" } - - if sale.grand_total <= total_payment_amount && sale.sale_status == "new" + if is_foc + sale.payment_status = 'foc' + sale.sale_status = 'completed' + elsif sale.grand_total <= total_payment_amount && sale.sale_status == "new" sale.payment_status = "paid" if is_credit sale.payment_status = "outstanding" end - if is_foc - sale.payment_status = "foc" - end sale.sale_status = "completed" - if MembershipSetting.find_by_rebate(1) && is_foc == 0 && is_credit == 0 + if MembershipSetting.find_by_rebate(1) && !is_foc && !is_credit response = rebat(sale) #record an payment in sale-audit @@ -678,25 +682,24 @@ class SalePayment < ApplicationRecord end end end + end - sale.save! + sale.save! - if check_foc - table_update_status(sale) - update_shift - elsif paid_amount.to_f > 0 #|| paid_amount != "0.0" - table_update_status(sale) - update_shift - elsif paid_amount.to_f == 0 && !is_credit - table_update_status(sale) - update_shift - end + if check_foc + table_update_status(sale) + update_shift + elsif paid_amount.to_f > 0 #|| paid_amount != "0.0" + table_update_status(sale) + update_shift + elsif paid_amount.to_f == 0 && !is_credit + table_update_status(sale) + update_shift end end # update for cashier shift def update_shift - shift = ShiftSale.current_open_shift(self.action_by.id) if shift.nil? @@ -734,7 +737,6 @@ class SalePayment < ApplicationRecord else # extra_changed_amount = self.received_amount.to_f + credit_payment_left shift.cash_sales = shift.cash_sales.to_f + (self.received_amount.to_f + credit_payment_left) - self.sale.amount_received = self.sale.amount_received.to_f - credit_payment_left self.sale.amount_changed = self.sale.amount_changed.to_f - credit_payment_left self.sale.save! diff --git a/app/models/shift_sale.rb b/app/models/shift_sale.rb index 56db452f..f3280f76 100755 --- a/app/models/shift_sale.rb +++ b/app/models/shift_sale.rb @@ -150,21 +150,11 @@ class ShiftSale < ApplicationRecord end def self.get_by_shift_other_payment(shift) + payment_methods = SalePayment.where.not(payment_method: ['cash', 'creditnote', 'foc']).distinct.pluck(:payment_method) other_payment = Sale.select("sale_payments.payment_method as name, - SUM(case when (sale_payments.payment_method='mpu') then (sale_payments.payment_amount) else 0 end) as mpu_amount, - SUM(case when (sale_payments.payment_method='visa') then (sale_payments.payment_amount) else 0 end) as visa_amount, - SUM(case when (sale_payments.payment_method='master') then (sale_payments.payment_amount) else 0 end) as master_amount, - SUM(case when (sale_payments.payment_method='jcb') then (sale_payments.payment_amount) else 0 end) as jcb_amount, - SUM(case when (sale_payments.payment_method='unionpay') then (sale_payments.payment_amount) else 0 end) as unionpay_amount, - SUM(case when (sale_payments.payment_method='alipay') then (sale_payments.payment_amount) else 0 end) as alipay_amount, - SUM(case when (sale_payments.payment_method='KBZPay') then (sale_payments.payment_amount) else 0 end) as kbzpay_amount, - SUM(case when (sale_payments.payment_method='dinga') then (sale_payments.payment_amount) else 0 end) as dinga_amount, - SUM(case when (sale_payments.payment_method='giftvoucher') then (sale_payments.payment_amount) else 0 end) as giftvoucher_amount, - SUM(case when (sale_payments.payment_method='JunctionPay') then (sale_payments.payment_amount) else 0 end) as junctionpay_amount, - SUM(case when (sale_payments.payment_method='foc') then (sale_payments.payment_amount) else 0 end) as foc_amount, - SUM(case when (sale_payments.payment_method='paymal') then (sale_payments.payment_amount) else 0 end) as paymal_amount, - SUM(case when (sale_payments.payment_method='paypar') then (sale_payments.payment_amount) else 0 end) as paypar_amount") + #{payment_methods.map { |method| "SUM(case when (sale_payments.payment_method='#{method}') then sale_payments.payment_amount else 0 end) as #{method}"}.join(', ')}, + SUM(case when (sale_payments.payment_method='foc') then (sale_payments.payment_amount) else 0 end) as foc_amount") .joins("join sale_payments on sale_payments.sale_id = sales.sale_id") .where("sales.shift_sale_id =? and sale_status = 'completed' and sale_payments.payment_amount != 0 ", shift.id) end diff --git a/app/pdf/close_cashier_pdf.rb b/app/pdf/close_cashier_pdf.rb index 976c3d93..e6b594bc 100755 --- a/app/pdf/close_cashier_pdf.rb +++ b/app/pdf/close_cashier_pdf.rb @@ -2,7 +2,7 @@ class CloseCashierPdf < Prawn::Document include NumberFormattable attr_accessor :label_width,:price_column_width,:page_width, :page_height, :margin, :price_width, :item_width, :header_font_size, :item_font_size,:item_height,:qty_width,:total_width,:item_description_width,:text_width - def initialize(printer_settings, shift_sale, sale_items, total_other_charges_info, acc_cate_count, menu_cate_count, total_by_acc, shop_details,sale_taxes,other_payment,total_amount_by_account,total_discount_by_account,total_member_discount,total_dinein,total_takeway,total_other_charges,total_waste,total_spoile,total_credit_payments) + def initialize(printer_settings, shift_sale, sale_items, total_other_charges_info, acc_cate_count, menu_cate_count, total_by_acc, shop_details,sale_taxes,other_payment,total_amount_by_account,total_discount_by_account,total_member_discount,total_dinein,total_takeway,total_other_charges,total_waste,total_spoile,total_credit_payments,payment_methods) self.page_width = printer_settings.page_width #PrintSetting.where("name = ?","Close Cashier").first.page_width self.page_height = printer_settings.page_height self.header_font_size = printer_settings.header_font_size.to_i @@ -43,7 +43,7 @@ class CloseCashierPdf < Prawn::Document stroke_horizontal_rule - shift_detail(shift_sale,sale_taxes,other_payment,total_amount_by_account,total_discount_by_account,total_member_discount,precision,delimiter,total_waste,total_spoile,total_other_charges,total_credit_payments) + shift_detail(shift_sale,sale_taxes,other_payment,total_amount_by_account,total_discount_by_account,total_member_discount,precision,delimiter,total_waste,total_spoile,total_other_charges,total_credit_payments,payment_methods) if !sale_items.nil? or !sale_items.blank? sale_items_detail(sale_items, acc_cate_count, menu_cate_count, total_by_acc, total_other_charges_info) @@ -63,7 +63,7 @@ class CloseCashierPdf < Prawn::Document stroke_horizontal_rule end - def shift_detail(shift_sale,sale_taxes,other_payment,total_amount_by_account,total_discount_by_account,total_member_discount,precision,delimiter,total_waste,total_spoile,total_other_charges,total_credit_payments) + def shift_detail(shift_sale,sale_taxes,other_payment,total_amount_by_account,total_discount_by_account,total_member_discount,precision,delimiter,total_waste,total_spoile,total_other_charges,total_credit_payments,payment_methods) move_down 7 y_position = cursor bounding_box([0,y_position], :width =>self.label_width, :height => self.item_height) do @@ -173,125 +173,138 @@ class CloseCashierPdf < Prawn::Document if shift_sale.other_sales > 0 other_payment.each do |other| @total_foc = other.foc_amount.round(2) - if other.mpu_amount && other.mpu_amount.to_f > 0 - y_position = cursor - bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do - text "MPU Payment :", :size => self.item_font_size, :align => :right - end - bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do - text "#{ number_format(other.mpu_amount, :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right + + if !payment_methods.nil? + payment_methods.each do |method| + y_position = cursor + bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do + text "#{method} Payment :", :size => self.item_font_size, :align => :right + end + bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do + text "#{ number_format(other[method.parameterize.to_sym], :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right + end end end - if other.visa_amount && other.visa_amount.to_f > 0 - y_position = cursor - bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do - text "VISA Payment :", :size => self.item_font_size, :align => :right - end - bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do - text "#{number_format(other.visa_amount, :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right - end - end - - if other.master_amount && other.master_amount.to_f > 0 - y_position = cursor - bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do - text "Master Payment :", :size => self.item_font_size, :align => :right - end - bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do - text "#{ number_format(other.master_amount, :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right - end - end - - if other.jcb_amount && other.jcb_amount.to_f > 0 - y_position = cursor - bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do - text "JCB Payment :", :size => self.item_font_size, :align => :right - end - bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do - text "#{ number_format(other.jcb_amount, :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right - end - end - - if other.unionpay_amount && other.unionpay_amount.to_f > 0 - y_position = cursor - bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do - text "UNIONPAY Payment :", :size => self.item_font_size, :align => :right - end - bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do - text "#{ number_format(other.unionpay_amount, :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right - end - end - - if other.alipay_amount && other.alipay_amount.to_f > 0 - y_position = cursor - bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do - text "Alipay Payment :", :size => self.item_font_size, :align => :right - end - bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do - text "#{ number_format(other.alipay_amount, :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right - end - end - - if other.kbzpay_amount && other.kbzpay_amount.to_f > 0 - y_position = cursor - bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do - text "KBZ Payment :", :size => self.item_font_size, :align => :right - end - bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do - text "#{ number_format(other.kbzpay_amount, :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right - end - end - - if other.junctionpay_amount && other.junctionpay_amount.to_f > 0 - y_position = cursor - bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do - text "JunctionPay Payment :", :size => self.item_font_size, :align => :right - end - bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do - text "#{ number_format(other.junctionpay_amount, :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right - end - end - - if other.dinga_amount && other.dinga_amount.to_f > 0 - y_position = cursor - bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do - text "Dinga Payment :", :size => self.item_font_size, :align => :right - end - bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do - text "#{ number_format(other.dinga_amount, :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right - end - end - - if other.paypar_amount && other.paypar_amount.to_f > 0 - y_position = cursor - bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do - text "Redeem Payment :", :size => self.item_font_size, :align => :right - end - bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do - text "#{ number_format(other.paypar_amount, :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right - end - end - - if other.paymal_amount && other.paymal_amount.to_f > 0 - y_position = cursor - bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do - text "Paymal Payment :", :size => self.item_font_size, :align => :right - end - bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do - text "#{ number_format(other.paymal_amount, :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right - end - end - - if other.giftvoucher_amount && other.giftvoucher_amount.to_f > 0 - y_position = cursor - bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do - text "GiftVoucher Payment :", :size => self.item_font_size, :align => :right - end - bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do - text "#{ number_format(other.giftvoucher_amount, :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right - end - end + # if other.mpu_amount && other.mpu_amount.to_f > 0 + # y_position = cursor + # bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do + # text "MPU Payment :", :size => self.item_font_size, :align => :right + # end + # bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do + # text "#{ number_format(other.mpu_amount, :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right + # end + # end + # + # if other.visa_amount && other.visa_amount.to_f > 0 + # y_position = cursor + # bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do + # text "VISA Payment :", :size => self.item_font_size, :align => :right + # end + # bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do + # text "#{number_format(other.visa_amount, :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right + # end + # end + # + # if other.master_amount && other.master_amount.to_f > 0 + # y_position = cursor + # bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do + # text "Master Payment :", :size => self.item_font_size, :align => :right + # end + # bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do + # text "#{ number_format(other.master_amount, :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right + # end + # end + # + # if other.jcb_amount && other.jcb_amount.to_f > 0 + # y_position = cursor + # bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do + # text "JCB Payment :", :size => self.item_font_size, :align => :right + # end + # bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do + # text "#{ number_format(other.jcb_amount, :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right + # end + # end + # + # if other.unionpay_amount && other.unionpay_amount.to_f > 0 + # y_position = cursor + # bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do + # text "UNIONPAY Payment :", :size => self.item_font_size, :align => :right + # end + # bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do + # text "#{ number_format(other.unionpay_amount, :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right + # end + # end + # + # if other.alipay_amount && other.alipay_amount.to_f > 0 + # y_position = cursor + # bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do + # text "Alipay Payment :", :size => self.item_font_size, :align => :right + # end + # bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do + # text "#{ number_format(other.alipay_amount, :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right + # end + # end + # + # if other.kbzpay_amount && other.kbzpay_amount.to_f > 0 + # y_position = cursor + # bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do + # text "KBZ Payment :", :size => self.item_font_size, :align => :right + # end + # bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do + # text "#{ number_format(other.kbzpay_amount, :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right + # end + # end + # + # if other.junctionpay_amount && other.junctionpay_amount.to_f > 0 + # y_position = cursor + # bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do + # text "JunctionPay Payment :", :size => self.item_font_size, :align => :right + # end + # bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do + # text "#{ number_format(other.junctionpay_amount, :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right + # end + # end + # + # if other.dinga_amount && other.dinga_amount.to_f > 0 + # y_position = cursor + # bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do + # text "Dinga Payment :", :size => self.item_font_size, :align => :right + # end + # bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do + # text "#{ number_format(other.dinga_amount, :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right + # end + # end + # + # if other.paypar_amount && other.paypar_amount.to_f > 0 + # y_position = cursor + # bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do + # text "Redeem Payment :", :size => self.item_font_size, :align => :right + # end + # bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do + # text "#{ number_format(other.paypar_amount, :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right + # end + # end + # + # if other.paymal_amount && other.paymal_amount.to_f > 0 + # y_position = cursor + # bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do + # text "Paymal Payment :", :size => self.item_font_size, :align => :right + # end + # bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do + # text "#{ number_format(other.paymal_amount, :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right + # end + # end + # + # if other.giftvoucher_amount && other.giftvoucher_amount.to_f > 0 + # y_position = cursor + # bounding_box([0,y_position], :width =>self.item_description_width, :height => 20) do + # text "GiftVoucher Payment :", :size => self.item_font_size, :align => :right + # end + # bounding_box([self.item_description_width,y_position], :width =>self.price_width, :height => 20) do + # text "#{ number_format(other.giftvoucher_amount, :precision => precision.to_i, :delimiter => delimiter)}", :size => self.item_font_size, :align => :right + # end + # end end else y_position = cursor diff --git a/app/pdf/receipt_bill_pdf.rb b/app/pdf/receipt_bill_pdf.rb index 5f698b8f..198c0a12 100755 --- a/app/pdf/receipt_bill_pdf.rb +++ b/app/pdf/receipt_bill_pdf.rb @@ -50,7 +50,7 @@ class ReceiptBillPdf < Prawn::Document cashier_info(sale_data, customer_name, latest_order_no) line_items(sale_items,precision,delimiter) - all_total(sale_data,precision,delimiter) + all_total(sale_data,precision,delimiter,printed_status) if member_info != nil @@ -94,6 +94,9 @@ class ReceiptBillPdf < Prawn::Document end if kbz_pay_status + if printed_status == 'credit_payment' + printed_status = 'Paid' + end kbzpay_qr_generator(printed_status, qr_code) end @@ -305,7 +308,7 @@ class ReceiptBillPdf < Prawn::Document end - def all_total(sale_data,precision,delimiter) + def all_total(sale_data,precision,delimiter,printed_status) move_down line_move item_name_width = self.item_width y_position = cursor @@ -432,15 +435,20 @@ class ReceiptBillPdf < Prawn::Document end move_down line_move - sale_payment(sale_data,precision,delimiter) + sale_payment(sale_data,precision,delimiter,printed_status) end - def sale_payment(sale_data,precision,delimiter) + def sale_payment(sale_data,precision,delimiter,printed_status) stroke_horizontal_rule #move_down line_move # sql = "SELECT SUM(payment_amount) # FROM sale_payments where payment_method='creditnote' - # and sale_id='#{sale_data.sale_id}'" + # and sale_id='#{sale_data.sale_id}'" + + if printed_status == 'credit_payment' + sale_payments = SalePayment.select(:payment_amount, :payment_method, :updated_at) + .where("sale_id = '#{sale_data.sale_id}' AND payment_method != 'creditnote'") + else sql = SalePayment.select("(SUM(payment_amount))").where("payment_method='creditnote' and sale_id='#{sale_data.sale_id}'").to_sql # sql1 = "SELECT CASE WHEN s.amount_changed > 0 and (s.amount_received - s.amount_changed) = s.grand_total THEN ( SELECT SUM(payment_amount) # FROM sale_payments where payment_method='creditnote' @@ -458,13 +466,16 @@ class ReceiptBillPdf < Prawn::Document where sa.sale_id='#{sale_data.sale_id}')) = 0 THEN payment_method!='creditnote' ELSE 1 END) AND sale_id = ?", sale_data.sale_id) .group("payment_method") - + end + sale_payments.each do |payment| y_position = cursor if payment.payment_method == "paypar" bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do text "Redeem Payment", :size => self.item_font_size,:align => :left - end + end + elsif printed_status == 'credit_payment' + text "#{payment.payment_method.capitalize} Payment on #{payment.updated_at.strftime('%d-%m-%Y')}", :left_margin => -10, :size => self.item_font_size,:align => :left else bounding_box([0,y_position], :width =>self.item_description_width, :height => self.item_height) do text "#{payment.payment_method.capitalize} Payment", :size => self.item_font_size,:align => :left @@ -741,7 +752,9 @@ class ReceiptBillPdf < Prawn::Document move_down line_move stroke_horizontal_rule move_down line_move - + if printed_status == 'credit_payment' + printed_status = 'Paid' + end move_down line_move y_position = cursor bounding_box([0, y_position], :width =>self.label_width) do diff --git a/app/views/home/dashboard.html.erb b/app/views/home/dashboard.html.erb index 6cd52f4e..b7bd5c44 100755 --- a/app/views/home/dashboard.html.erb +++ b/app/views/home/dashboard.html.erb @@ -189,7 +189,7 @@
Please wait...
+ <%= render 'shared/license_expire_warning' %> @@ -59,7 +60,7 @@ <% end %> <% end %> - <% end %> + <% end %> <%= yield %> + <%= render 'shared/license_expire_warning' %> <%= render 'layouts/header' %><%= @filter %>
| Redeem Sale : | - <% else %> -<%= payment.payment_method.to_s.capitalize %> Sale : | - <% end %> -- <% @sale_data.each do |data| %> - <% pay_mth = payment.payment_method %> - <%= data[""+pay_mth+""] %> + <% @total_payment_methods.each do |payment| %> + <% if !@sale_data[0].empty? %> + <% if payment.payment_method != 'mpu' && payment.payment_method != 'visa' && payment.payment_method != 'master' && payment.payment_method != 'jcb' %> + |
| Redeem Sale : | + <% else %> +<%= payment.payment_method.to_s.capitalize %> Sale : | + <% end %> ++ <% @sale_data.each do |data| %> + <% pay_mth = payment.payment_method %> + <%= data[""+pay_mth+""] %> + <% end %> + | +
| <%= t("views.right_panel.detail.other_payment") %> : | -- <%= total_card["card"].to_f %> - | -|
| <%= t("views.right_panel.detail.other_payment") %> : | ++ <%= total_card["card"].to_f %> + | +
+ <% end %>
+ <% if params[:message].present?
+ if params[:status].to_i == 1
+ color = 'text-success'
+ else
+ color = 'text-danger'
+ end
+ %>
+ <%= params[:message] %>