# encoding: utf-8 require 'to_barcode_alfanumerico' require 'to_barcode_numerico' require 'generador_orden' class BarcodeOptimaDecode def initialize(barcode) @barcode = barcode @accion = '' valida_length_barcode end # desactivo la validacion para que también pueda leer codigos viejos: # 8800111100101 # 001111-001-001 def valida_length_barcode # raise "Error: la cantidad de dígitos del barcode es incorrecta. Debe ser 15. Es #{@barcode.length}" unless @barcode.length == 15 end def decode_pedido @pedido = Pedido.find_by_id(@barcode[2..7]) || (raise ErrorIngreso.new "Error al obtener el pedido decodificando el código de barra") end def decode_item cardinalidad_item = @barcode[8..9].to_i @item = decode_cardinalidad_item(cardinalidad_item) || (raise ErrorIngreso.new "Error al obtener el item decodificando el código de barra") end def decode_item_medida cardinalidad_item_medida = @barcode[10..12].to_i @item_medida = decode_cardinalidad_item_medida(cardinalidad_item_medida) || (raise ErrorIngreso.new "Error al obtener la medida decodificando el código de barra") end def decode_objeto barcode_header = @barcode[0..1].to_i barcode_objeto = @barcode[13..14].to_i case barcode_header when 80 then @elemento = decode_cardinalidad_elemento(barcode_objeto) || (raise ErrorIngreso.new "Error al obtener el elemento decodificando el código de barra") when 81 then @componente = decode_orden_componente(barcode_objeto) || (raise ErrorIngreso.new "Error al obtener el componente decodificando el código de barra") when 82 then @composicion = decode_composicion || (raise ErrorIngreso.new "Error al obtener la composición decodificando el código de barra") else raise ErrorIngreso.new "El código debe comenzar con 80 | 81 | 82" end end def decode if @barcode[/C\d\d\d/] @tipo = @barcode[1] @numero = @barcode[2..3].to_i.to_s # 01=> 1 case @tipo when '9' then @accion = 'PROCESO' when '7' then @accion = 'MOMENTO' when '6' then @accion = 'MOTIVO' when '5' then @accion = 'SELECCIONAR' when '8' then @accion = 'REDIRECCION' end elsif @barcode.length.between?(9,11) @barcode_alfanumerico = @barcode @barcode = @barcode.to_i36.to_s decode_pedido decode_item decode_item_medida decode_objeto else decode_pedido decode_item decode_item_medida decode_objeto end self end # PARA LOS CODIGOS DE BARRA, SE LES PIDE ACCION Y NUMERO def accion @accion end def numero @numero end ######################################################## def pedido @pedido end def item @item end def item_medida @item_medida end def elemento @elemento end def componente @componente || @elemento.try(:componente) end def composicion @composicion || @elemento.try(:componente).try(:composicion) || @componente.try(:composicion) end def decode_cardinalidad_item(cardinalidad) @pedido.items.order(:id).each do |item| return item if item.cardinalidad == cardinalidad end false end def decode_cardinalidad_item_medida(cardinalidad) @item.item_medidas.order(:id).each do |item_medida| return item_medida if item_medida.cardinalidad == cardinalidad end false end def decode_cardinalidad_elemento(cardinalidad) elementos_materiales = @item.composicion.get_elementos_materiales_ordenados elementos_materiales.each do |elemento| return elemento if elemento.cardinalidad == cardinalidad end false end def decode_orden_componente(orden) @item.composicion.componentes.select{|c| c.orden == orden}.compact[0] end def decode_composicion @item.composicion end end