lundi 11 décembre 2017

You can not call create unless the parent is saved. Help In ruby CODE Fail

I have the following You can not call create unless the parent is saved try saving @p before and enter an infinite save cycle. some idea because I share my code thanks.

    class EncabezadosController < ApplicationController
    files = Dir.glob("#{Rails.root}/lib/oc/*.txt").select do |item| #abre cualquier archivo sin conocer el nombre
  
     next if File.directory? item # busca al siguiente archivo 
     
      
       
    #def   nose 
      File.foreach(item).with_object([]) do |line, result| # recorre el archivo item linea por linea para guardar el encabezado
               puts line    
           

            if line.start_with?('UNH') #leo linea que empiece por UNH
               clave1     =  'ORDEN DE COMPRA'
            end    

              if line.start_with?('BGM')#leo linea que empiece por 
                  clave2     = line[0..2]
                  @codigooc = line[6...26]  
                if line.include?('BGM2') 
                   tipooc = 'ORDEN DE COMPRA '   
                   cajas = line[-1]           
                   else                    
                   tipooc = 'ORDEN DE COMPRA SUGERIDA'
                end
                 if cajas = '1'  
                    @dtipooc = 'CANCELACION'
                end
                if cajas = '9'
                   @dtipooc = 'ORIGINAL'                
                end
                if cajas = '6'
                   @dtipooc = 'PROPUESTA'                        
                end 
            end#line GBM

          if line.start_with?('DTM137')
             fechag2 = Date.new.strftime("%Y/%m/%d")
             clave     = line[0..5]
             fechag = line[6...14]
             @fechag2 = fechag
             @fechag2.unpack('A2A4A2').rotate.join('/')
          end
          if line.start_with?('DTM ')
             fechaen2 = Date.new.strftime("%Y/%m/%d")
             clave    = line[0..2]
             fechaen = line[6...14]
             @fechaen2 = fechaen            
          end
         if line.start_with?('DTM157')# 
            fechalist2 = Date.new.strftime("%Y/%m/%d")
            fechalist = line[6...14]
            @fechalist2 = fechalist 
         end
    
         if line.start_with?('NADBY')              
            clave     = line[0..4]
            @comprador = line[6...-1]#valor original 6..1 modificado por pruebebas              
         end
         if line.start_with?('NADSU')
            clave = line[0..4]
            @proveedor = line[6...-1]       
         end
         #aqui obtengo el nombre de el proveedor
         if line.start_with?('CTAOC') and line.include?('LA VINOTECA LIMITADA') or line.include?('AVDA.MANUEL MONT 1452') or line.include?('3433607')
            clave     = line[0..4]
            @emisor = "LA VINOTECA LIMITADA"          
         end
         #aqui obtengo el nombre del emisor
         if line.start_with?('CTAOC') and !line.include?('LA VINOTECA LIMITADA') and !line.include?('AVDA.MANUEL MONT 1452') and !line.include?('3433607')
            @emisor2 = line[6...-1] 
        

       
         end
         if line.start_with?('PAT')
            clave     = line[0..2]
            @tpago = line[5]
            @tpago2 = @tpago.to_s
            @dias_entrega = line[7..8]  
            @dias_entrega2 = @dentrega.to_s          
            @dias_pagar = line [-3..-1]
            @dpagar2 = @dpagar.to_s
            #result << "#{clave} , codigo #{tpago} , condiciones normales #{tpago} , dias para entrega #{dentrega}  , Dias para pagar #{dpagar} "
         end
         if line.start_with?('TODNC')#tipo flete
            clave     = line[0..4]
            @flete1 = 'flete por cuenta del vendedor sin costo'
         else
            @flete1 = 'flete por cuenta del comprador'        
         end
         if line.start_with?('LOC')
            clave     = line[0..2]
            lugar = line[5]
            codigolugar = line[6...-1]
            @codigolugar2 = codigolugar           
         end
           
        end#do
        #@p = Encabezado.new( numero_oc:@codigooc , tipo_oc:@dtipooc ,                                       fecha_g:@fechag2 , lugar_entrega:@codigolugar2 , inf_comprador:@emisor2 ,  fecha_en: @fechaen2 , fecha_list: @fechalist2 , d_comprador:@comprador , emisor:@emisor, codic_pago:@tpago2 , diascredito:@dpagar , text:@flete1 , diasentrega:@dentrega2)

        #.new luego del ciclo porque necesito generar el vinculo de la tabla     encabezado con detalles
    @p = Encabezado.new( numero_oc: @codigooc , tipo_oc: @dtipooc , fecha_g:     @fechag2 , lugar_entrega: @codigolugar2, inf_comprador: @emisor2, fecha_en: @fechaen2, fecha_list: @fechalist2, d_comprador: @comprador,emisor: @emisor, codic_pago: @flete1, dias_credito: @dpagar, monto_total: @Monototal, dias_entrega:@dentrega2, status_oc: "Inicial")    
          

   File.foreach(item).with_object([]) do |line, result| #recorro la linea del mismo archivo solo para guardar el detalle
       puts "procensando linea #{line} ..."
            case
               
            when line.start_with?('BGM') #numero oc
                  clave2     = line[0..2]
                  @codigooc2 = line[6...26]  

            when line.start_with?('LIN') # indica el numero item y codigo
                @cproducto = line[9..-2]
                @numeroitem = line[7..8]
                @numeroitem2 = @numeroitem.to_s
            when line.start_with?('IMD') #indica la descripcion
                @desproducto = line[8..-1]
            when line.start_with?('QTY 21')  # indica la cantidad pedida y el tipo de unidad de caja                      
                @cantidadpedida = line[19..20]              
                @caja   = line[-3..-1]
                pedido = '?????????????????????'
                when line.start_with?('QTY129') # cantidad de unidades que trae una caja
                @cantidadunidades = line[-6..-4]                               
                @tunidad = 'Unidades Simples'
                #Detalle.last.destroy                        
            when line.start_with?('MOA203') #precio neto del producto               
                @precioneto = line[7..-1] # not [-10..-1
                @precioneto2 = @precioneto.to_f.round(3).to_f              
            when line.start_with?('MOA 204') #monto del descuento pueden haber hasta dos descuentos en una oc               
                @tdescu = 'Descuento'
                @valordescu = line[-10..-1]
            when line.start_with?('PRIAAA') #precio neto de lista de precio por unidad
                pedido = line[-3..-1]
                @valorcd = line[-16..-8]                            
               # @tcaja2  = unitOfMeasure(pedido)
            when (line.start_with?('ALCA') and (line.include?('DE1') or line.include?('DE2')))
                @cdescuento = 'DESCUENTO'              
            when line.start_with?('ALCC') && (line.include?('CA1') || line.include?('CA1'))   
         
                @ccargo = 'CARGO'   
                     
            if line.start_with?('PCD')           
               
                  
                  @porcentaje   = line[-6..-1] # 
                  @porcentaje2   = line[-6..-1]
                  
                  
            end    
             when line.start_with?('MOA 23') #valor en monto del cargo
                  @tcargo = 'Cargo'
                  @valorcargo = line[-10..-1]
         
            when line.start_with?('MOA 86') # monto a pagar total factura
                clave   = line[0..2]              
                importe = line[-9..-1]               
            when line.start_with?('CNT')                             
                @items2 = line[-2..-1]
            else

                puts 'empieza con otra cosa'
            end
  
  

#@p.detalles.create( numero_oc:@codigooc, cod_prod:@cproducto,descrip:@desproducto, numero_item:@numeroitem2, cantidadpedida:@cantidadpedida , precio_unit: @precioneto2 ) 
 @p.detalles.create( numero_oc:@codigooc, cod_prod: @cproducto, descripcion: @desproducto, numero_item: @numeroitem2, cantidad_pedida: @cantidadpedida , precio_unit: @precioneto2 , tipo_caja: @cantidadunidades ,  total_linea: @precioneto2, p_descu1: @porcentaje , monto_descu1: @valordescu, p_descu2: @porcentajedescu2, monto_descu2:"" , p_cargo1:"" , monto_cargo1: @valorcargo)         
       
     end #do
    @p.save
    File.delete(item) if File.exist?(item)
    end #dir
    #borra cada archivo leido para evitar duplicidad

    end #clase
    @p

Aucun commentaire:

Enregistrer un commentaire