Пример #1
0
def generar_polizas_View(request, template_name='cuentas_por_pagar/herramientas/generar_polizas/generar_polizas.html'):
    connection_name = get_conecctionname(request.session)
    if connection_name == '':
        return HttpResponseRedirect('/select_db/')

    documentosData  = []
    msg             = msg_resultados = msg_informacion = ''

    if request.method == 'POST':
        
        form = GenerarPolizasManageForm(request.POST)
        if form.is_valid():
            fecha_ini               = form.cleaned_data['fecha_ini']
            fecha_fin               = form.cleaned_data['fecha_fin']
            ignorar_documentos_cont = form.cleaned_data['ignorar_documentos_cont']
            crear_polizas_por       = form.cleaned_data['crear_polizas_por']
            crear_polizas_de        = form.cleaned_data['crear_polizas_de']
            plantilla               = form.cleaned_data['plantilla']
            descripcion             = form.cleaned_data['descripcion']

            msg = 'es valido'

            documentosData, msg = generar_polizas(fecha_ini, fecha_fin, ignorar_documentos_cont, crear_polizas_por, crear_polizas_de, plantilla, descripcion, connection_name, request.user.username)
            if documentosData == []:
                msg_resultados = 'Lo siento, no se encontraron resultados para este filtro'
            else:
                form = GenerarPolizasManageForm()       
                msg_informacion = 'Polizas generadas satisfactoriamente, *Ahora revisa las polizas pendientes generadas en el modulo de contabilidad'
    else:
        form = GenerarPolizasManageForm()
    c = {'documentos':documentosData,'msg':msg,'form':form, 'msg_resultados':msg_resultados,'msg_informacion':msg_informacion,}
    return render_to_response(template_name, c, context_instance=RequestContext(request))
Пример #2
0
def orden_manageview(request, id=None, template_name='compras/documentos/ordenes/orden.html'):


    connection_name = get_conecctionname(request.session)
    message = ''
    nuevo = False
    hay_repetido = False
    
    if id:
        documento = get_object_or_404( ComprasDocumento, pk = id )
    else:
        documento = ComprasDocumento()

    comprasdet_forms = DocumentoComprasDetalleFormset(DocumentoComprasDetalleManageForm, extra=1, can_delete=True)
    compradetalles_formset = comprasdet_forms(request.POST or None, instance=documento)
    

    documento_form = OrdenManageForm( request.POST or None, instance = documento)
    impuestos_form = DocumentoComprasImpuestosManageForm( request.POST or None)
    
    if documento_form.is_valid() and compradetalles_formset.is_valid() and impuestos_form.is_valid():
        
        documento = documento_form.save(commit=False)
        documento.tipo = 'C'
        documento.subtipo = 'N'
        documento.aplicado = 'N'
        documento.acreditar_cxp= 'N' 
        documento.contabilizado = 'N'
        documento.forma_emitida = 'N'
        
        documento.condicion_pago = documento.proveedor.condicion_de_pago
        importe_neto = 0
        for articulo_form in compradetalles_formset:
            importe_neto = importe_neto + articulo_form.cleaned_data['precio_total_neto']

        documento.importe_neto = importe_neto
        documento.save()

        #GUARDA ARTICULOS DE INVENTARIO FISICO
        for articulo_form in compradetalles_formset:
            detalle = articulo_form.save(commit = False)
            #PARA CREAR UNO NUEVO
            if not detalle.id:
                detalle.id = -1
                detalle.documento = documento

        compradetalles_formset.save()
    orden_id = None
    orden_id = documento.id
    
    c = {
        'documento_form':documento_form, 
        'formset':compradetalles_formset, 
        'impuestos_form':impuestos_form,
        'orden_id':orden_id,
        'documento_estado':documento.estado,
    }

    return render_to_response(template_name, c, context_instance=RequestContext(request))
Пример #3
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 ) )
Пример #4
0
def entrada_manageView( request, id = None, template_name='inventarios/Entradas/entrada.html' ):
    connection_name = get_conecctionname(request.session)
    message = ''
    nuevo = False
    hay_repetido = False
    if id:
        Entrada = get_object_or_404( InventariosDocumento, pk = id )
    else:
        Entrada = InventariosDocumento()
    
    initial_entrada = None
    if id:
        Entrada_items = doctoIn_items_formset(DoctosInDetManageForm, extra=0, can_delete=True)
    else:
        initial_entrada = { 'fecha': datetime.now(),}
        Entrada_items = doctoIn_items_formset(DoctosInDetManageForm, extra=1, can_delete=True)

    Entrada_form = EntradaManageForm( request.POST or None, instance = Entrada, initial = initial_entrada )
    EntradaItems_formset = Entrada_items(request.POST or None, instance=Entrada)

    if Entrada_form.is_valid() and EntradaItems_formset.is_valid():
        Entrada = Entrada_form.save(commit = False)
        #CARGA NUEVO ID
        if not Entrada.id:
            Entrada.naturaleza_concepto = 'E'
            Entrada.aplicado ='N'
            Entrada.save()
            nuevo = True
        else:
            Entrada.aplicado ='S'
            Entrada.save()

        articulos_recalculo = []
        #GUARDA ARTICULOS DE INVENTARIO FISICO
        for articulo_form in EntradaItems_formset:
            DetalleEntrada = articulo_form.save(commit = False)
            #PARA CREAR UNO NUEVO
            if not DetalleEntrada.id:
                DetalleEntrada.id = -1
                DetalleEntrada.almacen = Entrada.almacen
                DetalleEntrada.concepto = Entrada.concepto
                DetalleEntrada.doctosIn = Entrada
            articulos_recalculo.append(DetalleEntrada.articulo.id)

        EntradaItems_formset.save()

        if not nuevo:
            for articulo_id in articulos_recalculo:
                recalcular_saldos_articulo(articulo_id, connection_name)

        return HttpResponseRedirect('/inventarios/entradas')
    
    c = {'Entrada_form': Entrada_form, 'formset': EntradaItems_formset, 'message':message,}
    return render_to_response(template_name, c, context_instance=RequestContext(request))
