Class: Auto12Epl
- Inherits:
-
Object
- Object
- Auto12Epl
- Defined in:
- lib/auto12epl.rb
Overview
Generates EPL code that conforms to the Auto12-A standard for specimen labeling
Constant Summary collapse
- DPI =
203- LABEL_WIDTH_IN =
2.0- LABEL_HEIGHT_IN =
0.5
- FONT_X_DOTS =
font constants
[8, 10, 12, 14, 32].freeze
- FONT_Y_DOTS =
[12, 16, 20, 24, 24].freeze
- FONT_PAD_DOTS =
2- HEIGHT_MARGIN =
element heights
0.031
- HEIGHT_ELEMENT =
0.1
- HEIGHT_ELEMENT_SPACE =
0.01
- HEIGHT_PID =
0.1
- HEIGHT_BARCODE =
0.200
- HEIGHT_BARCODE_HUMAN =
0.050
- WIDTH_ELEMENT =
element widths
1.94- WIDTH_BARCODE =
1.395- WIDTH_BARCODE_HUMAN =
1.688- L_MARGIN =
margins
0.031
- L_MARGIN_BARCODE =
0.25
- L_MARGIN_BARCODE_W_STAT =
stat locations
0.200
- L_MARGIN_W_STAT =
0.150
- STAT_WIDTH_ELEMENT =
1.78- STAT_WIDTH_BARCODE =
1.150- STAT_WIDTH_BARCODE_HUMAN =
1.400- BARCODE_TYPE =
constants for generated EPL code
'1A'- BARCODE_NARROW_WIDTH =
'2'- BARCODE_WIDE_WIDTH =
'2'- BARCODE_ROTATION =
'0'- BARCODE_IS_HUMAN_READABLE =
'N'- ASCII_HORZ_MULT =
1- ASCII_VERT_MULT =
1
Instance Attribute Summary collapse
-
#barcode_human_font ⇒ Object
Returns the value of attribute barcode_human_font.
-
#element_font ⇒ Object
Returns the value of attribute element_font.
Instance Method Summary collapse
- #concatName(last_name, first_name, middle_initial) ⇒ Object
-
#full_justify(pid, dag, font, length) ⇒ Object
Add spaces between the NPID and the dob/age/gender so that line is fully justified.
-
#generate_ascii_element(x, y, rotation, font, is_reverse, text) ⇒ Object
generate ascii EPL.
-
#generate_barcode_element(x, y, height, schema_track) ⇒ Object
generate barcode EPL.
-
#generate_epl(last_name, first_name, middle_initial, pid, dob, age, gender, col_date_time, col_name, tests, stat, acc_num, schema_track, number_of_copies = print_copies) ⇒ Object
The main function to generate the EPL.
- #generate_small_specimen_label(last_name, first_name, gender, col_date_time, tests, acc_num, number_of_copies = print_copies) ⇒ Object
-
#initialize(element_font = 1, barcode_human_font = 1) ⇒ Auto12Epl
constructor
A new instance of Auto12Epl.
-
#max_characters(font, length) ⇒ Object
Calculate the number of characters that will fit in a given length.
-
#pad_stat_w_space(stat) ⇒ Object
Add spaces before and after the stat text so that black bars appear across the left edge of label.
- #print_copies ⇒ Object
-
#to_dots(inches) ⇒ Object
convert inches to number of dots using DPI.
-
#truncate_name(last_name, first_name, middle_initial, is_stat) ⇒ Object
Use basic truncation rule to truncate the name element i.e., if > maxCharacters cutoff and trail with +.
Constructor Details
#initialize(element_font = 1, barcode_human_font = 1) ⇒ Auto12Epl
Returns a new instance of Auto12Epl.
60 61 62 63 |
# File 'lib/auto12epl.rb', line 60 def initialize(element_font = 1, = 1) @element_font = element_font = end |
Instance Attribute Details
#barcode_human_font ⇒ Object
Returns the value of attribute barcode_human_font.
16 17 18 |
# File 'lib/auto12epl.rb', line 16 def end |
#element_font ⇒ Object
Returns the value of attribute element_font.
16 17 18 |
# File 'lib/auto12epl.rb', line 16 def element_font @element_font end |
Instance Method Details
#concatName(last_name, first_name, middle_initial) ⇒ Object
95 96 97 |
# File 'lib/auto12epl.rb', line 95 def concatName(last_name, first_name, middle_initial) "#{last_name}, #{first_name}#{middle_initial.nil? ? '' : " #{middle_initial}"}" end |
#full_justify(pid, dag, font, length) ⇒ Object
Add spaces between the NPID and the dob/age/gender so that line is fully justified
169 170 171 172 173 174 175 176 177 |
# File 'lib/auto12epl.rb', line 169 def full_justify(pid, dag, font, length) max_char = max_characters(font, length) spaces_needed = max_char - pid.length - dag.length space = '' spaces_needed.times do space += ' ' end pid + space + dag end |
#generate_ascii_element(x, y, rotation, font, is_reverse, text) ⇒ Object
generate ascii EPL
185 186 187 |
# File 'lib/auto12epl.rb', line 185 def generate_ascii_element(x, y, rotation, font, is_reverse, text) "A#{x},#{y},#{rotation},#{font},#{ASCII_HORZ_MULT},#{ASCII_VERT_MULT},#{is_reverse ? 'R' : 'N'},\"#{text}\"" end |
#generate_barcode_element(x, y, height, schema_track) ⇒ Object
generate barcode EPL
190 191 192 193 |
# File 'lib/auto12epl.rb', line 190 def (x, y, height, schema_track) schema_track = schema_track.gsub('-', '').strip "B#{x},#{y},#{BARCODE_ROTATION},#{BARCODE_TYPE},#{BARCODE_NARROW_WIDTH},#{BARCODE_WIDE_WIDTH},#{height},#{BARCODE_IS_HUMAN_READABLE},\"#{schema_track}\"" end |
#generate_epl(last_name, first_name, middle_initial, pid, dob, age, gender, col_date_time, col_name, tests, stat, acc_num, schema_track, number_of_copies = print_copies) ⇒ Object
The main function to generate the EPL
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
# File 'lib/auto12epl.rb', line 115 def generate_epl(last_name, first_name, middle_initial, pid, dob, age, gender, col_date_time, col_name, tests, stat, acc_num, schema_track, number_of_copies = print_copies) # format text and set margin if stat.nil? name_text = truncate_name(last_name, first_name, middle_initial, false) pid_dob_age_gender_text = full_justify(pid, "#{dob} #{age} #{gender}", @element_font, WIDTH_ELEMENT) l_margin = L_MARGIN = L_MARGIN_BARCODE else name_text = truncate_name(last_name, first_name, middle_initial, true) pid_dob_age_gender_text = full_justify(pid, "#{dob} #{age} #{gender}", @element_font, STAT_WIDTH_ELEMENT) stat_element_text = pad_stat_w_space(stat) l_margin = L_MARGIN_W_STAT = L_MARGIN_BARCODE_W_STAT end = "#{acc_num} * #{schema_track.gsub(/-/i, '')}" collector_element_text = "Col: #{col_date_time} #{col_name}" tests_element_text = tests # generate EPL statements name_element = generate_ascii_element(to_dots(l_margin), to_dots(HEIGHT_MARGIN), 0, @element_font, false, name_text) pid_dob_age_gender_element = generate_ascii_element(to_dots(l_margin), to_dots(HEIGHT_MARGIN + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE), 0, @element_font, false, pid_dob_age_gender_text) = generate_ascii_element(to_dots(), to_dots(HEIGHT_MARGIN + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE + HEIGHT_BARCODE), 0, , false, ) collector_element = generate_ascii_element(to_dots(l_margin), to_dots(HEIGHT_MARGIN + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE + HEIGHT_BARCODE + HEIGHT_BARCODE_HUMAN + HEIGHT_ELEMENT_SPACE), 0, @element_font, false, collector_element_text) tests_element = generate_ascii_element(to_dots(l_margin), to_dots(HEIGHT_MARGIN + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE + HEIGHT_BARCODE + HEIGHT_BARCODE_HUMAN + HEIGHT_ELEMENT_SPACE + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE), 0, @element_font, false, tests_element_text) = (to_dots(), to_dots(HEIGHT_MARGIN + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE), to_dots(HEIGHT_BARCODE) - 4, schema_track) stat_element = generate_ascii_element(to_dots(L_MARGIN) + FONT_Y_DOTS.at(@element_font - 1) + FONT_PAD_DOTS, to_dots(HEIGHT_MARGIN), 1, @element_font, true, stat_element_text) # combine EPL statements if stat.nil? "\nN\nR216,0\nZT\nS1\n#{name_element}\n#{pid_dob_age_gender_element}\n#{barcode_element}\n#{barcode_human_element}\n#{collector_element}\n#{tests_element}\nP#{number_of_copies}\n" else "\nN\nR216,0\nZT\nS1\n#{name_element}\n#{pid_dob_age_gender_element}\n#{barcode_element}\n#{barcode_human_element}\n#{collector_element}\n#{tests_element}\n#{stat_element}\nP#{number_of_copies}\n" end end |
#generate_small_specimen_label(last_name, first_name, gender, col_date_time, tests, acc_num, number_of_copies = print_copies) ⇒ Object
99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/auto12epl.rb', line 99 def generate_small_specimen_label(last_name, first_name, gender, col_date_time, tests, acc_num, number_of_copies = print_copies) " N\n R216,0\n ZT\n S1\n A100,6,0,1,1,1,N,\"\#{first_name}, \#{last_name} - \#{gender}\"\n B120,40,0,1A,1,2,48,N,\"\#{acc_num}\"\n A100,100,0,1,1,1,N,\"\#{acc_num}\"\n A100,118,0,1,1,1,N,\"\#{col_date_time}\"\n A100,140,0,1,1,1,N,\"\#{tests}\"\n P\#{number_of_copies}\n TEXT\nend\n" |
#max_characters(font, length) ⇒ Object
Calculate the number of characters that will fit in a given length
66 67 68 69 70 71 72 |
# File 'lib/auto12epl.rb', line 66 def max_characters(font, length) dots_per_char = FONT_X_DOTS.at(font - 1) + FONT_PAD_DOTS num_char = ((length * DPI) / dots_per_char).round_down num_char.to_int end |
#pad_stat_w_space(stat) ⇒ Object
Add spaces before and after the stat text so that black bars appear across the left edge of label
158 159 160 161 162 163 164 165 166 |
# File 'lib/auto12epl.rb', line 158 def pad_stat_w_space(stat) num_char = max_characters(@element_font, LABEL_HEIGHT_IN) spaces_needed = (num_char - stat.length) / 1 space = '' spaces_needed.times do space += ' ' end space + stat + space end |
#print_copies ⇒ Object
195 196 197 198 199 |
# File 'lib/auto12epl.rb', line 195 def print_copies property = ::GlobalProperty.find_by(property: 'max.lab.order.print.copies') value = property&.property_value&.strip value || 3 end |
#to_dots(inches) ⇒ Object
convert inches to number of dots using DPI
180 181 182 |
# File 'lib/auto12epl.rb', line 180 def to_dots(inches) (inches * DPI).round end |
#truncate_name(last_name, first_name, middle_initial, is_stat) ⇒ Object
Use basic truncation rule to truncate the name element i.e., if > maxCharacters cutoff and trail with +
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
# File 'lib/auto12epl.rb', line 75 def truncate_name(last_name, first_name, middle_initial, is_stat) name_max_characters = if is_stat max_characters(@element_font, STAT_WIDTH_ELEMENT) else max_characters(@element_font, WIDTH_ELEMENT) end if concatName(last_name, first_name, middle_initial).length > name_max_characters # truncate last? last_name = "#{last_name[0..11]}+" if last_name.length > 12 # truncate first? if concatName(last_name, first_name, middle_initial).length > name_max_characters && first_name.length > 7 first_name = "#{first_name[0..7]}+" end end concatName(last_name, first_name, middle_initial) end |