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))
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))
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 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))
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))
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, )
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" )
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 ) )
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 ) )
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, } )
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 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))
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))
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))
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))
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 })
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))
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" )
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))
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))
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
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")