Пример #5
0
def generar_polizas_View(request, template_name='punto_de_venta/herramientas/generar_polizas.html'):
    connection_name = get_conecctionname(request.session)
    if connection_name == '':
        return HttpResponseRedirect('/select_db/')

    polizas_ventas  = []
    error           = 0
    msg             = msg_informacion =''

    if request.method == 'POST':
        form = GenerarPolizasManageForm( request.POST)
        if form.is_valid():

            fecha_ini                   = form.cleaned_data['fecha_ini']
            fecha_fin                   = form.cleaned_data['fecha_fin']
            ignorar_documentos_cont     = form.cleaned_data['ignorar_documentos_cont']
            crear_polizas_por           = form.cleaned_data['crear_polizas_por']
            crear_polizas_de            = form.cleaned_data['crear_polizas_de']
            plantilla_ventas            = form.cleaned_data['plantilla_ventas']
            plantilla_devoluciones      = form.cleaned_data['plantilla_devoluciones']
            plantilla_cobros_cc         = form.cleaned_data['plantilla_cobros_cc']
            descripcion                 = form.cleaned_data['descripcion']

            if (crear_polizas_de == 'V' and not plantilla_ventas == None) or (crear_polizas_de == 'D' and not plantilla_devoluciones == None):
                msg = 'es valido'
                polizas_ventas, polizas_devoluciones, msg = generar_polizas(
                    fecha_ini=fecha_ini, 
                    fecha_fin=fecha_fin, 
                    ignorar_documentos_cont=ignorar_documentos_cont, 
                    crear_polizas_por=crear_polizas_por, 
                    crear_polizas_de=crear_polizas_de, 
                    plantilla_ventas=plantilla_ventas, 
                    plantilla_devoluciones=plantilla_devoluciones, 
                    descripcion= descripcion,
                    connection_name = connection_name,
                    usuario_micorsip = request.user.username,
                    )
            else:
                error =1
                msg = 'Seleciona una plantilla'

            if polizas_ventas == [] and not error == 1:
                msg = 'Lo siento, no se encontraron documentos para ralizar polizas con este filtro'
            elif not polizas_ventas == [] and not error == 1:
                form = GenerarPolizasManageForm()       
                msg_informacion = 'Polizas generadas satisfactoriamente, *Ahora revisa las polizas pendientes generadas en el modulo de contabilidad'
    else:
        form = GenerarPolizasManageForm()
    
    c = {'documentos':polizas_ventas,'msg':msg,'form':form,'msg_informacion':msg_informacion,}
    return render_to_response(template_name, c, context_instance=RequestContext(request))
Пример #6
0
def add_articulossinexistencia( request, **kwargs ):
    """ Agrega articulos almacenables de la linea indicada faltantes en los documentos de ajustes indicados.  """
    #Paramentros
    connection_name = get_conecctionname(request.session)
    ubicacion = kwargs.get( 'ubicacion', None )
    almacen_id = kwargs.get( 'almacen_id', None )
    almacen = Almacen.objects.get( pk= almacen_id )
    message= ''

    return add_articulos_sincontar(
            request_username = request.user.username,
            connection_name = connection_name,
            ubicacion = ubicacion,
            almacen = almacen,
        )
Пример #7
0
def generar_factura_global( request, **kwargs ):

    # Parametros
    connection_name = get_conecctionname(request.session)
    fecha_inicio = datetime.datetime.strptime( kwargs.get( 'fecha_inicio', None ), '%d/%m/%Y' ).date()
    # fecha_fin = datetime.strptime( kwargs.get( 'fecha_inicio', None ), '%d/%m/%Y' ).date()
    fecha_fin = datetime.datetime.strptime( kwargs.get( 'fecha_fin', None ), '%d/%m/%Y' ).date()
    almacen = first_or_none( Almacen.objects.filter( pk = kwargs.get('almacen_id', None) ) )
    cliente = Cliente.objects.get( pk = int( kwargs.get('cliente_id', None) ) )
    cliente_direccion =  first_or_none( ClienteDireccion.objects.filter(cliente=cliente) )
    factura_tipo = kwargs.get('factura_tipo', None)
    modalidad_facturacion = kwargs.get('modalidad_facturacion', None)

    #SI NO EXITE ARICULO DE PUBLICO EN GENERAL
    articulo_ventaspg_id = Registry.objects.get( nombre = 'ARTICULO_VENTAS_FG_PV_ID' )
    articulo_ventaspg_id.save(update_fields=['valor',])
    if not Articulo.objects.filter(pk=articulo_ventaspg_id.valor).exists() and factura_tipo == 'P':
        c = {'message':'por favor primero espesifica un articulo general',}
        return HttpResponse( json.dumps(c), mimetype = "application/javascript" )
    
    if cliente_direccion.rfc_curp != "XAXX010101000":
        c = {'message':'Una factura global solo puede realizar a clientes con \nRFC: XAXX010101000',}
        return HttpResponse( json.dumps(c), mimetype = "application/javascript" )

    data = new_factura_global(
            fecha_inicio = fecha_inicio,
            fecha_fin = fecha_fin,
            almacen = almacen,
            cliente = cliente,
            cliente_direccion = cliente_direccion,
            factura_tipo = factura_tipo,
            modalidad_facturacion = modalidad_facturacion,
            connection_name = connection_name,
            username = request.user.username
        )

    c = {
        'detalles': data['detalles'], 
        'totales': data['totales'],
        'ventas_facturadas':data['ventas_facturadas'],
        'message': data['message'],
        'fecha_inicio': data['fecha_inicio'],
        'fecha_fin':data['fecha_fin'],
        'impuestos': data['impuestos'],
        }

    return HttpResponse( json.dumps(c), mimetype = "application/javascript" )
Пример #8
0
def almacenes_view( request, template_name = 'inventarios/almacenes/almacenes.html' ):
    ''' Muestra almacenes con link para entrar a hacer inventario en cada uno de ellos  '''

    connection_name = get_conecctionname(request.session)
    if connection_name == '':
        return HttpResponseRedirect( '/select_db/' )
    
    almacenes = Almacen.objects.all()

    if "Chrome" in request.META[ 'HTTP_USER_AGENT' ]:
       request.mobile = False
       
    if request.mobile:
        url_inventario = '/inventarios/inventariofisicomobile/'
    else:
        url_inventario = '/inventarios/inventariofisico/'

    c = { 'almacenes': almacenes, 'url_inventario': url_inventario, }
    return render_to_response( template_name, c, context_instance = RequestContext( request ) )
Пример #9
0
def invetariosfisicos_view( request, template_name = 'inventarios/inventarios_fisicos/inventariosfisicos.html' ):
    ''' Muestra inventarios fisicos abiertos  '''

    connection_name = get_conecctionname(request.session)
    if connection_name == '':
        return HttpResponseRedirect( '/select_db/' )
    
    inventarios_fisicos = InventariosDocumentoIF.objects.filter(aplicado='N', cancelado='N').order_by('-fecha')

    if "Chrome" in request.META[ 'HTTP_USER_AGENT' ]:
       request.mobile = False
       
    if request.mobile:
        url_inventario = '/inventarios/inventariofisicomobile/'
    else:
        url_inventario = '/inventarios/inventariofisico/'

    c = { 'inventarios_fisicos' : inventarios_fisicos, 'url_inventario' : url_inventario,}
    return render_to_response( template_name, c, context_instance = RequestContext( request ) )
Пример #10
0
def add_articulossinexistencia_bylinea( request, **kwargs ):
    """ Agrega articulos almacenables de la linea indicada faltantes en los documentos de ajustes indicados.  """
    #Paramentros
    connection_name = get_conecctionname(request.session)
    ubicacion = kwargs.get( 'ubicacion', None )
    linea_id = kwargs.get( 'linea_id', None )
    almacen_id = kwargs.get( 'almacen_id', None )
    message= ''

    linea = LineaArticulos.objects.get( pk = linea_id )
    almacen = Almacen.objects.get( pk= almacen_id )

    return add_articulos_sincontar( 
            request_username = request.user.username,
            connection_name= connection_name,
            ubicacion= ubicacion,
            linea = linea,
            almacen= almacen,
        )

    return json.dumps( { 'articulos_agregados' : articulos_agregados, 'articulo_pendientes' : articulos_pendientes, 'message': message, } )
