from django.shortcuts import render, redirect, get_object_or_404 from django.http import JsonResponse from django.utils import timezone from django.contrib.auth import login, logout from django.contrib.auth.models import User from django.contrib import messages import requests from .models import Firma, Zakaznik, Auto, Zakazka, Faktura, FakturaPolozka, PokladnaOperace, FirmaLogin def get_firma_from_session(request): firma_id = request.session.get("firma_id") if not firma_id: return None return Firma.objects.filter(id=firma_id).first() def index(request): return render(request, "index.html") def prihlaseni(request): if request.method == "POST": ic = request.POST.get("ic", "").strip() heslo = request.POST.get("heslo", "").strip() remember = request.POST.get("remember_me") try: f = FirmaLogin.objects.get(ic=ic) except FirmaLogin.DoesNotExist: return render(request, "index.html", {"error": "Neplatné IČ nebo heslo"}) if f.heslo.strip() != heslo: return render(request, "index.html", {"error": "Neplatné IČ nebo heslo"}) firma_obj = Firma.objects.filter(ic=ic).first() if not firma_obj: return render(request, "index.html", {"error": "Firma nemá vyplněné údaje v administraci."}) user, created = User.objects.get_or_create(username=ic) user.set_password(heslo) user.save() login(request, user) request.session["demo_mode"] = not f.zaplaceno request.session["ic"] = f.ic request.session["firma_id"] = firma_obj.id if remember: request.session.set_expiry(60 * 60 * 24 * 30) else: request.session.set_expiry(0) return redirect("dashboard") return render(request, "index.html") def demo_login(request): request.session["demo_mode"] = True request.session["ic"] = "DEMO" firma = Firma.objects.first() if firma: request.session["firma_id"] = firma.id return redirect("dashboard") def dashboard(request): if not request.user.is_authenticated: return redirect("prihlaseni") firma = get_firma_from_session(request) if not firma: return redirect("prihlaseni") demo = request.session.get("demo_mode", False) limit = 100 if demo else None zakazky = Zakazka.objects.filter(firma=firma).order_by("-datum_vytvoreni") zakaznici = Zakaznik.objects.filter(firma=firma).order_by("-id") auta = Auto.objects.filter(firma=firma).order_by("-id") if limit: zakazky = zakazky[:limit] zakaznici = zakaznici[:limit] auta = auta[:limit] zakazky_dnes = Zakazka.objects.filter( firma=firma, datum_vytvoreni__date=timezone.now().date() ).count() return render(request, "dashboard.html", { "zakazky": zakazky, "zakaznici": zakaznici, "auta": auta, "demo": demo, "zakazky_dnes": zakazky_dnes, "novi_zakaznici": Zakaznik.objects.filter(firma=firma).count(), "pocet_vozidel": Auto.objects.filter(firma=firma).count(), }) # --------------------------------------------------------- # Seznam zakázek # --------------------------------------------------------- def zakazky(request): firma = get_firma_from_session(request) if not firma: return redirect("prihlaseni") demo = request.session.get("demo_mode", False) limit = 100 if demo else None zakazky = Zakazka.objects.filter(firma=firma).order_by("-datum_vytvoreni") if limit: zakazky = zakazky[:limit] return render(request, "zakazky.html", {"zakazky": zakazky, "demo": demo}) # --------------------------------------------------------- # Detail zakázky # --------------------------------------------------------- def detail_zakazky(request, id): firma = get_firma_from_session(request) if not firma: return redirect("prihlaseni") zakazka = get_object_or_404(Zakazka, id=id, firma=firma) if request.method == "POST": novy_stav = request.POST.get("stav") if novy_stav: zakazka.stav = novy_stav zakazka.save() return redirect("detail_zakazky", id=id) platby = PokladnaOperace.objects.filter(firma=firma, zakazka=zakazka).order_by("-datum") faktura = Faktura.objects.filter(firma=firma, zakazka=zakazka).first() return render(request, "detail_zakazky.html", { "zakazka": zakazka, "platby": platby, "faktura": faktura, "licence_typ": "DEMO" if request.session.get("demo_mode") else "FULL" }) # --------------------------------------------------------- # Smazat zakázku # --------------------------------------------------------- def smazat_zakazku(request, id): firma = get_firma_from_session(request) if not firma: return redirect("prihlaseni") zakazka = get_object_or_404(Zakazka, id=id, firma=firma) zakazka.delete() return redirect("zakazky") # --------------------------------------------------------- # Pokladna – příjmy, výdaje, rychlá faktura # --------------------------------------------------------- def pokladna(request): firma = get_firma_from_session(request) if not firma: return redirect("prihlaseni") demo = request.session.get("demo_mode", False) if demo: return redirect("dashboard") zakazky = Zakazka.objects.filter(firma=firma).order_by("-id") operace_list = PokladnaOperace.objects.filter(firma=firma).order_by("-datum") hotovost = sum(o.castka for o in operace_list if o.typ == "prijem") - \ sum(o.castka for o in operace_list if o.typ == "vydaj") dnes = timezone.now().date() prijmy_dnes = sum(o.castka for o in operace_list if o.typ == "prijem" and o.datum.date() == dnes) vydaje_dnes = sum(o.castka for o in operace_list if o.typ == "vydaj" and o.datum.date() == dnes) if request.method == "POST": zakazka_id = request.POST.get("spz") cena_hodina = float(request.POST.get("cena_hodina")) hodiny = float(request.POST.get("hodiny")) provedeno = request.POST.get("provedeno") zakazka = get_object_or_404(Zakazka, id=zakazka_id, firma=firma) cena_prace = cena_hodina * hodiny dily_nazvy = request.POST.getlist("dil_nazev[]") dily_ceny = request.POST.getlist("dil_cena[]") dily_mnozstvi = request.POST.getlist("dil_mnozstvi[]") celkem_dily = 0 for i in range(len(dily_nazvy)): nazev = dily_nazvy[i].strip() if not nazev: continue cena = float(dily_ceny[i] or 0) mnozstvi = float(dily_mnozstvi[i] or 1) celkem = cena * mnozstvi celkem_dily += celkem celkem = cena_prace + celkem_dily poradi = Faktura.objects.filter(firma=firma).count() + 1 cislo = f"{timezone.now().year}-{poradi:04d}" faktura = Faktura.objects.create( firma=firma, zakazka=zakazka, cislo=cislo, vs=zakazka.id, provedeno=provedeno, cena=int(celkem), platba="hotove", ) zakazka.stav = "Dokončeno" zakazka.save() return redirect("faktura", faktura.id) return render(request, "pokladna.html", { "zakazky": zakazky, "operace_list": operace_list, "hotovost": hotovost, "prijmy_dnes": prijmy_dnes, "vydaje_dnes": vydaje_dnes, "firma": firma, }) # --------------------------------------------------------- # Faktura – zobrazení # --------------------------------------------------------- def faktura(request, id): firma = get_firma_from_session(request) if not firma: return redirect("prihlaseni") faktura = get_object_or_404(Faktura, id=id, firma=firma) zakazka = faktura.zakazka return render(request, "faktura.html", { "faktura": faktura, "zakazka": zakazka, "firma": firma, }) # --------------------------------------------------------- # Vystavit fakturu ze zakázky # --------------------------------------------------------- def vystavit_fakturu(request, id): firma = get_firma_from_session(request) if not firma: return redirect("prihlaseni") zakazka = get_object_or_404(Zakazka, id=id, firma=firma) existujici = Faktura.objects.filter(firma=firma, zakazka=zakazka).first() if existujici: return redirect("faktura", existujici.id) poradi = Faktura.objects.filter(firma=firma).count() + 1 cislo = f"{timezone.now().year}-{poradi:04d}" faktura = Faktura.objects.create( firma=firma, zakazka=zakazka, cislo=cislo, vs=zakazka.id, provedeno=zakazka.popis, cena=zakazka.odhad_cena or 0, platba="prevodem", ) zakazka.stav = "Dokončeno" zakazka.save() return redirect("faktura", faktura.id) # --------------------------------------------------------- # API – info o zakázce podle SPZ # --------------------------------------------------------- def zakazka_info(request): firma = get_firma_from_session(request) if not firma: return JsonResponse({"zakaznik": "", "auto": "", "zavada": "", "cena": ""}) spz = request.GET.get("spz") if not spz: return JsonResponse({"zakaznik": "", "auto": "", "zavada": "", "cena": ""}) zakazka = Zakazka.objects.filter( firma=firma, auto__spz__iexact=spz.strip() ).first() if not zakazka: return JsonResponse({"zakaznik": "", "auto": "", "zavada": "", "cena": ""}) data = { "zakaznik": zakazka.zakaznik.jmeno, "auto": f"{zakazka.auto.znacka} {zakazka.auto.model} {zakazka.auto.rok}", "zavada": zakazka.popis, "cena": zakazka.odhad_cena or 0, } return JsonResponse(data) # --------------------------------------------------------- # API – ARES (placeholder) # --------------------------------------------------------- def ares_api(request): ico = request.GET.get("ic", "").strip() if not ico: return JsonResponse({"error": "IČ není zadáno"}) # Zatím jen placeholder – nevolá skutečný ARES return JsonResponse({ "firma": "", "ulice": "", "mesto": "", "psc": "", "dic": "", "ok": False }) # --------------------------------------------------------- # Odeslat fakturu (placeholder) # --------------------------------------------------------- def faktura_odeslat(request, id): firma = get_firma_from_session(request) if not firma: return redirect("prihlaseni") faktura = get_object_or_404(Faktura, id=id, firma=firma) # Zatím jen označíme jako "odeslanou" pomocí zprávy messages.success(request, "Faktura byla označena jako odeslaná.") return redirect("faktura", id=faktura.id) # --------------------------------------------------------- # Nastavení firmy # --------------------------------------------------------- def nastaveni_firmy(request): firma = get_firma_from_session(request) if not firma: return redirect("prihlaseni") if request.method == "POST": firma.firma = request.POST.get("firma") firma.ic = request.POST.get("ic") firma.dic = request.POST.get("dic") firma.telefon = request.POST.get("telefon") firma.email = request.POST.get("email") firma.ulice = request.POST.get("ulice") firma.mesto = request.POST.get("mesto") firma.psc = request.POST.get("psc") firma.ucet = request.POST.get("ucet") firma.iban = request.POST.get("iban") firma.vs = request.POST.get("vs") firma.poznamka = request.POST.get("poznamka") firma.save() messages.success(request, "Nastavení firmy bylo uloženo.") return redirect("nastaveni_firmy") return render(request, "nastaveni_firmy.html", {"firma": firma}) # --------------------------------------------------------- # Nápověda # --------------------------------------------------------- def napoveda(request): return render(request, "napoveda.html") # --------------------------------------------------------- # O programu # --------------------------------------------------------- def o_programu(request): return render(request, "o_programu.html") # --------------------------------------------------------- # Reset hesla # --------------------------------------------------------- def reset_hesla(request): return render(request, "zapomenute_heslo.html") # --------------------------------------------------------- # Odhlášení # --------------------------------------------------------- def odhlasit(request): logout(request) request.session.flush() return redirect("prihlaseni")