From e6fa05f94e973376c87e058ffe1aaad72530f07f Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Thu, 5 Feb 2026 22:10:08 +0000 Subject: [PATCH] Auto commit: 2026-02-05T22:10:08.709Z --- core/__pycache__/admin.cpython-311.pyc | Bin 212 -> 1902 bytes core/__pycache__/models.cpython-311.pyc | Bin 209 -> 4620 bytes core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 1342 bytes core/admin.py | 23 +- core/migrations/0001_initial.py | 71 +++++ .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 4032 bytes core/models.py | 49 +++- core/templates/base.html | 188 ++++++++++-- core/templates/core/index.html | 272 +++++++++--------- core/views.py | 32 +-- 10 files changed, 454 insertions(+), 181 deletions(-) create mode 100644 core/migrations/0001_initial.py create mode 100644 core/migrations/__pycache__/0001_initial.cpython-311.pyc diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index a5ed392d6714413db63120e4233d2e96cbadb5de..7aa9e0c914ab8ebd54fa310a774de46e660dbaad 100644 GIT binary patch literal 1902 zcma)6NpIUm6rSNC(-I}e@)CD(5~o=zps{jkFHH-iKoS(Gb!kq#5M#|)X3E7Kl1*~c zAw{pgCBMK$;Xh*oItX(L&{J+Q>{CvCZzvkFtODkc-z;yN`Q97;U9VROJbx|y8T?=p z@-I%xr!pR#{zM6RM>yd$BoXx}CEVawu5>E61%(d9-JE ztb)hdl|8!L{gt%pAMpq+s%*xiApVHlv`l3`4P?Yr0Zd*sCp`x?C$zIfe3l} z4><)-@|L#8A)X29RT_<|Mg4$6*i)i4i-kimapG2EqaY)~K?9 z0TC)&yv`((OpvN~_5KrVg%Rq{-t#Sx%u1+di%O4rbKHX6 z+p1RVzR0bu=67_(U}EhZT|>6csd9TF7NMUdke^67K^lrU3euJ-Z$cosj_@S_xBJhq6*QsUY?@Fqo2D^Ai<9XsXtI<8^&Z370#zvpQx@YQQ*ObJpXIW1kKG`$`s7}>akY?Uz0gKcTTx~k~1Or;GIiND;US{*5Ra5IHe)h(=B&49jDs{Vp)=OL5h zn%AYPv!pk7al@aSN5#eeQ9cCU_}fVz0gg;c>5$wyy7&%B`{@7Q4|Jiw^7h8QeN0ye zbaiAH^!|ukhW(Yn;>HOI&Ja#aVq8DhcMRGFBXSw`?+%)`Pf&1%fFak;_1)5odra2{bbVx)^t%zc4Dap1+Sey2I72`$H!kbz G(*6%Zv8;0d delta 131 zcmaFIcZJb^IWI340}xFAk)LS~q#uJgFu(+5d=>&SrZc24q%h_%TlKTRK K0uU9k0fhjZiyAoq diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index e061640edbdcec3e5c1744466c916e7acdd2763b..b0b8df21d03703f31018e6333fb3e1e0cc96ff53 100644 GIT binary patch literal 4620 zcmbW5O>Eo96@W?oSwEEZ=h$)MII8o5sI9Hdu9Fr?+Km%M+ti7(skO#dXqKTpv_qSs zoS~E-VbSWa1&ksG9~MY}-9>XqQyURb2k0S(9t^CD`bYsh2)y=E-yArnT-x`B`mtok zC`yY@Gn~gaGjHB}Z{)uOgMJRKzsCNcc%k$!tTZlny|D8Y6rON|BfQGx_$<$J4(=0< zIKJYDQ|9L#jTc@xIqoIg_LX%qEf;9H572TkEe~jQ9iZhV-bpUu+d|U`-ty$~L{{~g zdROerQ?Km&8wyW2nalEo%Q_sK?3{Ns6bVlp73T{W^2_G1v+fQZ7jY9$rK@8)o(?T9 zXt{~6;(r0wUp9Nlb}>C~vq#hlRD=#|KBmQ-kDA0?3BKUL4&3&Y4Uq1yxU9h369V^y zJ4PKO5pYS=a;FuVleYc?uNBcAtH#I3#;a9_<-K3Di-phmVY2hgv>N242@XE_}K}A zc*1?j&BM2S!BqJPSb2v;z=TVe)ma_YJml0Kt-_>WS$zSSJ8Dkj=%!N(nO-0 z;!@IMDB>v4>6Y)xU5Ta@StS&M!}7ua<`h^c%a@a>uIQ|okslVAlI50gg{@#pD##fn zC)-b>d9|n)inOTaBoREI+*Rmd>;t=|LnxY4VD4c82cZ8G#I70m`j>i5U;neowJ!}{ zs_ILbzEt^gEp%+@z8N~U^5GgWu1y=EnQCap49%2(SqsOPJ!Uw*a(Ruc_ZXQwMp&wb zB{M9QuhoQsrL-vwJR4mh>wSiBttwnIg=^)jwf^C!y=MRL>rtcsQnmk**?-A!^=`X( zci%SG6ds2=vCZujZ}8dMeH!dJ;_A=9-MpHN`Xhu=D}dU`BD;ZD4NZV9BbMtx#_Uh5 zPR4jEzD~xlo`uHvh@S+AK!TO-4yFb7)eG&>>)ux{yhks@^l+E6i$qAY66@ewgy}?^ zIz8l2rME*T#&j@R*##8s>zLsoau_Ju%P86p6#YSmg+6iwHtm4rNlOs4lI5Fa->_L( zT&_ATUtSX-*~kUi5~!>~uoJd}Z6u=r2#wl4a43)2oo zQSy&bDW1tMs#0#%Ws{mHb4o$Cx`{laS&2mDe9h`o^n-!}1ju)x1PRfF$BBT||0pto`FpkS2%{ z&nX`#9Q3E~j5X5;l-eMTTNUq}5fJT={sy8IpxwYE*E$+}!+nQvbWD_-@!@y^ylM{> zk>Z}k1jd*{4}nda>x^-X9HnmCn+;MApbiQkb+q^E5hFATpJ$op+2^=75j@~0ugDRbJm{K!r? zU022?uZ*Rx(hJZ`PoOxDiatbj9o}pXmXNX|&3@>YC@`Bvq~%{A_Zwwl4x_A5^Q9HF zZY8itW<|ncOR9mmsfO69>^A9 zmMsoJw&=_^5z+^IIBW?vAI2qB&MB660l!t5vJj@oMT&keVlMdpTl)RqHFh4ST~Ob` zG0=~&ghaAjV?-{{QGAHGq!hTUP$d^nE03fCoSx5O!#NZPmn}R|P_$6QV>Kp%n^e*^ zUd2zJOt9`)ZYaX$-gs3K?Bo*9V7-muxbldOoex0#?+ho7?~sqqiIO9J`W>GDj(g#x zr@=v9u{<`>8EN+Cc+YOHHE2EzBdBu_X+CU(F2Lv6=<^Ha@t@fhl->&m5dFa8c%-dY zBziMF+v`^f+Zu6Jg=JJG=usHezUclO8qjHbj@zdY-5>0G+>Y)?ZF&j2VBj0W(i94Y z>d&y00%5r%hz%<+jS(TvVnkRz#Bv_iT&WWp*B01oQ(G)x_5GZ^fu>PlN4lq-v%$fo zDKj|u^!{4!-v&45jk&xLT&xBc&ER4=-8^=G^cs@vcr`R`hQ_3wj64;MUgv z3}V~K^L&jPFxo%cE`f(%6nn)|`tkKQ`220FaUjA&F4!xUrXK(H4L*O{YCP4=!{qjg R<#S(Oe1p&5?$gMo|6l1$J{$l5 literal 209 zcmZ3^%ge<81k-=yXIcX3#~=<2FhLogg@BCd3@HpLj5!Rsj8Tk?3@J>(44TX@K?*b( zZ?Wa(r=;c-`)M-W;!Md(%uCPLOGzqX21>4E_zY6>OHV%|KQ~psG^sSNq*On(A~m_R zB)>?%JijQrxF9h(RX;huC{-U~j9x+IFAf_ZyEG@&u80Guoe_wOWr4&8W=2NF8w@fR Ku%RM0pb7xLi8T)Z diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 2a36fd69370b38a98d8b01bf8eb9817c42f16ed6..37a3157b4a2a15f8b9c0c439ce37eed227f0f6a9 100644 GIT binary patch literal 1342 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 Vm1!(rcn$9OJ36@i5eQw)e*xF6WG(;z literal 0 HcmV?d00001 diff --git a/core/models.py b/core/models.py index 71a8362..017449a 100644 --- a/core/models.py +++ b/core/models.py @@ -1,3 +1,50 @@ from django.db import models -# Create your models here. +class Firma(models.Model): + ad = models.CharField(max_length=255, verbose_name="Firma Adı") + vergi_no = models.CharField(max_length=20, unique=True, verbose_name="Vergi No / TC Kimlik No") + mersis_no = models.CharField(max_length=30, blank=True, null=True, verbose_name="MERSİS No") + adres = models.TextField(blank=True, null=True, verbose_name="Adres") + olusturulma_tarihi = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return self.ad + + class Meta: + verbose_name = "Firma" + verbose_name_plural = "Firmalar" + +class Fatura(models.Model): + firma = models.ForeignKey(Firma, on_delete=models.CASCADE, related_name="faturalar", verbose_name="Firma") + fatura_no = models.CharField(max_length=50, unique=True, verbose_name="Fatura No") + tarih = models.DateField(verbose_name="Fatura Tarihi") + ara_toplam = models.DecimalField(max_digits=12, decimal_places=2, default=0, verbose_name="Ara Toplam") + kdv_toplam = models.DecimalField(max_digits=12, decimal_places=2, default=0, verbose_name="KDV Toplam") + genel_toplam = models.DecimalField(max_digits=12, decimal_places=2, default=0, verbose_name="Genel Toplam") + pdf_dosyasi = models.FileField(upload_to="faturalar/%Y/%m/", verbose_name="PDF Dosyası") + islenmis = models.BooleanField(default=False, verbose_name="İşlendi mi?") + olusturulma_tarihi = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return f"{self.fatura_no} - {self.firma.ad}" + + class Meta: + verbose_name = "Fatura" + verbose_name_plural = "Faturalar" + ordering = ['-tarih'] + +class FaturaKalemi(models.Model): + fatura = models.ForeignKey(Fatura, on_delete=models.CASCADE, related_name="kalemler", verbose_name="Fatura") + urun_adi = models.CharField(max_length=255, verbose_name="Ürün Adı") + adet = models.DecimalField(max_digits=10, decimal_places=2, default=1, verbose_name="Adet") + birim_fiyat = models.DecimalField(max_digits=12, decimal_places=2, verbose_name="Birim Fiyat") + kdv_orani = models.DecimalField(max_digits=5, decimal_places=2, default=20, verbose_name="KDV Oranı (%)") + kdv_tutari = models.DecimalField(max_digits=12, decimal_places=2, verbose_name="KDV Tutarı") + toplam_tutar = models.DecimalField(max_digits=12, decimal_places=2, verbose_name="Toplam Tutar") + + def __str__(self): + return f"{self.urun_adi} ({self.fatura.fatura_no})" + + class Meta: + verbose_name = "Fatura Kalemi" + verbose_name_plural = "Fatura Kalemleri" diff --git a/core/templates/base.html b/core/templates/base.html index 1e7e5fb..43c2f26 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -1,25 +1,173 @@ - - + - - {% block title %}Knowledge Base{% endblock %} - {% if project_description %} - - - - {% endif %} - {% if project_image_url %} - - - {% endif %} - {% load static %} - - {% block head %}{% endblock %} + + + {% block title %}Fatura Yönetim Sistemi{% endblock %} + + + + + + {% load static %} + + {% block extra_css %}{% endblock %} - - {% block content %}{% endblock %} - +
+ + + + +
+ + + {% block content %}{% endblock %} +
+
+ + + {% block extra_js %}{% endblock %} + + \ No newline at end of file diff --git a/core/templates/core/index.html b/core/templates/core/index.html index faec813..6a573d6 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,145 +1,137 @@ {% extends "base.html" %} -{% block title %}{{ project_name }}{% endblock %} - -{% block head %} - - - - -{% endblock %} +{% block title %}Gösterge Paneli | FaturaYol{% endblock %} {% block content %} -
-
-

Analyzing your requirements and generating your app…

-
- Loading… +
+
+
+

Gösterge Paneli

+

Fatura yönetim sistemine genel bakış.

+
-

AppWizzy AI is collecting your requirements and applying the first changes.

-

This page will refresh automatically as the plan is implemented.

-

- Runtime: Django {{ django_version }} · Python {{ python_version }} - — UTC {{ current_time|date:"Y-m-d H:i:s" }} -

-
-
-
- Page updated: {{ current_time|date:"Y-m-d H:i:s" }} (UTC) -
-{% endblock %} \ No newline at end of file + + +
+
+
+
+ +
+
+
Toplam Firma
+

{{ toplam_firma }}

+
+
+
+
+
+
+ +
+
+
Toplam Fatura
+

{{ toplam_fatura }}

+
+
+
+
+
+
+ +
+
+
Toplam Harcama
+

₺{{ toplam_harcama|floatformat:2 }}

+
+
+
+
+ +
+ +
+
+
+
Son Eklenen Faturalar
+ Tümünü Gör +
+
+
+ + + + + + + + + + + + + {% for fatura in son_faturalar %} + + + + + + + + + {% empty %} + + + + {% endfor %} + +
Fatura NoFirmaTarihToplamDurumİşlem
{{ fatura.fatura_no }}{{ fatura.firma.ad }}{{ fatura.tarih|date:"d.m.Y" }}₺{{ fatura.genel_toplam }} + {% if fatura.islenmis %} + İşlendi + {% else %} + Bekliyor + {% endif %} + + +
Henüz fatura eklenmemiş.
+
+
+
+
+ + +
+
+
+
Hızlı İşlemler
+
+
+
+ + + +
+
+
+
+
+ +{% endblock %} diff --git a/core/views.py b/core/views.py index c9aed12..5057928 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,19 @@ -import os -import platform - -from django import get_version as django_version from django.shortcuts import render -from django.utils import timezone - +from django.db.models import Sum, Count +from .models import Firma, Fatura def home(request): - """Render the landing screen with loader and environment details.""" - host_name = request.get_host().lower() - agent_brand = "AppWizzy" if host_name == "appwizzy.com" else "Flatlogic" - now = timezone.now() + """Fatura Yönetimi Gösterge Paneli.""" + toplam_firma = Firma.objects.count() + toplam_fatura = Fatura.objects.count() + toplam_harcama = Fatura.objects.aggregate(Sum('genel_toplam'))['genel_toplam__sum'] or 0 + son_faturalar = Fatura.objects.select_related('firma').all()[:10] context = { - "project_name": "New Style", - "agent_brand": agent_brand, - "django_version": django_version(), - "python_version": platform.python_version(), - "current_time": now, - "host_name": host_name, - "project_description": os.getenv("PROJECT_DESCRIPTION", ""), - "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), + "toplam_firma": toplam_firma, + "toplam_fatura": toplam_fatura, + "toplam_harcama": toplam_harcama, + "son_faturalar": son_faturalar, + "active_menu": "dashboard" } - return render(request, "core/index.html", context) + return render(request, "core/index.html", context) \ No newline at end of file