Пример #11
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 ) )    
Пример #12
0
def preferenciasEmpresa_View(request, template_name='cuentas_por_pagar/herramientas/generar_polizas/preferencias_empresa.html'):
    connection_name = get_conecctionname(request.session)
    if connection_name == '':
        return HttpResponseRedirect('/select_db/')

    try:
        informacion_contable = InformacionContable_CP.objects.all()[:1]
        informacion_contable = informacion_contable[0]
    except:
        informacion_contable = InformacionContable_CP()
    condpago = informacion_contable.condicion_pago_contado
    
    form = InformacionContableManageForm(request.POST or None, instance=informacion_contable)
    msg = ''
    if form.is_valid():
        form.save()
        msg = 'Datos Guardados Exitosamente'

    plantillas = PlantillaPolizas_CP.objects.all()
    c= {'form':form,'msg':msg,'plantillas':plantillas,}
    return render_to_response(template_name, c, context_instance=RequestContext(request))
Пример #13
0
def devoluciones_de_ventas_view(request, template_name='punto_de_venta/documentos/devoluciones/devoluciones_de_ventas.html'):
    connection_name = get_conecctionname(request.session)
    if connection_name == '':
        return HttpResponseRedirect('/select_db/')

    documentos_list = PuntoVentaDocumento.objects.filter(tipo='D')
    
    paginator = Paginator(documentos_list, 15) # Muestra 10 documentos por pagina
    page = request.GET.get('page')

    #####PARA PAGINACION##############
    try:
        documentos = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        documentos = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        documentos = paginator.page(paginator.num_pages)
    
    c = {'documentos':documentos}
    return render_to_response(template_name, c, context_instance=RequestContext(request))
Пример #14
0
def polizas_pendientesView(request, template_name='contabilidad/polizas/polizas_pendientes.html'):
    connection_name = get_conecctionname(request.session)
    if connection_name == '':
        return HttpResponseRedirect('/select_db/')

    polizas_list = ContabilidadDocumento.objects.filter(estatus='P').order_by('-fecha') 

    paginator = Paginator(polizas_list, 15) # Muestra 5 inventarios por pagina
    page = request.GET.get('page')

    #####PARA PAGINACION##############
    try:
        polizas = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        polizas = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        polizas = paginator.page(paginator.num_pages)

    c = {'polizas':polizas}
    return render_to_response(template_name, c, context_instance=RequestContext(request))
Пример #15
0
def get_precio_articulo(request, template_name='punto_de_venta/articulos/articulos/precio.html'):
    connection_name = get_conecctionname(request.session)
    c = connections[connection_name].cursor()
    articulo = ''
    precio = '' 
    precio_lista= ''
    form = articulo_byclave_form(request.POST or None)
    if form.is_valid():
        clave = form.cleaned_data['clave']
        articulo = ArticuloClave.objects.get(clave=clave).articulo

        c.execute("EXECUTE PROCEDURE GET_PRECIO_ARTCLI(331,%s,'2013/11/27');"%articulo.id)
        row = c.fetchone()
        precio = row[0]
        precio_lista = row[2]
        c.close()

    c = {
        'form':form,
        'articulo':articulo,
        'precio':precio,
        'precio_lista':precio_lista,
    }
    return render_to_response(template_name, c, context_instance=RequestContext(request))
Пример #16
0
def get_existenciasarticulo_byid( request, **kwargs ):
    """ Para obterner existencia de un articulo segun id del articulo """
    #Paramentros
    almacen_nombre = kwargs.get( 'almacen', None)
    almacen = Almacen.objects.get(nombre = almacen_nombre)
    articulo_id = kwargs.get( 'articulo_id', None)
    entrada_id = kwargs.get( 'entrada_id', None )
    connection_name = get_conecctionname( request.session )
    detalle_modificacionestime = ''
    detalle_modificacionestime_salidas = ''
    ya_ajustado = False
    
    articulo = Articulo.objects.get( pk = articulo_id )

    detalles_all = InventariosDocumentoDetalle.objects.filter(
        Q( doctosIn__concepto = 27 ) | Q( doctosIn__concepto = 38 ),
        articulo = articulo,
        almacen = almacen,
        doctosIn__descripcion = 'ES INVENTARIO').order_by('fechahora_ult_modif')

    if detalles_all:
        ya_ajustado = True
    else:
        c = connections[ connection_name ].cursor()
        c.execute( "DELETE FROM SALDOS_IN where saldos_in.articulo_id = %s;"% articulo.id )
        c.execute( "EXECUTE PROCEDURE RECALC_SALDOS_ART_IN %s;"% articulo.id )
        transaction.commit_unless_managed()
        c.close()

        management.call_command( 'syncdb', database = connection_name )

    inv_fin = get_existencias_articulo(
        articulo_id = articulo_id , 
        connection_name = connection_name, 
        fecha_inicio = datetime.now().strftime( "01/01/%Y" ),
        almacen = almacen_nombre, )
 
    detalles_entradas = InventariosDocumentoDetalle.objects.filter(
        Q( doctosIn__concepto = 27 ),
        articulo = articulo,
        almacen = almacen,
        doctosIn__descripcion = 'ES INVENTARIO').order_by('fechahora_ult_modif')

    detalles_salidas = InventariosDocumentoDetalle.objects.filter(
        Q( doctosIn__concepto = 38 ),
        articulo = articulo,
        almacen = almacen,
        doctosIn__descripcion = 'ES INVENTARIO').order_by('fechahora_ult_modif')

    for detalle_entradas in detalles_entradas:
        if not detalle_entradas.detalle_modificacionestime:
            detalle_entradas.detalle_modificacionestime = ''

        detalle_modificacionestime = detalle_modificacionestime + detalle_entradas.detalle_modificacionestime

    for detalle_salidas in detalles_salidas:
        if not detalle_salidas.detalle_modificacionestime:
            detalle_salidas.detalle_modificacionestime = ''

        detalle_modificacionestime_salidas = detalle_modificacionestime_salidas + detalle_salidas.detalle_modificacionestime

    #si el articulo no tiene costo de ultima compra se le manda en 0
    costo_ultima_compra = articulo.costo_ultima_compra
    if not costo_ultima_compra:
        costo_ultima_compra = 0
    
    if not detalle_modificacionestime:
        detalle_modificacionestime = ''

    try:
        articulo_linea = articulo.linea.nombre
    except ObjectDoesNotExist:
        articulo_linea = 'No indicada aun'


    return json.dumps( { 
        'existencias' : int( inv_fin ), 
        'ya_ajustado': ya_ajustado,
        'articulo_seguimiento' : articulo.seguimiento,
        'costo_ultima_compra' : str(costo_ultima_compra),
        'detalle_modificacionestime': detalle_modificacionestime,
        'detalle_modificacionestime_salidas': detalle_modificacionestime_salidas,
        'articulo_linea' : articulo_linea
        })
