import os from django.conf import settings from django.template import Context from django.template.loader import get_template from xhtml2pdf import pisa from django.contrib.staticfiles import finders from django.shortcuts import render, redirect, get_object_or_404 from django.contrib import messages from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User from django.http.response import HttpResponse from django.views import View from django.views.generic import ListView from datetime import datetime from .models import ordenservicio, serviciorealizado, accesorios, tiposervicio, falla, refacciones, preventivo from .forms import Formpreventivo, FormpreventivoEnv, Formordenservicio, FormordenservicioEnv, Formserviciorealizado, FormserviciorealizadoEnv, Formaccesorios, FormaccesoriosEnv, FormordenservicioEnvbit, FormordenservicioEnvbit1, FormordenservicioEnvbit2, FormordenservicioEnvbit3, FormordenservicioEnvbit4, FormordenservicioEnvbit5, FormordenservicioEnvbit6, Formrefacciones from servicios.models import serviciorealizado, accesorios from inventario.models import invequipo from pendientes.models import bitpendientes from bitacora.models import bitreporte from inventarioalmacen.models import pieza from openpyxl import Workbook import datetime from datetime import date # Create your views here. def servicios(request): datos = ordenservicio.objects.all() equipo = invequipo.objects.all() servicios = serviciorealizado.objects.all() usuarios = User.objects.all() accesorio = accesorios.objects.all() return render(request, 'servicios.html', {"datos": datos, "servicios": servicios, "equipo": equipo, "usuarios": usuarios, "accesorio": accesorio}) @login_required(login_url='/acceder') def crear_ordservicio(request): if request.method == "POST": form = Formordenservicio(request.POST) if form.is_valid(): post = form.save(commit=False) post.save() folio = form.cleaned_data.get("folio") n_control = form.cleaned_data.get("orden_n_control") messages.success(request, f"La servicio con el {folio} se ha creado o actualizado correctamente") form = FormserviciorealizadoEnv() return render(request, "crear_servrealizado.html", {"form": form, "folio": folio, "n_control": n_control}) else: for field, items in form.errors.items(): for item in items: messages.error(request, '{}: {}'.format(field, item)) scan = ordenservicio.objects.latest('id') date = datetime.datetime.now() folio = scan.folio + 1 hora = date.strftime("%H:%M:%S") form = FormordenservicioEnv() return render(request, "crear_servicio.html", {"form": form, "folio": folio, "hora": hora}) @login_required(login_url='/acceder') def crear_ordserviciobit(request, cb): if request.method == "POST": form = Formordenservicio(request.POST) if form.is_valid(): post = form.save(commit=False) post.save() folio = form.cleaned_data.get("folio") nreporte = form.cleaned_data.get("n_reporte") update = bitreporte.objects.values('pendiente').filter(control_bit=nreporte).update(pendiente='Realizado') update1 = bitpendientes.objects.values('concluido').filter(n_reporte=nreporte).update(concluido='Realizado') messages.success(request, f"La servicio con el {folio} se ha creado o actualizado correctamente") return redirect("servicios") else: for field, items in form.errors.items(): for item in items: messages.error(request, '{}: {}'.format(field, item)) scan = ordenservicio.objects.latest('id') date = datetime.datetime.now() folio = scan.folio + 1 hora = date.strftime("%H:%M:%S") controlb = cb dato = bitreporte.objects.filter(control_bit=controlb) falla = dato[0].reporte reporta_ib = dato[0].asignado.id quien_reporta = dato[0].quien_reporta reporta_ib_1 = dato[0].asignado if bitpendientes.objects.filter(n_reporte=cb).exists(): datos = bitpendientes.objects.get(n_reporte=cb) form1 = FormordenservicioEnvbit1() form2 = FormordenservicioEnvbit2() form3 = FormordenservicioEnvbit3() form4 = FormordenservicioEnvbit4() form5 = FormordenservicioEnvbit5() form6 = FormordenservicioEnvbit6() datosseg = serviciorealizado.objects.filter(control_bit=cb) datosacc = accesorios.objects.filter(control_bit=cb) return render(request, "crear_serviciobit.html", {"form1": form1, "form2": form2, "form3": form3, "form4": form4, "form5": form5, "form6": form6, "folio": folio, "hora": hora, "controlb": controlb, "datos": datos, "falla": falla, "reporta_ib": reporta_ib, "reporta_ib_1": reporta_ib_1, "quien_reporta": quien_reporta, "datosseg": datosseg, "datosacc": datosacc}) else: form1 = FormordenservicioEnvbit1() form2 = FormordenservicioEnvbit2() form3 = FormordenservicioEnvbit3() form4 = FormordenservicioEnvbit4() form5 = FormordenservicioEnvbit5() form6 = FormordenservicioEnvbit6() datosseg = serviciorealizado.objects.filter(control_bit=cb) datosacc = accesorios.objects.filter(control_bit=cb) return render(request, "crear_serviciobit.html", {"form1": form1, "form2": form2, "form3": form3, "form4": form4, "form5": form5, "form6": form6, "folio": folio, "hora": hora, "controlb": controlb, "falla": falla, "reporta_ib": reporta_ib, "reporta_ib_1": reporta_ib_1, "quien_reporta": quien_reporta, "datosseg": datosseg, "datosacc": datosacc}) pass @login_required(login_url='/acceder') def ActualizarOrden(request, id): instance= get_object_or_404(ordenservicio, pk=id) form = Formordenservicio(request.POST or None, instance=instance) context= {'form': form} if form.is_valid(): obj= form.save(commit= False) obj.save() messages.success(request, "La Orden fue actualizada") return redirect("servicios") else: context= {'form': form, 'error': 'Error al actualizar'} return render(request,'actualizar_orden.html' , context) ################################ servicios realizados ################################### @login_required(login_url='/acceder') def crear_servrealizado(request): if request.method == "POST": form = Formserviciorealizado(request.POST) if form.is_valid(): post = form.save(commit=False) post.save() folio = form.cleaned_data.get("folio") control_bit = form.cleaned_data.get("control_bit") n_control = form.cleaned_data.get("ser_s_n_control") messages.success(request, f"El servicio con el reporte: {control_bit} se ha creado o actualizado correctamente") form = FormaccesoriosEnv() return render(request, "crear_servaccesorios.html", {"form": form, "folio": folio, "control": control_bit, "n_control": n_control}) else: for field, items in form.errors.items(): for item in items: messages.error(request, '{}: {}'.format(field, item)) form = FormserviciorealizadoEnv() datos = serviciorealizado.objects.all() return render(request, "crear_servrealizado.html", {"form": form, "datos": datos}) @login_required(login_url='/acceder') def crear_servrealizadopen(request, cb): if request.method == "POST": form = Formserviciorealizado(request.POST) if form.is_valid(): post = form.save(commit=False) post.save() folio = form.cleaned_data.get("control_bit") messages.success(request, f"El servicio con el reporte: {folio} se ha creado o actualizado correctamente") return redirect("index") else: for field, items in form.errors.items(): for item in items: messages.error(request, '{}: {}'.format(field, item)) form = FormserviciorealizadoEnv() controlcb = cb datos = bitpendientes.objects.get(n_reporte=cb) datosseg = serviciorealizado.objects.filter(control_bit=cb) return render(request, "penseguimiento.html", {"form": form, "controlcb": controlcb, "datos": datos, "datosseg": datosseg}) @login_required(login_url='/acceder') def crear_servrealizadobit(request, cb): if request.method == "POST": form = Formserviciorealizado(request.POST) if form.is_valid(): post = form.save(commit=False) post.save() reporte1 = form.cleaned_data.get("control_bit") messages.success(request, f"El seguimiento con el reporte: {reporte1} se ha creado o actualizado correctamente") return redirect("bitacora") else: for field, items in form.errors.items(): for item in items: messages.error(request, '{}: {}'.format(field, item)) form = FormserviciorealizadoEnv() controlcb = cb datos = bitreporte.objects.get(control_bit=cb) datosseg = serviciorealizado.objects.filter(control_bit=cb) return render(request, "bitseguimiento.html", {"form": form, "controlcb": controlcb, "datos": datos, "datosseg": datosseg}) @login_required(login_url='/acceder') def crear_servrealizadocon(request, cb): if request.method == "POST": form = Formserviciorealizado(request.POST) if form.is_valid(): post = form.save(commit=False) post.save() reporte1 = form.cleaned_data.get("control_bit") messages.success(request, f"El seguimiento con el reporte: {reporte1} se ha creado o actualizado correctamente") return redirect("bitacora") else: for field, items in form.errors.items(): for item in items: messages.error(request, '{}: {}'.format(field, item)) form = FormserviciorealizadoEnv() controlcb = cb datos = ordenservicio.objects.get(n_reporte=cb) return render(request, "conseguimiento.html", {"form": form, "controlcb": controlcb, "datos": datos}) @login_required(login_url='/acceder') def servrealizado(request, cb): datos = serviciorealizado.objects.filter(control_bit=cb) return render(request, "crear_servrealizado.html", {"datos": datos}) @login_required(login_url='/acceder') def verservrealizado(request, cb): datos = serviciorealizado.objects.filter(control_bit=cb) return render(request, "ver_seguimiento.html", {"datos": datos}) ################################ accesorios ################################################### @login_required(login_url='/acceder') def crear_accesorios(request): if request.method == "POST": form = Formaccesorios(request.POST) if form.is_valid(): post = form.save(commit=False) post.save() control_bit = form.cleaned_data.get("control_bit") messages.success(request, f"El accesorio con el reporte: {control_bit} se ha creado o actualizado correctamente") return redirect("servicios") else: for field, items in form.errors.items(): for item in items: messages.error(request, '{}: {}'.format(field, item)) form = FormaccesoriosEnv() datos = accesorios.objects.all() return render(request, "crear_servaccesorios.html", {"form": form, "datos": datos}) @login_required(login_url='/acceder') def crear_accesoriospen(request, cb): if request.method == "POST": form = Formaccesorios(request.POST) if form.is_valid(): post = form.save(commit=False) post.save() control_bit = form.cleaned_data.get("control_bit") messages.success(request, f"El accesorio con el Reporte: {control_bit} se ha creado o actualizado correctamente") return redirect("pendientes") else: for field, items in form.errors.items(): for item in items: messages.error(request, '{}: {}'.format(field, item)) form = FormaccesoriosEnv() controlcb = cb dat = bitpendientes.objects.get(n_reporte=cb) return render(request, "crear_servaccesoriospen.html", {"form": form, "controlcb": controlcb, "dat": dat}) @login_required(login_url='/acceder') def crear_accesoriosbit(request, cb): if request.method == "POST": form = Formaccesorios(request.POST) if form.is_valid(): post = form.save(commit=False) post.save() control_bit = form.cleaned_data.get("control_bit") messages.success(request, f"El accesorio con el Reporte: {control_bit} se ha creado o actualizado correctamente") return redirect("pendientes") else: for field, items in form.errors.items(): for item in items: messages.error(request, '{}: {}'.format(field, item)) form = FormaccesoriosEnv() controlcb = cb dat = bitreporte.objects.get(control_bit=cb) return render(request, "crear_servaccesoriospen.html", {"form": form, "controlcb": controlcb, "dat": dat}) @login_required(login_url='/acceder') def servaccesorios(request, cb): datos = accesorios.objects.filter(control_bit=cb) return render(request, "crear_servaccesorios.html", {"datos": datos}) ########################## refacciones ########################### @login_required(login_url='/acceder') def crear_refaccionesbit(request, cr, cb): if request.method == "POST": form = Formrefacciones(request.POST) if form.is_valid(): post = form.save(commit=False) post.usuario = request.user post.save() control_bit = form.cleaned_data.get("n_reporte") refex = form.cleaned_data.get("referencia") y = form.cleaned_data.get("cantidad") x = pieza.objects.only('referencia').filter(referencia=refex)[0] nuevo = x.cantidad - y update = pieza.objects.values('cantidad').filter(referencia=refex).update(cantidad=nuevo) messages.success(request, f"Se agrego la refaccion al Reporte: {control_bit} correctamente") return redirect("bitacora") else: for field, items in form.errors.items(): for item in items: messages.error(request, '{}: {}'.format(field, item)) controlcb = cb controlcr = cr return render(request, "crear_refaccionesbit.html", {"controlcb": controlcb, "controlcr": controlcr}) @login_required(login_url='/acceder') def crear_refaccionespen(request, cr, cb): if request.method == "POST": form = Formrefacciones(request.POST) if form.is_valid(): post = form.save(commit=False) post.save() control_bit = form.cleaned_data.get("n_reporte") refex = form.cleaned_data.get("referencia") y = form.cleaned_data.get("cantidad") x = pieza.objects.only('referencia').filter(referencia=refex)[0] nuevo = x.cantidad - y update = pieza.objects.values('cantidad').filter(referencia=refex).update(cantidad=nuevo) messages.success(request, f"Se agrego la refaccion al Reporte: {control_bit} correctamente") return redirect("pendientes") else: for field, items in form.errors.items(): for item in items: messages.error(request, '{}: {}'.format(field, item)) controlcb = cb controlcr = cr return render(request, "crear_refaccionespen.html", {"controlcb": controlcb, "controlcr": controlcr}) @login_required(login_url='/acceder') def refaccionespre(request, cb): controlcb = cb datos = pieza.objects.all() return render(request, "crear_refaccionespre.html", {"datos": datos, "controlcb": controlcb}) @login_required(login_url='/acceder') def refacciones1(request, cb): controlcb = cb datos = refacciones.objects.filter(n_reporte=controlcb) return render(request, "refacciones.html", {"datos": datos}) ########################## PDF ################################### class pdf(View): def link_callback(self, uri, rel): result = finders.find(uri) if result: if not isinstance(result, (list, tuple)): result = [result] result = list(os.path.realpath(path) for path in result) path=result[0] else: sUrl = settings.STATIC_URL # Typically /static/ sRoot = settings.STATIC_ROOT # Typically /home/userX/project_static/ mUrl = settings.MEDIA_URL # Typically /media/ mRoot = settings.MEDIA_ROOT # Typically /home/userX/project_static/media/ if uri.startswith(mUrl): path = os.path.join(mRoot, uri.replace(mUrl, "")) elif uri.startswith(sUrl): path = os.path.join(sRoot, uri.replace(sUrl, "")) else: return uri # make sure that file exists if not os.path.isfile(path): raise Exception( 'media URI must start with %s or %s' % (sUrl, mUrl) ) return path def get(self, request, *args, **kwargs): try: dato = ordenservicio.objects.get(pk=self.kwargs['pk']) equipo = invequipo.objects.get(n_control=dato.orden_n_control) aces = accesorios.objects.filter(control_bit=dato.n_reporte) serv = serviciorealizado.objects.filter(control_bit=dato.n_reporte) t_serv = tiposervicio.objects.get(pk=dato.tipo_servicio_id) t_falla = falla.objects.get(pk=dato.origen_falla_id) firma1 = User.objects.get(pk=dato.ib1_id) if dato.id_ib2_id is None : template = get_template('pdf.html') context = {'dato': dato, 'equipo': equipo, 'aces': aces, 'serv': serv , 't_serv': t_serv , 't_falla': t_falla, 'firma1': firma1 } html = template.render(context) response = HttpResponse(content_type='application/pdf') pisa_status = pisa.CreatePDF( html, dest=response, link_callback=self.link_callback ) return response firma2 = User.objects.get(pk=dato.id_ib2_id) template = get_template('pdf.html') context = {'dato': dato, 'equipo': equipo, 'aces': aces, 'serv': serv , 't_serv': t_serv , 't_falla': t_falla, 'firma1': firma1, 'firma2': firma2 } html = template.render(context) response = HttpResponse(content_type='application/pdf') pisa_status = pisa.CreatePDF( html, dest=response, link_callback=self.link_callback ) return response except: pass return redirect("servicios") ########################## PREVENTIVO ################################### class Calendario(ListView): model = preventivo template_name = 'preventivo1.html' def get_context_data(self, **kwargs): context = super(Calendario, self).get_context_data(**kwargs) listas = preventivo.objects.all() context['listas'] = listas return context @login_required(login_url='/acceder') def Preventivo(request): datos = preventivo.objects.filter(estatus="PENDIENTE") return render(request, 'preventivo.html', {"datos": datos}) @login_required(login_url='/acceder') def PreventivoAll(request): datos = preventivo.objects.all() return render(request, 'preventivoall.html', {"datos": datos}) @login_required(login_url='/acceder') def crear_preventivo(request): if request.method == "POST": form = Formpreventivo(request.POST) if form.is_valid(): post = form.save(commit=False) post.save() control_bit = form.cleaned_data.get("n_control") messages.success(request, f"El servicio preventivo con numero de control: {control_bit} se ha creado correctamente") return redirect("preventivo") else: for field, items in form.errors.items(): for item in items: messages.error(request, '{}: {}'.format(field, item)) form = FormpreventivoEnv() return render(request, "crearpreventivo.html", {"form": form }) @login_required(login_url='/acceder') def ActualizarPreventivo(request, id): instance= get_object_or_404(preventivo, pk=id) form = Formpreventivo(request.POST or None, instance=instance) context= {'form': form} if form.is_valid(): obj= form.save(commit= False) obj.save() messages.success(request, "El servicio preventivo fue actualizado") return redirect("preventivo") else: context= {'form': form, 'error': 'Error al actualizar'} return render(request,'actualizar_preventivo.html' , context) ################### EXCEL #################### @login_required(login_url='/acceder') def ReporteExcelServicios(request): servicios = ordenservicio.objects.all() ibs = User.objects.all() datostiposervicio = tiposervicio.objects.all() datosfalla = falla.objects.all() datosservicio = serviciorealizado.objects.all() datosaccesorios = accesorios.objects.all() fecha = datetime.datetime.now() fe = str(fecha) wb = Workbook() ws = wb.active ws['B1'] = 'REPORTE DE SERVICIOS CONCLUIDOS' ws.merge_cells('B1:L1') ws['B2'] = datetime.datetime.now() ws.merge_cells('B2:D2') ws['B3'] = 'FOLIO' ws['C3'] = 'FECHA' ws['D3'] = 'REPORTA' ws['E3'] = 'IB1' ws['F3'] = 'IB2' ws['G3'] = 'No. CONTROL' ws['H3'] = 'No. REPORTE' ws['I3'] = 'T. SERVICIO' ws['J3'] = 'ORIGEN FALLA' ws['K3'] = 'FALLA DETECTADA' ws['L3'] = 'SERVICIOS' ws['M3'] = 'ACCESORIOS' cont = 4 for servicio in servicios: for ib in ibs: if servicio.ib1_id == ib.id: ibuser = ib.username ibuser2 = "" if servicio.ib2_id is not None : for ib in ibs: if servicio.ib2_id == ib.id: ibuser2 = ib.username for datotiposervicio in datostiposervicio: if servicio.tipo_servicio_id == datotiposervicio.id: tiposervicio1 = datotiposervicio.nombre for datofalla in datosfalla: if servicio.origen_falla_id == datofalla.id: falla1 = datofalla.nombre count = 0 serreali = "" for datoservicio in datosservicio: if servicio.n_reporte == datoservicio.control_bit: count = count + 1 realizado = str(count) + " - " + datoservicio.descripcion serreali = serreali + " // " + realizado if count == 0 : serreali = "" count = 0 count1 = 0 seracce = "" for datoaccesorios in datosaccesorios: if servicio.n_reporte == datoaccesorios.control_bit: count1 = count1 + 1 acceso = str(count1) + " - " + datoaccesorios.n_parte + " | " + datoaccesorios.descripcion seracce = seracce + " // " + acceso if count1 == 0 : seracce = "" ws.cell(row=cont, column=2).value = servicio.folio ws.cell(row=cont, column=3).value = servicio.fecha ws.cell(row=cont, column=4).value = servicio.reporta ws.cell(row=cont, column=5).value = ibuser ws.cell(row=cont, column=6).value = ibuser2 ws.cell(row=cont, column=7).value = servicio.orden_n_control ws.cell(row=cont, column=8).value = servicio.n_reporte ws.cell(row=cont, column=9).value = tiposervicio1 ws.cell(row=cont, column=10).value = falla1 ws.cell(row=cont, column=11).value = servicio.falla_detectada ws.cell(row=cont, column=12).value = serreali ws.cell(row=cont, column=13).value = seracce cont += 1 serreali = "" seracce = "" nombre_archivo = "ReporteServicioConcluidos "+fe+".xlsx" response = HttpResponse(content_type="application/ms-excel") content = "attachment; filename = {0}".format(nombre_archivo) response['Content-Disposition'] = content wb.save(response) return response