app/models/extface/driver/datecs/fp550.rb in extface-0.4.6 vs app/models/extface/driver/datecs/fp550.rb in extface-0.4.7
- old
+ new
@@ -4,15 +4,35 @@
RESPONSE_TIMEOUT = 3 #seconds
INVALID_FRAME_RETRIES = 6 #count (bad length, bad checksum)
ACKS_MAX_WAIT = 60 #count / nothing is forever
NAKS_MAX_COUNT = 3 #count
+
+ TAX_GROUPS_MAP = {
+ 1 => "\xc0",
+ 2 => "\xc1",
+ 3 => "\xc2",
+ 4 => "\xc3",
+ 5 => "\xc4",
+ 6 => "\xc5",
+ 7 => "\xc6",
+ 8 => "\xc7"
+ }
+
+ PAYMENT_TYPE_MAP = {
+ 1 => "P",
+ 2 => "N",
+ 3 => "C",
+ 4 => "D",
+ 5 => "B"
+ }
include Extface::Driver::Datecs::CommandsV1
def handle(buffer)
- if i = buffer.index(/[\x03\x16\x15]/) # find position of frame possible delimiter
+ #if i = buffer.index(/[\x03\x16\x15]/) # find position of frame possible delimiter
+ if i = buffer.index("\x03") || buffer.index("\x16") || buffer.index("\x15")
rpush buffer[0..i] # this will make data available for #pull(timeout) method
return i+1 # return number of bytes processed
end
end
@@ -75,12 +95,12 @@
fsend(Info::GET_STATUS, 'X') # get 6 bytes status
errors.empty?
end
#fiscal
- def open_fiscal_doc(operator = "1", password = "1")
- fsend Sales::START_FISCAL_DOC, "#{operator.presence || "1"},#{password.presence || "1"},00001"
+ def open_fiscal_doc(operator = "1", password = "000000")
+ fsend Sales::START_FISCAL_DOC, "#{operator.presence || "1"},#{password.presence || "000000"},00001"
@fiscal_session = true
end
def close_fiscal_doc
raise "Not in fiscal session" unless @fiscal_session
@@ -130,11 +150,11 @@
end
def cancel_doc_session
device.session("Doc cancel") do |s|
s.notify "Doc Cancel Start"
- s.fsend Sales::CANCEL_DOC
+ s.fsend Sales::CANCEL_FISCAL_DOC
s.paper_cut
s.notify "Doc Cancel End"
end
end
@@ -163,11 +183,11 @@
errors.add :base, "#{NAKS_MAX_COUNT} NAKs Received. Abort!"
break
end
elsif !resp.ack?
invalid_frames += 1
- if nak_messages > INVALID_FRAME_RETRIES
+ if invalid_frames > INVALID_FRAME_RETRIES
errors.add :base, "#{INVALID_FRAME_RETRIES} Broken Packets Received. Abort!"
break
end
end
push packet_data unless resp.ack?
@@ -209,15 +229,29 @@
def human_status_errors(status) #6 bytes status
status_0 = status[0].ord
errors.add :base, "Fiscal Device General Error" unless (status_0 & 0x20).zero?
errors.add :base, "Invalid Command" unless (status_0 & 0x02).zero?
errors.add :base, "Date & Time Not Set" unless (status_0 & 0x04).zero?
- errors.add :base, "Syntax Error" unless (status_0 & 0x02).zero?
+ errors.add :base, "Syntax Error" unless (status_0 & 0x01).zero?
status_1 = status[1].ord
+ errors.add :base, "Unpermitted Command In This Mode" unless (status_1 & 0x02).zero?
+ errors.add :base, "Field Overflow" unless (status_1 & 0x01).zero?
end
private
+ def build_sale_data(item)
+ "".tap() do |data|
+ data << item.text1 unless item.text1.blank?
+ data << "\x0a#{text2}" unless item.text2.blank?
+ data << "\t"
+ data << TAX_GROUPS_MAP[item.tax_group || 2]
+ data << ("%.2f" % item.price)
+ data << "*#{item.qty.to_s}" unless item.qty.blank?
+ data << ",#{item.percent}" unless item.percent.blank?
+ data << ",;#{'%.2f' % item.neto}" unless item.neto.blank?
+ end
+ end
def sequence_number
@seq ||= 0x1f
@seq += 1
@seq = 0x1f if @seq == 0x7f
@@ -226,11 +260,11 @@
class Frame
include ActiveModel::Validations
attr_reader :frame, :len, :seq, :cmd, :data, :status, :bcc
- validates_presence_of :frame, unless: :unpacked?
+ validates_presence_of :frame#, unless: :unpacked?
validate :bcc_validation
validate :len_validation
def initialize(buffer)
if match = buffer.match(/\x01(.{1})(.{1})(.{1})(.*)\x04(.{6})\x05(.{4})\x03/nm)
@@ -248,9 +282,10 @@
def ack?; !!@ack; end #should wait, response is yet to come
def nak?; !!@nak; end #should retry command with same seq
private
+
def unpacked? # is it packed or unpacked message?
@ack || @nak
end
def bcc_validation
\ No newline at end of file