Пример #17
0
def cliente_manageView(request, id = None, template_name='main/clientes/clientes/cliente.html'):
    connection_name = get_conecctionname(request.session)
    if connection_name == '':
        return HttpResponseRedirect('/select_db/')

    PATH = request.path
    if '/punto_de_venta/cliente/' in PATH:
        modulo = 'punto_de_venta'
    elif '/ventas/cliente/' in PATH:
        modulo = 'ventas'

    message = ''

    if id:
        cliente = get_object_or_404(Cliente, pk=id)
        direccion = first_or_none(ClienteDireccion.objects.filter(cliente=cliente))
        if not direccion:
            direccion = ClienteDireccion()
    else:
        cliente =  Cliente()
        direccion = ClienteDireccion()

    direccion_form = DireccionClienteForm(request.POST or None, instance = direccion)
    form = ClienteManageForm(request.POST or None, instance=  cliente)
    
    if form.is_valid() and direccion_form.is_valid():
        clienteform =  form.save( commit = False )
        clienteform.usuario_ult_modif = request.user.username
        clienteform.save()
        direccion = direccion_form.save(commit=False)
        direccion.cliente = clienteform
        estado = direccion.ciudad.estado
        pais = estado.pais
        direccion.nombre_consignatario = u'Dirección principal'

        #direccion.calle = '''%s %s %s,
        #%s%s,
        #%s
        #'''%(direccion.calle_nombre, direccion.numero_exterior, direccion.numero_interior, direccion.colonia, direccion.poblacion, direccion.referencia)

        direccion.calle = '''%s %s %s,
        %s,
        %s
        '''%(direccion.calle_nombre, direccion.numero_exterior, direccion.numero_interior, direccion.colonia, direccion.referencia or '')
        
        direccion.estado = estado
        direccion.pais= pais
        direccion.es_ppal = 'S'
        direccion.save()
        return HttpResponseRedirect('/%s/clientes/'%modulo)
    
    
    # cliente_articulos = ClienteArticulo.objects.filter(cliente=id)

    # except DatabaseError:

    cliente_articulos= None

    c = {
        'cliente_articulos':cliente_articulos,
        'form':form, 
        'direccion_form':direccion_form, 
        'extend':'%s/base.html'%modulo,
        'modulo':modulo,
    }
    return render_to_response(template_name, c, context_instance=RequestContext(request))
Пример #18
0
def get_existenciasarticulo_byclave( request, **kwargs ):
    """ Para obterner existencia de un articulo segun clave del articulo """
    #Paramentros
    almacen_nombre = kwargs.get( 'almacen', None)
    almacen = Almacen.objects.get(nombre = almacen_nombre)
    entrada_id = kwargs.get( 'entrada_id', None )
    articulo_clave = kwargs.get( 'articulo_clave', None)
    connection_name = get_conecctionname( request.session )
    
    #variables de salida
    error = ""
    inv_fin = 0
    articulo_linea = ''
    articulo_id = ''
    articulo_nombre = ''
    articulo_seguimiento = ''
    costo_ultima_compra= ''
    clave_articulo = first_or_none( ArticuloClave.objects.filter( clave = articulo_clave, articulo__estatus = 'A'))
    
    if clave_articulo:
        if clave_articulo.articulo.seguimiento == 'L':
            clave_articulo = None
        
    opciones_clave = {}
    
    detalle_modificacionestime = ''
    detalle_modificacionestime_salidas = ''
    ya_ajustado = False
    if clave_articulo:
        articulo = Articulo.objects.get( pk = clave_articulo.articulo.id )

        detalles_all = InventariosDocumentoDetalle.objects.filter(
            Q( doctosIn__concepto = 27 ) | Q( doctosIn__concepto = 38 ),
            articulo = articulo,
            almacen = almacen,
            doctosIn__descripcion = 'ES INVENTARIO').order_by('fechahora_ult_modif')
        
        if detalles_all:
            ya_ajustado = True
        else:
            c = connections[ connection_name ].cursor()
            c.execute( "DELETE FROM SALDOS_IN where saldos_in.articulo_id = %s;"% articulo.id )
            c.execute( "EXECUTE PROCEDURE RECALC_SALDOS_ART_IN %s;"% articulo.id )
            transaction.commit_unless_managed()
            c.close()

            management.call_command( 'syncdb', database = connection_name )

        inv_fin = get_existencias_articulo(
            articulo_id = articulo.id,
            connection_name = connection_name, 
            fecha_inicio = datetime.now().strftime( "01/01/%Y" ),
            almacen = almacen_nombre, )
        
        articulo_id = articulo.id
        articulo_nombre = articulo.nombre
        try:
            articulo_linea = articulo.linea.nombre
        except ObjectDoesNotExist:
            articulo_linea = 'No indicada aun'

        articulo_seguimiento = articulo.seguimiento
        
        detalles_entradas = InventariosDocumentoDetalle.objects.filter(
            Q( doctosIn__concepto = 27 ),
            articulo = articulo,
            almacen = almacen,
            doctosIn__descripcion = 'ES INVENTARIO'
            ).order_by('fechahora_ult_modif')

        detalles_salidas = InventariosDocumentoDetalle.objects.filter(
            Q( doctosIn__concepto = 38 ),
            articulo = articulo,
            almacen = almacen,
            doctosIn__descripcion = 'ES INVENTARIO').order_by('fechahora_ult_modif')

        for detalle_entradas in detalles_entradas:
            if not detalle_entradas.detalle_modificacionestime:
                detalle_entradas.detalle_modificacionestime =''
                
            detalle_modificacionestime = detalle_modificacionestime + detalle_entradas.detalle_modificacionestime
            
        for detalle_salidas in detalles_salidas:
            if not detalle_salidas.detalle_modificacionestime:
                detalle_salidas.detalle_modificacionestime = ''

            detalle_modificacionestime_salidas = detalle_modificacionestime_salidas + detalle_salidas.detalle_modificacionestime
            

        #si el articulo no tiene costo de ultima compra se le manda en 0
        costo_ultima_compra = articulo.costo_ultima_compra
        if not costo_ultima_compra:
            costo_ultima_compra = 0
    else:
        error = "no_existe_clave"
        claves = ArticuloClave.objects.filter( clave__contains = articulo_clave, articulo__estatus='A',)
        for c in claves:
            if c.articulo.seguimiento == 'S' or c.articulo.seguimiento == 'N':
                opciones_clave[ str( c.clave ) ] = c.articulo.nombre
    
    if not detalle_modificacionestime:
        detalle_modificacionestime = ''

    datos = { 
        'error_msg' : error,
        'ya_ajustado': ya_ajustado,
        'articulo_id' : articulo_id,
        'articulo_seguimiento': articulo_seguimiento,
        'articulo_nombre' : articulo_nombre,
        'existencias' : str(inv_fin), 
        'costo_ultima_compra' : str(costo_ultima_compra),
        'opciones_clave': opciones_clave,
        'detalle_modificacionestime': detalle_modificacionestime,
        'detalle_modificacionestime_salidas': detalle_modificacionestime_salidas,
        'articulo_linea' : articulo_linea,
        }
    return HttpResponse( json.dumps( datos ), mimetype = "application/javascript" )
