Beispiel #1
0
def invetariofisico_manageview( request, almacen_id = None, template_name = 'inventarios/inventarios_fisicos/inventariofisico.html' ):
    ''' Crea una vista de la pantalla para inventarios fisicos a puerta abierta por medio de ajustes '''

    connection_name = get_conecctionname( request.session )
    if connection_name == '':
        return HttpResponseRedirect( '/select_db/' )
    almacen = Almacen.objects.get(pk=almacen_id)
    entrada, salida = ajustes_get_or_create(almacen_id = almacen_id, username = request.user.username)
    
    puede_modificar_costos = allow_microsipuser( username = request.user.username, clave_objeto = 469) and almacen.inventario_modifcostos
    form = DoctoInDetManageForm( request.POST or None )
    ubicacion_form = UbicacionArticulosForm(request.POST or None)

    sql = """select DISTINCT C.nombre, b.inv_fin_unid as existencia FROM 
            (select FIRST 20 DISTINCT b.articulo_id, b.nombre, a.sic_fechahora_u
            from doctos_in_det a, articulos b, doctos_in c
            where (b.articulo_id = a.articulo_id and c.docto_in_id = a.docto_in_id) and
                (c.almacen_id = %s and (c.concepto_in_id = 38 or c.concepto_in_id = 27 ) and c.cancelado = 'N' and c.descripcion = 'ES INVENTARIO')
            order by a.sic_fechahora_u DESC) C 
        left JOIN
         orsp_in_aux_art( articulo_id, '%s', '%s','%s','S','N') B
         on C.articulo_id = b.articulo_id
         """% (
                entrada.almacen.ALMACEN_ID, 
                entrada.almacen.nombre, 
                datetime.now().strftime( "01/01/%Y" ),
                datetime.now().strftime( "12/31/%Y" ),
                )
    
    articulos_rows = runsql_rows( sql, connection_name)
    articulos_contados = len( list( set(  InventariosDocumentoDetalle.objects.filter( Q(doctosIn__concepto = 27) | Q(doctosIn__concepto = 38) ).filter( 
        doctosIn__descripcion = 'ES INVENTARIO', 
        doctosIn__cancelado= 'N',
        doctosIn__almacen = entrada.almacen
        ).values_list( 'articulo', flat = True ) ) ))
    articulos = []
    for articulo in articulos_rows:
        articulos.append( { 'articulo' : articulo[0], 'unidades' : articulo[1], } )

    lineas_form = linea_articulos_form()
    c = { 
        'form' : form, 
        'articulos_contados': articulos_contados,
        'lineas_form': lineas_form,
        'puede_modificar_costos': puede_modificar_costos,
        'ubicacion_form' : ubicacion_form, 
        'articulos' : articulos, 
        'almacen' : entrada.almacen, 
        'almacen_id' : almacen_id,
        'entrada_fecha': entrada.fecha, 
        'folio_entrada': entrada.folio, 
        'folio_salida': salida.folio, 
        'entrada_id' : entrada.id,
        'salida_id' : salida.id,
        'is_mobile' : False,
        }
    return render_to_response( template_name, c, context_instance = RequestContext( request ) )
Beispiel #2
0
def invetariofisicomobile_manageView( request, almacen_id = None, template_name = 'inventarios/inventarios_fisicos/mobile/inventariofisico.html' ):
    ''' Crea vista de panttalla para un inventario fisico a puerta abiera por ajustes pero con un diseño para un mobile '''
    connection_name = get_conecctionname(request.session)
    form = DoctoInDetManageForm( request.POST or None )

    entrada, salida = ajustes_get_or_create(almacen_id = almacen_id, username = request.user.username)
    puede_modificar_costos = allow_microsipuser( username = request.user.username, clave_objeto = 469)

    c = { 
        'form' : form,
        'puede_modificar_costos':puede_modificar_costos,
        'almacen' : entrada.almacen, 
        'almacen_id' : almacen_id,
        'entrada_fecha': entrada.fecha, 
        'folio_entrada': entrada.folio, 
        'folio_salida': salida.folio, 
        'entrada_id' : entrada.id,
        'salida_id' : salida.id,
        'is_mobile' : True,
        }
    return render_to_response( template_name, c, context_instance = RequestContext( request ) )    
