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 ) )
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') )