Пример #19
0
def compra_manageview(request, id=None, type='C', template_name='compras/documentos/compras/compra.html'):

    connection_name = get_conecctionname(request.session)
    message = ''
    nuevo = False
    hay_repetido = False
    
    if id:
        documento = get_object_or_404( ComprasDocumento, pk = id )
    else:
        documento = ComprasDocumento()

    #Para crear compra de una orden
    documento_fte = None
    initial_form = None
    initial_formset=[]
    initial_impuestos={}
    if type == 'O' and id:
        documento_fte =  documento
        initial_form = {
            'fecha':documento.fecha,
            'proveedor':documento.proveedor,
            'condicion_pago':documento.condicion_pago,
            'almacen': documento.almacen,
            'moneda':documento.moneda,
            'total_impuestos':documento.total_impuestos,
            'total_retenciones':documento.total_retenciones,
        }

        initial_formset=[]

        detalles = ComprasDocumentoDetalle.objects.filter(documento=documento)
        for detalle in detalles:
            initial_formset.append({
                    'articulo':detalle.articulo,
                    'umed':detalle.umed,
                    'unidades':detalle.unidades,
                    'clave_articulo':detalle.clave_articulo,
                    'precio_unitario':detalle.precio_unitario,
                    'precio_total_neto':detalle.precio_total_neto,
                    'detalles_liga':detalle.id,
                }) 

        #CARGAR DATOS DE IMPUESTOS
        c = connections[connection_name].cursor()
        c.execute('SELECT DOCTO_CM_ID, IMPUESTO_ID, COMPRA_NETA, OTROS_IMPUESTOS, PCTJE_IMPUESTO, IMPORTE_IMPUESTO FROM impuestos_doctos_cm where DOCTO_CM_ID=%s',[documento.id])
        impuestos = c.fetchall()
        compras_netas, otros_impuestos, porcentajes_impuestos, importes_impuesto, impuestos_ids = '', '', '', '', ''

        for impuesto in impuestos:
            compras_netas = "%s%s,"%(compras_netas, impuesto[2])
            otros_impuestos= "%s%s,"%(otros_impuestos, impuesto[3])
            porcentajes_impuestos = "%s%s,"%(porcentajes_impuestos, impuesto[4])
            importes_impuesto = "%s%s,"%(importes_impuesto, impuesto[5])
            impuestos_ids = "%s%s,"%(impuestos_ids, impuesto[1])
        
        initial_impuestos = {
                'compras_netas':compras_netas,
                'otros_impuestos':otros_impuestos,
                'porcentajes_impuestos':porcentajes_impuestos,
                'importes_impuesto':importes_impuesto,
                'impuestos_ids':impuestos_ids,
            }

        documento = ComprasDocumento()

    comprasdet_forms = DocumentoComprasDetalleFormset(DocumentoComprasDetalleManageForm, extra=1, can_delete=True)
    compradetalles_formset = comprasdet_forms(request.POST or None, instance=documento, initial = initial_formset)

    impuestos_form = DocumentoComprasImpuestosManageForm( request.POST or None, initial= initial_impuestos)

    documento_form = ComprasManageForm( request.POST or None, instance = documento, initial = initial_form)
    if documento_form.is_valid() and compradetalles_formset.is_valid() and impuestos_form.is_valid():
        documento = documento_form.save(commit=False)
        if not documento.id:
            documento.usuario_creador = request.user.username

        documento.usuario_ult_modif = request.user.username
        documento.tipo = 'C'
        documento.subtipo = 'N'
        documento.aplicado = 'N'
        documento.acreditar_cxp= 'N' 
        documento.contabilizado = 'N'
        documento.forma_emitida = 'N'
        
        importe_neto = 0
        for articulo_form in compradetalles_formset:
            importe_neto = importe_neto + articulo_form.cleaned_data['precio_total_neto']

        documento.importe_neto = importe_neto
        documento.save()
        documento_liga = None
        if type == 'O':
            documento_fte.estado = 'R'
            documento_fte.save()
            documento_liga = ComprasDocumentoLiga.objects.create(
                    id=None,
                    documento_fte = documento_fte,
                    documento_dest = documento,
                )

            impuestos_ids =  impuestos_form.cleaned_data['impuestos_ids'].split(',')
            compras_netas =  impuestos_form.cleaned_data['compras_netas'].split(',')
            otros_impuestos =  impuestos_form.cleaned_data['otros_impuestos'].split(',')
            porcentajes_impuestos =  impuestos_form.cleaned_data['porcentajes_impuestos'].split(',')
            importes_impuesto = impuestos_form.cleaned_data['importes_impuesto'].split(',')

            #Guardar impuestos
            for impuesto_id, compra_neta, otro_impuestos, porcentaje_impuestos, importe_impuestos in zip(impuestos_ids, compras_netas, otros_impuestos, porcentajes_impuestos, importes_impuesto):
                if impuesto_id != "":
                    c = connections[connection_name].cursor()
                    query =  '''INSERT INTO "IMPUESTOS_DOCTOS_CM" ("DOCTO_CM_ID", "IMPUESTO_ID", "COMPRA_NETA", "OTROS_IMPUESTOS", "PCTJE_IMPUESTO", "IMPORTE_IMPUESTO") \
                        VALUES (%s, %s, %s, %s, %s, %s)'''
                    c.execute(query,[documento.id,  int(impuesto_id), Decimal(compra_neta),  Decimal(otro_impuestos), Decimal(porcentaje_impuestos), Decimal(importe_impuestos)])
                    c.close()

            plazos = CuentasXPagarCondicionPagoPlazoBase.objects.filter(condicion_de_pago=documento.condicion_pago)
            for plazo in plazos:
                fecha_vencimiento = documento.fecha + timedelta(days=plazo.dias)
                c = connections[connection_name].cursor()
                query =  '''INSERT INTO "VENCIMIENTOS_CARGOS_CM" ("DOCTO_CM_ID", "FECHA_VENCIMIENTO", "PCTJE_VEN") \
                    VALUES (%s, %s, %s)'''
                c.execute(query,[documento.id,  fecha_vencimiento, plazo.porcentaje_de_venta])
                c.close()


        #GUARDA ARTICULOS
        for articulo_form in compradetalles_formset:
            detalle = articulo_form.save(commit = False)
            #PARA CREAR UNO NUEVO

            if not detalle.id or (type == 'O' and initial_form['id'] == None):
                detalle.documento = documento

        compradetalles_formset.save()

        #CREAR LOS LIGAS DE LOS DETALLES
        for articulo_form in compradetalles_formset:
            detalle = articulo_form.save(commit = False)
            detalle_ligas = articulo_form.cleaned_data['detalles_liga'].split(',')
    
            for detalle_liga in detalle_ligas:
                if detalle_liga != [u'']:
                    detalle_doc = ComprasDocumentoDetalle.objects.get(pk=detalle_liga)
                    con = connections[connection_name].cursor()
                    query =  '''INSERT INTO DOCTOS_CM_LIGAS_DET (DOCTO_CM_LIGA_ID, DOCTO_CM_DET_FTE_ID, DOCTO_CM_DET_DEST_ID) \
                        VALUES (%s, %s, %s)'''
                    con.execute(query,[documento_liga.id, detalle_doc.id , detalle.id])
                    con.close()

        compradetalles_formset.save()
        
        return HttpResponseRedirect('/compras/compras/')

    documentos_relacionados = ComprasDocumentoLiga.objects.filter(documento_dest= documento)
    # vencimientos = ComprasDocumentoCargoVencimiento.objects.filter(documento=documento)
    
    c = {
        'documento_form':documento_form, 
        'formset':compradetalles_formset, 
        'documentos_relacionados':documentos_relacionados,
        'impuestos_form':impuestos_form,
        'message':message,
    }

    return render_to_response(template_name, c, context_instance=RequestContext(request))