def ClonarExistencia(sender, **kwargs):
    ''' para en la aplicacion inventarios fisicos generar entradas y salidas en el almacen clon. '''
    almacen_clon = first_or_none( Almacen.objects.filter(pk= almacen_clon_id) )

    detalle =  kwargs.get('instance')
    if almacen_clon and detalle.almacen != almacen_clon:

        if not almacen_clon.inventariando:
            almacen_clon.inventariando = True
            almacen_clon.inventario_conajustes =  detalle.almacen.inventario_conajustes
            almacen_clon.inventario_modifcostos =  detalle.almacen.inventario_modifcostos
            almacen_clon.save()

        entrada_clon, salida_clon = ajustes_get_or_create(almacen_id = almacen_clon.ALMACEN_ID, username = detalle.usuario_ult_modif)   
        
        old_detalle = first_or_none(InventariosDocumentoDetalle.objects.filter(pk=detalle.id))

        existe_en_detalles = InventariosDocumentoDetalle.objects.filter( 
                Q( doctosIn__concepto = 27 ) | Q( doctosIn__concepto = 38 ),
                articulo = detalle.articulo,
                almacen = detalle.almacen,
                doctosIn__descripcion = 'ES INVENTARIO',
            ).count() > 0

       
        unidades_diferencia = detalle.unidades
        
        #ajustar en primer conteo
        if detalle.almacen.inventario_conajustes and not existe_en_detalles:
            existencia_articulo = get_existencias_articulo(
                    articulo_id = detalle.articulo.id, 
                    connection_name = kwargs.get('using'), 
                    fecha_inicio = datetime.now().strftime( "01/01/%Y" ),
                    almacen = almacen_clon, 
                )

            detalle_existencia_articulo = get_existencias_articulo(
                    articulo_id = detalle.articulo.id, 
                    connection_name = kwargs.get('using'), 
                    fecha_inicio = datetime.now().strftime( "01/01/%Y" ),
                    almacen = detalle.almacen, 
                )            
            if detalle.tipo_movto == 'E':
                detalle_existencia_final = detalle.unidades + detalle_existencia_articulo
            elif detalle.tipo_movto == 'S':
                detalle_existencia_final = detalle_existencia_articulo - detalle.unidades
                
            unidades_diferencia = -existencia_articulo + detalle_existencia_final

        if old_detalle:
            if old_detalle.tipo_movto == 'E':
                unidades_diferencia = detalle.unidades - old_detalle.unidades
            elif old_detalle.tipo_movto == 'S':
                unidades_diferencia = (detalle.unidades - old_detalle.unidades)*-1
        else:
            if detalle.tipo_movto == 'E':
                unidades_diferencia = detalle.unidades
            elif detalle.tipo_movto == 'S':
                unidades_diferencia = detalle.unidades *-1

        
        #Entrada
        if unidades_diferencia >= 0:
            
            detalle_clon = first_or_none( InventariosDocumentoDetalle.objects.filter(doctosIn=entrada_clon, articulo=detalle.articulo ))     
            if detalle_clon:
                detalle_clon_unidades =detalle_clon.unidades
                detalle_clon.unidades = detalle_clon.unidades + unidades_diferencia
                detalle_clon.costo_unitario = detalle.costo_unitario
                detalle_clon.costo_total = detalle_clon.unidades * detalle_clon.costo_unitario
                detalle_clon.save()
            else:
                detalle_clon = InventariosDocumentoDetalle.objects.create(
                        doctosIn = entrada_clon,
                        almacen = almacen_clon,
                        concepto = entrada_clon.concepto,
                        claveArticulo = detalle.claveArticulo,
                        articulo = detalle.articulo,
                        tipo_movto = 'E',
                        unidades = unidades_diferencia,
                        costo_unitario = detalle.costo_unitario,
                        costo_total = unidades_diferencia * detalle.costo_unitario,
                        usuario_ult_modif = detalle.usuario_ult_modif
                    )

        #Salida
        elif unidades_diferencia < 0:
            detalle_clon = first_or_none( InventariosDocumentoDetalle.objects.filter(doctosIn=salida_clon, articulo=detalle.articulo ))
            unidades_diferencia = unidades_diferencia * -1
            
            if detalle_clon:
                detalle_clon.unidades = detalle_clon.unidades + unidades_diferencia
                detalle_clon.costo_unitario = detalle.costo_unitario
                detalle_clon.costo_total = detalle_clon.unidades * detalle_clon.costo_unitario
                detalle_clon.save()
            else:
                detalle_clon = InventariosDocumentoDetalle.objects.create(
                        doctosIn = salida_clon,
                        almacen = almacen_clon,
                        concepto = salida_clon.concepto,
                        claveArticulo = detalle.claveArticulo,
                        articulo = detalle.articulo,
                        tipo_movto = 'S',
                        unidades = unidades_diferencia,
                        costo_unitario = detalle.costo_unitario,
                        costo_total = unidades_diferencia * detalle.costo_unitario,
                        usuario_ult_modif = detalle.usuario_ult_modif
                    )

        c = connections[ kwargs.get('using') ].cursor()
        c.execute( "DELETE FROM SALDOS_IN where saldos_in.articulo_id = %s;"% detalle_clon.articulo.id )
        c.execute( "EXECUTE PROCEDURE RECALC_SALDOS_ART_IN %s;"% detalle_clon.articulo.id )
        transaction.commit_unless_managed()
        c.close()

        management.call_command( 'syncdb', database = kwargs.get('using') )