Пример #20
0
def factura_manageView( request, id = None, template_name='punto_de_venta/documentos/facturas/factura.html' ):
    message = ''
    connection_name = get_conecctionname(request.session)
    factura_nueva = False
    
    if id:
        factura = get_object_or_404( PuntoVentaDocumento, pk = id )
    else:
        factura = PuntoVentaDocumento()

    #Cargar formularios

    if id:
        factura_form = FacturaManageForm( request.POST or None, instance = factura,)
        factura_items = DocumentoPV_items_formset(DocumentoPVDet_ManageForm, extra=0, can_delete=False)
    else:
        initial_factura = { 'fecha': datetime.now(),}
        factura_form = FacturaManageForm( request.POST or None, instance = factura, initial= initial_factura)
        factura_items = DocumentoPV_items_formset(DocumentoPVDet_ManageForm, extra=1, can_delete=False)
        
    formset = factura_items(request.POST or None, instance=factura)

    factura_global_fm =  factura_global_form(request.POST or None)
   
    if formset.is_valid() and factura_form.is_valid() and factura_global_fm.is_valid():

        factura = factura_form.save(commit=False)

        cliente = factura.cliente
        cliente_clave = first_or_none( ClienteClave.objects.filter( cliente= cliente ) )
        cliente_direccion =  first_or_none( ClienteDireccion.objects.filter( cliente= cliente ) )
        factura_global_tipo = factura_global_fm.cleaned_data['tipo']
        #Si es una factura nueva
        if not factura.id:
            factura_nueva= True
            factura.id= -1
            factura.caja= first_or_none( Caja.objects.all() )
            factura.tipo= 'F'
            factura.aplicado = 'S'
            factura.folio= ''#Se deja vacio para que se calcule el folio al guardar
            factura.fecha= datetime.now()
            factura.hora= datetime.now().strftime('%H:%M:%S')
            factura.clave_cliente= cliente_clave
            factura.cliente= cliente
            factura.clave_cliente_fac= cliente_clave
            factura.cliente_fac= cliente
            factura.direccion_cliente= cliente_direccion
            factura.moneda= Moneda.objects.get(pk= 1)
            factura.impuesto_incluido= 'N'
            factura.tipo_cambio= 1
            factura.unidad_comprom= 'S'
            factura.tipo_descuento= 'I'

            #datos de factura global
            # factura.tipo_gen_fac='R'
            # factura.es_fac_global='S'
            # factura.fecha_ini_fac_global = fecha_ini_fac_global
            # factura.fecha_fin_fac_global = fecha_fin_fac_global

            factura.porcentaje_descuento=0
            
            factura.sistema_origen='PV'
            factura.persona='FACTURA GLOBAL DIARIA'
            factura.usuario_creador= request.user.username
            factura.save()
            

        ventas_en_factura = factura_form.cleaned_data['ventas_en_factura']
        impuestos_venta_neta = factura_form.cleaned_data['impuestos_venta_neta'].split(',')
        impuestos_otros_impuestos = factura_form.cleaned_data['impuestos_otros_impuestos'].split(',')
        impuestos_importe_impuesto = factura_form.cleaned_data['impuestos_importe_impuesto'].split(',')
        impuestos_porcentaje_impuestos = factura_form.cleaned_data['impuestos_porcentaje_impuestos'].split(',')
        impuestos_ids = factura_form.cleaned_data['impuestos_ids'].split(',')

        #Guardar impuestos
        for impuesto_id, venta_neta, otros_impuestos, importe_impuesto, porcentaje_impuesto in zip(impuestos_ids, impuestos_venta_neta, impuestos_otros_impuestos, impuestos_importe_impuesto, impuestos_porcentaje_impuestos ):
            if impuesto_id != "":
                c = connections[connection_name].cursor()
                query =  '''INSERT INTO "IMPUESTOS_DOCTOS_PV" ("DOCTO_PV_ID", "IMPUESTO_ID", "VENTA_NETA", "OTROS_IMPUESTOS", "PCTJE_IMPUESTO", "IMPORTE_IMPUESTO") \
                    VALUES (%s, %s, %s, %s, %s, %s)'''%(factura.id,  impuesto_id, venta_neta,  otros_impuestos, porcentaje_impuesto, importe_impuesto)
                c.execute(query)
                c.close()

        ventas_en_factura_sting = ventas_en_factura
        ventas_faturadas = ventas_en_factura.split(',')

        if ventas_faturadas!= [u'']:
            for venta_facturada in ventas_faturadas:
                venta = PuntoVentaDocumento.objects.get(pk=venta_facturada)
                PuntoVentaDocumentoLiga.objects.create(
                        id = -1,
                        docto_pv_fuente = venta,
                        docto_pv_destino = factura,
                    )
        ventas_ligas = PuntoVentaDocumentoLiga.objects.filter(docto_pv_destino= factura)
        #Se guardan detalles de factura
        for detalle_form in formset:
            detalle = detalle_form.save(commit = False)

            if not detalle.id:
                detalle.id = -1
                detalle.documento_pv = factura
                detalle.unidades_dev = 0
                detalle.precio_unitario_impto = detalle.precio_unitario
                detalle.fpgc_unitario = 0
                detalle.precio_modificado = 'N' 
                detalle.porcentaje_comis = 0 
                detalle.rol = 'N' 
                detalle.notas = 'FOLIOS:'
                detalle.posicion = -1
                detalle.save()

            #Se generan todos los detalles de ligas        
            if factura_global_tipo == 'C' and factura_nueva:
                detalle_ligas = detalle_form.cleaned_data['detalles_liga'].split(',')
                if detalle_ligas!= [u'']:
                    for detalle_liga in detalle_ligas:
                        detalle_doc = PuntoVentaDocumentoDetalle.objects.get(pk=detalle_liga)
                        documento_liga = PuntoVentaDocumentoLiga.objects.get(docto_pv_fuente= detalle_doc.documento_pv)
                        c = connections[connection_name].cursor()
                        query =  '''INSERT INTO "DOCTOS_PV_LIGAS_DET" ("DOCTO_PV_LIGA_ID", "DOCTO_PV_DET_FTE_ID", "DOCTO_PV_DET_DEST_ID") \
                            VALUES (%s, %s, %s)'''%(documento_liga.id, detalle_doc.id , detalle.id)
                        c.execute(query)
                        c.close()

            #Si es una factura global nueva y si es por partida
            if factura_global_tipo == 'P' and factura_nueva:

                #Se generan todos los detalles de ligas
                for docto_pv_liga in ventas_ligas:
                    for detalle_venta in PuntoVentaDocumentoDetalle.objects.filter(documento_pv=docto_pv_liga.docto_pv_fuente):
                        c = connections[connection_name].cursor()
                        query =  '''INSERT INTO "DOCTOS_PV_LIGAS_DET" ("DOCTO_PV_LIGA_ID", "DOCTO_PV_DET_FTE_ID", "DOCTO_PV_DET_DEST_ID") \
                            VALUES (%s, %s, %s)'''%(docto_pv_liga.id, detalle_venta.id, detalle.id)
                        c.execute(query)
                        c.close()
        
        #Para aplicar la factura  
        c = connections[connection_name].cursor()
        query = "EXECUTE PROCEDURE APLICA_FAC_PV(%s,'N');"%factura.id
        c.execute(query)
        c.close()

        transaction.commit_unless_managed()
        management.call_command( 'syncdb', database = connection_name )
        
        message= 'Factura guardada'

    ventas_factura = PuntoVentaDocumentoLiga.objects.filter(docto_pv_destino= factura)

    c = {
        'factura_global_fm':factura_global_fm, 
        'factura_form': factura_form, 
        'formset':formset, 
        'message':message,
        'ventas_factura':ventas_factura, 
        'message':message, 
    }

    return render_to_response(template_name, c, context_instance=RequestContext(request))
Пример #21
0
def add_existenciasarticulo_byajustes( **kwargs ):
    """ Para agregar existencia a un articulo por ajuste 
        En caso de que el articulo no tenga costo indicado [se le aplica el de la ultima compra]
    """

    #Paramentros
    ajustar_primerconteo = kwargs.get( 'ajustar_primerconteo', None )
    ubicacion = kwargs.get( 'ubicacion', None )
    articulo_id = kwargs.get( 'articulo_id', None )
    articulo = Articulo.objects.get( pk = articulo_id )

    entrada_id = kwargs.get( 'entrada_id', None )
    entrada = InventariosDocumento.objects.get( pk = entrada_id )
    salida_id = kwargs.get( 'salida_id', None )
    salida = InventariosDocumento.objects.get( pk = salida_id )
    
    almacen_id = kwargs.get( 'almacen_id', None )
    almacen = Almacen.objects.get( pk = almacen_id)

    request_session = kwargs.get( 'request_session', 0 )
    request_user = kwargs.get( 'request_user', 0 )
    connection_name = get_conecctionname( request_session )
    
    detalle_unidades = kwargs.get( 'detalle_unidades', 0 )
    detalle_costo_unitario = kwargs.get( 'detalle_costo_unitario', articulo.costo_ultima_compra )

    puede_modificar_costos = allow_microsipuser( username = request_user.username, clave_objeto = 469) and almacen.inventario_modifcostos

    detalles_entradas_ultimocosto = first_or_none( InventariosDocumentoDetalle.objects.filter(
            Q( doctosIn__concepto = 27 ),
            articulo = articulo,
            almacen = almacen,
            doctosIn__descripcion = 'ES INVENTARIO'
            ).order_by('-fechahora_ult_modif').values_list( 'costo_unitario', flat = True ) )

    if not detalles_entradas_ultimocosto:
         detalles_entradas_ultimocosto = articulo.costo_ultima_compra

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

    detalle_entradas = first_or_none( InventariosDocumentoDetalle.objects.filter( articulo = articulo, doctosIn = entrada ) )
    detalle_salidas = first_or_none( InventariosDocumentoDetalle.objects.filter( articulo = articulo, doctosIn = salida ) )
    articulo_clave = first_or_none( ArticuloClave.objects.filter( articulo = articulo ) )

    detalle = InventariosDocumentoDetalle(
        articulo = articulo,
        claveArticulo = articulo_clave,
        almacen = almacen,
        unidades = detalle_unidades,
        )
    
    #Logica
    existencia_inicial = ''
    #Si no se existe arituclo en documentos se ajustan unidades
    if not existe_en_detalles:
        existencia_inicial = get_existencias_articulo(
                articulo_id = articulo.id, 
                connection_name = connection_name, 
                fecha_inicio = datetime.now().strftime( "01/01/%Y" ),
                almacen = almacen, 
            )  
        detalle.detalle_modificacionestime ='EXISTIN=%s / COSTOIN=%s,'%(existencia_inicial, articulo.costo_ultima_compra)
        
        if ajustar_primerconteo:
            detalle.unidades = ajustar_existencias( articulo_id = articulo.id, ajustar_a = detalle.unidades ,almacen = almacen , connection_name = connection_name )
        
    es_nuevo = False

    #SALIDA
    if detalle.unidades <= 0:
        #si no existe detalle salidas
        if not detalle_salidas:
            es_nuevo = True
            detalle_salidas = detalle
            detalle_salidas.id = next_id( 'ID_DOCTOS', connection_name )
            detalle_salidas.doctosIn = salida
            detalle_salidas.concepto = salida.concepto
            detalle_salidas.tipo_movto ='S'
            detalle_salidas.unidades = -detalle_salidas.unidades
        #Si exitse detalle salidas
        elif detalle_salidas:
            detalle_salidas.unidades = detalle_salidas.unidades + ( -detalle.unidades ) 

        #Desde salida no se permite cambiar costo unitario
        detalle_salidas.costo_unitario = detalles_entradas_ultimocosto
        detalle = detalle_salidas
    
    #ENTRADA
    elif detalle.unidades > 0:
        if not detalle_entradas:
            es_nuevo = True
            detalle_entradas = detalle
            detalle_entradas.id = next_id( 'ID_DOCTOS', connection_name )
            detalle_entradas.doctosIn = entrada
            detalle_entradas.concepto = entrada.concepto
            detalle_entradas.tipo_movto ='E'

        elif detalle_entradas:
            detalle_entradas.unidades = detalle_entradas.unidades + detalle.unidades
            
        detalle = detalle_entradas
    
    costo_modificaciones = ''
    #MODIFICA COSTOS
    if puede_modificar_costos:
        if detalle.tipo_movto == 'E':
            detalle.costo_unitario = detalle_costo_unitario 
            #Afecta costo en articulo
            if articulo.costo_ultima_compra !=  detalle.costo_unitario:
                articulo.costo_ultima_compra = detalle.costo_unitario
                articulo.save(update_fields=['costo_ultima_compra',])
                costo_modificaciones = 'COSTO(%s)'%detalle.costo_unitario

        #si se ajusto el conteo pero en realidad se metieron unidades positivas cambia costo de compra
        if detalle.tipo_movto == 'S' and detalle_unidades >= 0:
            detalle.costo_unitario = detalle_costo_unitario 
            #Afecta costo en articulo
            if articulo.costo_ultima_compra !=  detalle.costo_unitario:
                articulo.costo_ultima_compra = detalle.costo_unitario
                articulo.save(update_fields=['costo_ultima_compra',])
                costo_modificaciones = 'COSTO(%s)'%detalle.costo_unitario
    else:
        #si el articulo no tiene costo de ultima compra se le manda en 0
        detalle.costo_unitario = articulo.costo_ultima_compra
        if not detalle.costo_unitario:
            detalle.costo_unitario = 0
    
    detalle.costo_total = detalle.unidades * detalle.costo_unitario
    detalle.fechahora_ult_modif = datetime.now()

    # HISTORIAL DE MODIFICACIONES
    if detalle.detalle_modificacionestime == None:
        detalle.detalle_modificacionestime = ''
    detalle_ajuste = '' 
    if not existe_en_detalles:   
        if ajustar_primerconteo:
            if detalle.tipo_movto == 'S':
                detalle_ajuste = '(AJ=-%s)'% detalle.unidades
            elif detalle.tipo_movto == 'E': 
                detalle_ajuste = '(AJ=%s)'% detalle.unidades

    detalle.detalle_modificacionestime += '%s %s/%s=%s%s%s,'%( datetime.now().strftime("%d-%b-%Y %I:%M %p"), request_user.username, ubicacion, detalle_unidades, detalle_ajuste, costo_modificaciones)

    if es_nuevo:
        detalle.save()
    else:    
        detalle.save( update_fields = [ 'unidades', 'costo_unitario', 'costo_total', 'fechahora_ult_modif','detalle_modificacionestime', ] );

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

    management.call_command( 'syncdb', database = connection_name )

    exitencia = get_existencias_articulo(
        articulo_id = articulo.id, 
        connection_name = connection_name, 
        fecha_inicio = datetime.now().strftime( "01/01/%Y" ),
        almacen = almacen, 
        )

    datos = {'error_message': '', 'alamcen_id': almacen.ALMACEN_ID, 'articulo_nombre': articulo.nombre, 'existencia_actual': str(exitencia) }
    
    return datos
Пример #22
0
def add_seriesinventario_byarticulo( request, **kwargs ):
    # Parametros
    connection_name = get_conecctionname(request.session)
    error = False
    articulo_id = request.GET.get('articulo_id', None)
    articulo = Articulo.objects.get(pk=articulo_id)
    articulo_clave = first_or_none(
        ArticuloClave.objects.filter(articulo=articulo))

    almacen_id = request.GET.get('almacen_id', None)
    almacen = Almacen.objects.get(ALMACEN_ID=almacen_id)

    entrada_id = request.GET.get('entrada_id', None)
    entrada = InventariosDocumento.objects.get(pk=entrada_id)

    salida_id = request.GET.get('salida_id', None)
    salida = InventariosDocumento.objects.get(pk=salida_id)

    ubicacion = request.GET.get('ubicacion', None)
    unidades = request.GET.get('unidades', None)
    unidades = int(unidades)
    ajusteprimerconteo = almacen.inventario_conajustes

    series = request.GET.get('series', None)
    series = series.split(',')
    msg = ''
    existe_en_detalles = InventariosDocumentoDetalle.objects.filter(
        Q(doctosIn__concepto=27) | Q(doctosIn__concepto=38), articulo=articulo,
        almacen=almacen,
        doctosIn__descripcion='ES INVENTARIO',
        ).count() > 0

    #Checar numeros de serie
    for serie in series:
        if ArticuloDiscretoExistencia.objects.filter(articulo_discreto__articulo=articulo, existencia__gt=0, almacen=almacen, articulo_discreto__clave=serie).exists() and serie != '' and unidades > 0 :
            #Si es la primera ves que se cuenta 
            if not ajusteprimerconteo or (ajusteprimerconteo and existe_en_detalles):
                msg = '%s El numero de serie %s ya esta registrado.' % (msg, serie)

        elif not ArticuloDiscretoExistencia.objects.filter(articulo_discreto__articulo=articulo, existencia__gt=0, almacen=almacen, articulo_discreto__clave=serie).exists() and serie != '' and unidades < 0:
            msg = '%s El numero de serie %s no esta registrado.' % (msg, serie)
        if serie == '':
            series.remove(serie)
    
    if ajusteprimerconteo and not existe_en_detalles and unidades < 0:
        msg= 'No esta permitido ajustar en primer conteo a valores negativos'

    if msg == '':
        request_username = request.user.username
        #AJUSTAR SERIES
        if ajusteprimerconteo and not existe_en_detalles:
            existdiscretos_aeliminar = ArticuloDiscretoExistencia.objects.filter(articulo_discreto__articulo=articulo, existencia__gt=0, almacen=almacen).exclude(articulo_discreto__clave__in=series)
            existdiscretos_aeliminar_count =existdiscretos_aeliminar.count()
            series_aeliminar = []
            for existdiscreto in existdiscretos_aeliminar:
                series_aeliminar.append(existdiscreto.articulo_discreto.clave)

            if existdiscretos_aeliminar_count > 0:
                msg = ajustar_seriesinventario_byarticulo(
                        connection_name = connection_name,
                        unidades = -existdiscretos_aeliminar_count,
                        articulo = articulo,
                        articulo_clave = articulo_clave,
                        entrada = entrada,
                        almacen = almacen,
                        salida = salida,
                        request_username = request_username,
                        series =  series_aeliminar,
                        ubicacion = ubicacion,
                    )
            
            msg = ajustar_seriesinventario_byarticulo(
                     connection_name = connection_name,
                     unidades = unidades,
                     articulo = articulo,
                     articulo_clave = articulo_clave,
                     entrada = entrada,
                     almacen = almacen,
                     salida = salida,
                     request_username = request_username,
                     series = series,
                     ubicacion = ubicacion,
                 )
        else:
           msg = ajustar_seriesinventario_byarticulo(
                    connection_name = connection_name,
                    unidades = unidades,
                    articulo = articulo,
                    articulo_clave = articulo_clave,
                    entrada = entrada,
                    almacen = almacen,
                    salida = salida,
                    request_username = request_username,
                    series = series,
                    ubicacion = ubicacion,
                )

        c = connections[ connection_name ].cursor()
        c.execute( "DELETE FROM SALDOS_IN where saldos_in.articulo_id = %s;"% articulo.id )
        c.execute( "EXECUTE PROCEDURE RECALC_SALDOS_ART_IN %s;"% articulo.id )
        transaction.commit_unless_managed()
        c.close()
        management.call_command( 'syncdb', database = connection_name )

        if msg == '':
            msg = 'Movimiento registrado correctamente'
        
        exitencia = get_existencias_articulo(
            articulo_id = articulo.id, 
            connection_name = connection_name, 
            fecha_inicio = datetime.now().strftime( "01/01/%Y" ),
            almacen = almacen, 
            )
    else:
        error = True
        exitencia =''

    data = { 
        'msg' : msg, 
        'error': error,
        'articulo_nombre': articulo.nombre, 
        'existencia_actual':  str(exitencia),
    }
    
    return HttpResponse(json.dumps(data), mimetype="application/json")