From 04c4db511d59005da9ceab253f8f498c1e4c4d49 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Fri, 6 Feb 2026 12:02:27 +0000 Subject: [PATCH] DN V1 --- ai/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 404 bytes ai/__pycache__/local_ai_api.cpython-311.pyc | Bin 0 -> 19874 bytes core/__pycache__/admin.cpython-311.pyc | Bin 2924 -> 3586 bytes .../context_processors.cpython-311.pyc | Bin 763 -> 1295 bytes core/__pycache__/forms.cpython-311.pyc | Bin 7518 -> 8395 bytes core/__pycache__/models.cpython-311.pyc | Bin 9986 -> 11113 bytes core/__pycache__/urls.cpython-311.pyc | Bin 1447 -> 2439 bytes core/__pycache__/views.cpython-311.pyc | Bin 20064 -> 31536 bytes core/admin.py | 14 +- core/context_processors.py | 16 +- core/forms.py | 16 +- core/migrations/0004_appsetting.py | 28 ++ .../0004_appsetting.cpython-311.pyc | Bin 0 -> 1562 bytes core/models.py | 14 + core/templates/base.html | 412 ++++++++++++++---- core/templates/core/barang_keluar.html | 73 +++- core/templates/core/faktur_detail.html | 121 ++++- core/templates/core/settings.html | 85 ++++ core/urls.py | 11 + core/views.py | 300 +++++++++++-- requirements.txt | 6 +- 21 files changed, 949 insertions(+), 147 deletions(-) create mode 100644 ai/__pycache__/__init__.cpython-311.pyc create mode 100644 ai/__pycache__/local_ai_api.cpython-311.pyc create mode 100644 core/migrations/0004_appsetting.py create mode 100644 core/migrations/__pycache__/0004_appsetting.cpython-311.pyc create mode 100644 core/templates/core/settings.html diff --git a/ai/__pycache__/__init__.cpython-311.pyc b/ai/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d7cbff1e33087f103c93863772a301eb13837eb3 GIT binary patch literal 404 zcma)(u}T9$5QcZ}E=EFvwcTQuCRf>s5Ku8hY^=OyS$8MN#@*X>Z;vF_zJre-K7bG4 z8>E!01S>lsT`G4$tsRDMW?=rAfqClnIw;u3>w|oWF&4j;{3M%$kUS!R3M8;d6xK;1h>^{jBL+7|zsiG_Y%cwte|N-xT~S^&Ax!BqVvj> zG|u|#x$N&WZAyjVlr~)zhfyXev(lwugUcdX5jz3TXcLIGgM4N*Km`Z|Xt@Y)-f zFO0jbEaQ+fnNuoD=_wu9)pqwt8&NAbcHJP4r&osoUn$1;4UN}m{En{I|8p0g@eQKr Bd&K|% literal 0 HcmV?d00001 diff --git a/ai/__pycache__/local_ai_api.cpython-311.pyc b/ai/__pycache__/local_ai_api.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b7c878ca36334d33b45f08e6d9aab679f55ee17 GIT binary patch literal 19874 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 literal 0 HcmV?d00001 diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index 7f66d9bfa1ffa4036ef2eea552af1754c2ede772..9103936e0be529c7d346c6bfb9f556313b8dea61 100644 GIT binary patch literal 3586 zcmbVO&2Jk;6rWk|+8aAgQs=u(D<`CB4Q(QzX=y2lmVO-C7(^<8ETLuNog|y=uHD(S zNFokC1c?KO+{%$tQPqEe0}}s01D3GnREbk>j*?SPytkWmob>{MwfF7JdvAY!zj<%o z_@`_(P2l?F_ixQ#lZ5<#Gn?jX^B!|NJhev>_jPH%O%-XN{XE< zCGAuxWveCC?kV+vkId+rkB%r>CIBPEP>$()+xp}&eKyof1oVC3jP*RFggl2kxFm9) z7^!VysNmHfYM&;+2kzi{3XkXEgp>v%h^ZLF9zaZ=81YmDQH?>&0AlZn5pxm5L=0jU z5c^JyI2b{cV-WiRap1&=LlHzJ2JsXi=1z<_96?ORAPxfJ(1{U8jNwI67Oy@ndh0#%2w~4;^ogjTg=}={H^Ta?9&SObZcvBky*N}d-*%Mr#mZo z!^|(}j=sih=Hvs{a=ScX5El3T7)+iJMoQEmCCQ+rgduH{l58Y^lq~v>0`PygkPxa~ zt!j>LGtq-1X6vRE46CaZhm~O`w=W#y9@)PK;tBbNthG&RVF={M&Ntfj<2#B&Xp7Jj zAgDy~-XjP@u`33%M5?m1#>$>6l5E3tJ+~kU*=5$UNOAVK#z2GU`TXn4bE_4b&DEA_ zj#ryw8?0RODtzwi3SW1tdYR3YE1b>w$(yZiirlL1YPw-)RmN@8bs;}nQ<24(?e@Wz z;+_XlCoePo-`{9t&i;{^{w*`To0(~3W?F>yj5i0zcIKP?gWq}k$hKHegsS-~s%avv zX+W%IF&Ou1+T)sT;acO&0)Codx>ZZx0RU?a#}>>-C2% zSyqNxq+0|a_VW|b8r{uZF~H$fCA$21h5 zC1crU{CqB(md7~9l8F+&fI1Y&)x{O+BzzwT=L+=)&7ql2*61J4ItP|0YurvE8}=xl zFP{d#VnL3JIU3;{xN;PjDi`z88R10zA%22vpjUic|C)_#*g1oIB>fr^YB}tz33t6F z=nH{@o>SzPKpW-y9_mnF1$S}%0&8yyYwv1j?V*1>*MDpw z!_kBAaNqIkfF}mLqZ3lYEyi!6I$h=r3c%2G4~X3Y6~7JQZ(0kF%jZY<5{g;4yBf*@ za=g-+N^~t2Mn#{o21jgV7F!%Qmv{p7BIzGTE>~c}@oz0pp-@p^N9Oo9mE%8DIG;@H z8Ys0@rW?>w(*6VzXMw?V47Q;K6P2?SX#420fahJXMg3l%M?k+v_}kF0PCsoQq2YM# zzE*Drr^<)?0a)?qb-#jxv6Y~dHc9@)@o$rS`QpESTS;>IVqMuzH^@kH>_RXaZjOI& zsC!BK>%-gUcGA1_OoN_jNhu2FQMcG(jggr>G#sGVOAu+I?VlskfRCc?((wizZ%Gn8 z*CO3w=Wb(YdJhc;C=lgz+g}Y)lDl-YK}TCsf?jBmZn1N|k(=5>!vP9J8EgBeLzH$b zl%9nnzDpd&0)_*$9>s#L$u5-cF#OOCQ95G@7@>bV7G;-?H0TI2x`wYs#m;c!)Fd*x whK#OZEU*HH{vpbXf&4C=Y|u$u-g#W!sQBS-W8xAn?>sK=Ji<(M`};lcFT$P@YXATM delta 1032 zcmb7CJ#W)c6tzR_#C9B-kA~1D>4(x5E6`NpLx@5lVnL|2sDjjPmKDDWqa>}K&A>!J zRLtq!n3zCig^8&@p{!Y8q==0T6^VQ81d%8U&(`sK=U$)p&b{wN;YTj{PS;fd$Ni&y z_qo(f=Ea@vQuTo-I8i1(RwzWn3X*8%NJG3v91TYv;u9e&2oV8!y?a_zVlM?Jj*DdX zcp-K+P>Lpqg5e$(}r+bW7iB=n&**))Dgbl{V! zC4yd3l4(rBXLS`)+TB`kd4k>seF^FjSP3MDxA_&n+1hoUG}#(oLm9fTUKUuo=}3P7+hNFe diff --git a/core/__pycache__/context_processors.cpython-311.pyc b/core/__pycache__/context_processors.cpython-311.pyc index 86948bc971e96a5726f863021a128a1583b0ab3c..0d9097d822cb4b4ce88bca0b65d51e2b49ef6114 100644 GIT binary patch literal 1295 zcmZ`(&1)1%6tA9-p2^2B##S^N;*@N4{{t^B?1CFv;=$t{cK?SNx51%cPvXJbK=9(pS3RkGD83$E{oZ@^zPsl|snm;r z=zqU>lUan`DnV0b3v3<-@Dve53?J3Ir%^XZhGhLrkgaD8L~>71Jx7drRL#FvZnN(V z;8jERPQ>v%6~YUbT&2>a(n3PCxd7UyNN7ErE8F*e*Cp(-BD4^$Ev69ml0p~T24~UY+P+37^k|nuysBUAsLhveTE8w18I32N)zY;6| zc`R{AdxOv54qoZkc<&7Mc0)r8OOvC#gi^710 z0^fI-=Pde^V<#k-cee#Ijj&jzSkNH$9YL`hg@Qg5c*&0z9p7I)m4<(0PR*XYF*gsp zE;?~+hfYAHb#3nI57UaFuNOwdUIG!&DwABloC2BXAFAoqJ`_Zau*A`wtxp0EG zT4HMHvJfq*;c%J1<1sFz=`sopGgBGMs;S+@WFjujB`RQovQHUxQ9VlN7L>wnF=3*7CR;yJenM?wkxAaoR^o20SF!+Y{{I+IFV1HUIxgU&XB^8!kEJl1)&+E7*m*97^0X`7=sx! znO}l5_$4!fC@5e9(#$~oc^Z(I&QO9Rmj!3108LrO#K5o`h#>%rI(?u_3Nwa6R+ttB zh7xuJJBxYpMn+XmmO0Eohp|?LPrlD+I9ZlSZE`r1HY4-oiA-XXuQ6$Au-szGFTTZ= zo?4QcS9XgzGq2qP+7JdFRQ2EK0SUtUPQV7$5{I+h?FsV8|4K!m@}LM1V|L$xtK+V)Fxu yUmP~M`6;D2sdh!eKrYC(Vgn%Yftit!@dg8D0~p?5;BElJ4=kLFK=UyPu!#V0MN+N+ diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc index 74fd7301a8181a94fd209b5501fa91e1d319145b..16e876c40aa820965d76130ed81799aa9ef52739 100644 GIT binary patch delta 2197 zcmbW2O>7fK6vsWz`g7y2xW;x&;shmxZ6S&HkO-jgk>pU-n3At@16?e)*|{`+S3 zy_q+&Pfz@G*8i=~=e5D7_~di_UUG6UsHeCGNr5Pk&UFs%594*B4Am|~`QQF(0woKZj@H31_ zB9`Muk>-tO1T7bvCa0S%@7YpmQZr4xFw3qA!vX)6Jp#^*`1i1Wae`$WQC1KG{C~eg zVuS9aqLLNIj8}ERBit{-+dKA7Xr>}LEVoiB$ps~^SpjURnvtb?$<&JlOGH6YRjL_= zUVVBw!{E!eu~sD(0Bel0qGi}fr!Rs!GMUiDXdN2{^1wb$!LmdvatGqr@Yd~9WKwYPe4vf6(Muf)_^Vro4xRf`{3j;tgfxmMfft9@hD zcxo-4T92n{acMcS9+w_Pp;v#Z8XsSakFUqaH$-RHyI}(?y6{W)L#*@wApKCFd(mh^ zv^QkhjV3sa!IfDrtQ4*(Ds`=lu&ZDmL$blTDJAZmyp^9#fE z1P)d*!T=$Cj5)eycT3?lVdLumkFbwIw^r8f{PIn)9>(zzarTRIGuFd6*_FI&2IKwF zotobsFO=-g$#v}#rRAK|a$453#B@1-U8B6Rcc1K&FbvM6@iU-N1PeBH-}CrQc?@6# zh%WZ2cQcOx$YZP$5J$+44CpvGKD6^vvIO(vlJ?Aw{jrSFQuEI2oOthbrE?B$Se|zk zQ>!PoYbkkoEscWv5%#qC`{QpYpkaIA`5M|@>JvLAxI37&#Guc>-g$8&0EPN5^Z zmQ!gb^M~5V1$Ho$Btz`I&_EoQ=9PVW5lzHkyCIq&*^g==M*zLNB6K~q*LPcb_Iv2yVpwAslub}u>=#tmvYZ|FJbP~YQI?0NLW$s+0=SZAu^R{>o{rV zC4qKY3bTCT$UGInusjn*Rm))_^^=vKM!b;t9>KD*1b&+@ARl%6%D!-)$`{pgP8+0O zfH%Hcjjw7fK6o7a97kh25?KlKGj)?;_>8c7rR1_stq~XUT7~G_RasXs4-oaV4vFWTW zM4+OT+EXtzPrV@2OAiQ%+g>;W2PBZ-i1q;ITo5M?MO1xn784qQP;Kkeyq|gV-kUdm zIQwi`yO~U?3VxnH_|+QDbhR8C?2b>SnG#SAD`w~y#SC+HKGywxb4rz}2&(#es<>1| zQ5Ex5#h8jhyk}2JdjeHSRB0Fm@=Rm27*3n%B}LDy(djz#!sl9I#aUw{Mc`*P16RWT zfE66eXHeyZMC+oX2Sf@5kw#Q?6>bDSV=CMYPQdHnp|FP9FuaJE)1&0Hjht?UM2>_! zVW_7TC0a?Zt+Yz?5Q58nha%FDfUY_Zspw0Vx)$5spd>^;Axqdq7(`$i8&3$6tw0zi z1PMjL7QzUjL|8wcQWc*gH25ucOJuQ<9`u>;G7C|le% zMGgkA3Af%D8C^0GTK_>@f@Mzxo+%vvvUt<`Dc zW0MUJSf)SobLh1iU$AUzxwPMC*Ox^A}|a?Y}Gga1zEp;VY=bvRYXN93z)z-nQLopt{xY-Ly9>jduf zA61oBa+WEYSRhb`#3CVz@IuX2lM7Dr_k=x!lZ5XG^eo8-lW5Q~S*z7;!*S}|wre$= z34vONDN4WcjgU#5rfq~{?p*N*OUMS3T-7u1=aw&*yx6gp$?Y=!oB97MG!$~w<%oD8 yX_2=fW0lDK?wbCNe!bE%J2u}ZR?&bbD^4ADj12Ewe4_l1-^-ADd!)cZ6!>2??lb%V diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index a72c45c9239da61d87332685287efc22ed27c452..8b0ae5eb590e0fe00b6423ac7b18b601f0e37ee6 100644 GIT binary patch delta 3675 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 SfBG>0E815|Jk!Xm6!#DQWicTD diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index b11b47134e34139d03e2cb312d85bf740a4c48b4..8853e8cda6133f554f3491550b6189a80dc78158 100644 GIT binary patch delta 969 zcmaKq!HW`69LGofX{o!JnUf(~yKCCGSyPA<%OXU96)Hh&M47`dGcA^@!<&gpBKHzq z6R#1TTA>ccUc7hhFhlPUd+i?x_8z_G%!q?+Z+MU2`+UE@-|s!q2W3T_7kvb>#@kUUZ>LUjmxYiz|IvNC^<$zJaN z@#GRgP0{s6YfIzz7erMRob6uLi#*-VlCEs4O;J~Px&5NmY>P6#q3LK{f2Ar#en09^ z!SQtxjcv7!bY6KWDNUDo!BT{Y(%}yCZ8Tc?`V;Y){v36MhD^G|W)lTV>Ll9|;;opU zNwG3QM0AV^NhHTnQCm_p&3zyn3e?fz=6zl3nseo2vx!b0c9JhO6%o0*geJ)9k@>f0 zu0hnwIY#Yv{c849|D*3g646J2=s!m+T@rMm&l4s42fn-ERT6s0)Oc^d3b&)l_X=jY z;Tr>rCKNFg_j+)|(+x2G;Lc4W$PLqY?YeR6kpVRmY8Yxi;V2bSgH4>iI&K+IF`H=l@jcf#~T%jD930g$LJ$N&HU delta 118 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 RBL>JDQh>Yz@gmc}{{pw1javW! delta 6149 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 DAYh(( diff --git a/core/admin.py b/core/admin.py index 7d50940..b1ff85b 100644 --- a/core/admin.py +++ b/core/admin.py @@ -1,11 +1,21 @@ from django.contrib import admin -from .models import Category, Medicine, Batch, StockTransaction, Supplier, Faktur +from .models import Category, Medicine, Batch, StockTransaction, Supplier, Faktur, AppSetting # DN-WRS Branding admin.site.site_header = "DN-WRS Admin" admin.site.site_title = "DN-WRS Portal" admin.site.index_title = "Selamat Datang di Manajemen DN-WRS" +@admin.register(AppSetting) +class AppSettingAdmin(admin.ModelAdmin): + list_display = ('app_name', 'app_email', 'app_phone') + + def has_add_permission(self, request): + # Allow only one instance of AppSetting + if self.model.objects.exists(): + return False + return True + @admin.register(Supplier) class SupplierAdmin(admin.ModelAdmin): list_display = ('name', 'contact_person', 'phone') @@ -36,4 +46,4 @@ class BatchAdmin(admin.ModelAdmin): @admin.register(StockTransaction) class StockTransactionAdmin(admin.ModelAdmin): list_display = ('medicine', 'transaction_type', 'quantity', 'created_at') - list_filter = ('transaction_type', 'created_at') \ No newline at end of file + list_filter = ('transaction_type', 'created_at') diff --git a/core/context_processors.py b/core/context_processors.py index 0bf87c3..0d1599d 100644 --- a/core/context_processors.py +++ b/core/context_processors.py @@ -1,13 +1,23 @@ import os import time +from .models import AppSetting def project_context(request): """ - Adds project-specific environment variables to the template context globally. + Adds project-specific environment variables and settings to the template context globally. """ + settings = AppSetting.objects.first() + if not settings: + # Create default settings if none exist + settings = AppSetting.objects.create(app_name="DN-WRS") + return { - "project_description": os.getenv("PROJECT_DESCRIPTION", ""), + "project_name": settings.app_name, + "project_description": settings.app_description or os.getenv("PROJECT_DESCRIPTION", ""), + "project_address": settings.app_address, + "project_phone": settings.app_phone, + "project_email": settings.app_email, "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), # Used for cache-busting static assets "deployment_timestamp": int(time.time()), - } + } \ No newline at end of file diff --git a/core/forms.py b/core/forms.py index ec37e48..cd5e243 100644 --- a/core/forms.py +++ b/core/forms.py @@ -1,5 +1,17 @@ from django import forms -from .models import Supplier, Faktur, Medicine, Batch, StockTransaction, Category +from .models import Supplier, Faktur, Medicine, Batch, StockTransaction, Category, AppSetting + +class AppSettingForm(forms.ModelForm): + class Meta: + model = AppSetting + fields = ['app_name', 'app_description', 'app_address', 'app_phone', 'app_email'] + widgets = { + 'app_name': forms.TextInput(attrs={'class': 'form-control'}), + 'app_description': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}), + 'app_address': forms.Textarea(attrs={'class': 'form-control', 'rows': 3}), + 'app_phone': forms.TextInput(attrs={'class': 'form-control'}), + 'app_email': forms.EmailInput(attrs={'class': 'form-control'}), + } class CategoryForm(forms.ModelForm): class Meta: @@ -104,4 +116,4 @@ class StockOutForm(forms.Form): except (ValueError, TypeError): pass elif self.initial.get('medicine'): - self.fields['batch'].queryset = Batch.objects.filter(medicine_id=self.initial.get('medicine'), quantity__gt=0) \ No newline at end of file + self.fields['batch'].queryset = Batch.objects.filter(medicine_id=self.initial.get('medicine'), quantity__gt=0) diff --git a/core/migrations/0004_appsetting.py b/core/migrations/0004_appsetting.py new file mode 100644 index 0000000..bf4861b --- /dev/null +++ b/core/migrations/0004_appsetting.py @@ -0,0 +1,28 @@ +# Generated by Django 5.2.7 on 2026-02-06 11:41 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0003_medicine_alternative_supplier_medicine_main_supplier'), + ] + + operations = [ + migrations.CreateModel( + name='AppSetting', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('app_name', models.CharField(default='DN-WRS', max_length=100, verbose_name='Nama Aplikasi')), + ('app_description', models.TextField(blank=True, verbose_name='Deskripsi Aplikasi')), + ('app_address', models.TextField(blank=True, verbose_name='Alamat')), + ('app_phone', models.CharField(blank=True, max_length=20, verbose_name='Nomor Telepon')), + ('app_email', models.EmailField(blank=True, max_length=254, verbose_name='Email')), + ], + options={ + 'verbose_name': 'Pengaturan Aplikasi', + 'verbose_name_plural': 'Pengaturan Aplikasi', + }, + ), + ] diff --git a/core/migrations/__pycache__/0004_appsetting.cpython-311.pyc b/core/migrations/__pycache__/0004_appsetting.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9a9722d6b7200685cbc0fd140bbdec7ffeec453 GIT binary patch literal 1562 zcmZuwO>7%Q6rNq%>z_D@ou3+LZ49zRT}W)H5fV~_lr{u`sD-fA3QN^8-kI2&>>so1 zkmQsDNE~~k2M#?2q2`cdk3Hr%7JIPfgv2Q~SLvw-#G7@Tw4^iM=l5p5_dDd%P8sInECC>;X#^g?RK zNW6)viBox9RYk@&y9@`W>-a*mT|zD2m}tuXnRDT+u1J>@wH1QeDp9&hJEkHU-x9r1BKL@!C{LDnh0vCnQZWWa=pUX0U*pj&SJ? z4ZiULRPG8Y{}$BT|9r;DJXtteyyEj(go~a*dVm}X+eb2K@$}VqhY&sXmBD3as zO&SEI(-o>oS{p+BYP}j4S=JAv_H2_{cR9@^U{DS5*-UW+hdg}se%b%)Q5gsv%ps%((=&jxeh&D7>D56 zE-SaFMLpN4#@Hg9vUy1&zY(57WvtVGWgLkwB)>oZEyRX{KEuvy?#C+gucxki7Jw|s zEgn@u+cc>~e35jcH2g+2D^hw?8(kL}U5B~oTNL=LuK(D_mei6Gp&oSzbqtgGOpchC zx*NU0Jvm5B_Pfa5F}rK(TRp{1csl1@!7pt>@ab z*6;M4pkJfA)Bt;|_LIxDeGeP7CfllZImk6=uoWGO>W^Dx+1q0p7>bBw{3HzX!NneF zDBVy-F?B&Z_-2$r>GyxlgsIXnU;I12$P2d~?SzF}&*CQ)-qyLpc)=eO{IKBjTrkXE z=f$PR_rv1Saqr|de`xWdJt*2?(dId4nE#MhR-SBxm6c~JywTwmV^A@|iotVam@n~i z{fQQq>&L;#OS`#4u7!8OWi@K8GkU^t?LL;U2)hK_tJLbaDL!X45TTsNzYk;-Qxpa2sZ=?- bdG$Bat|{6GT_uk)VXpE*Uc7wEZRGbq!^OI> literal 0 HcmV?d00001 diff --git a/core/models.py b/core/models.py index 324aa1c..b0e3a39 100644 --- a/core/models.py +++ b/core/models.py @@ -1,6 +1,20 @@ from django.db import models from django.utils import timezone +class AppSetting(models.Model): + app_name = models.CharField(max_length=100, default="DN-WRS", verbose_name="Nama Aplikasi") + app_description = models.TextField(blank=True, verbose_name="Deskripsi Aplikasi") + app_address = models.TextField(blank=True, verbose_name="Alamat") + app_phone = models.CharField(max_length=20, blank=True, verbose_name="Nomor Telepon") + app_email = models.EmailField(blank=True, verbose_name="Email") + + def __str__(self): + return self.app_name + + class Meta: + verbose_name = "Pengaturan Aplikasi" + verbose_name_plural = "Pengaturan Aplikasi" + class Category(models.Model): name = models.CharField(max_length=100, verbose_name="Nama Kategori") description = models.TextField(blank=True, verbose_name="Deskripsi") diff --git a/core/templates/base.html b/core/templates/base.html index cecdb8a..12a5b04 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -18,110 +18,350 @@ + {% block extra_head %}{% endblock %} {% if user.is_authenticated %} -

- {% endif %} - -
- {% if messages %} - {% for message in messages %} - - {% endfor %} - {% endif %} +
- -
- {% block content %}{% endblock %} + {% else %} +
+ {% block login_content %}{% block content_no_auth %}{% endblock %}{% endblock %}
- -
-

© {% now "Y" %} {{ project_name|default:"DN-WRS" }}

-

Sistem Manajemen Gudang Premium

-
+ {% endif %} {% block extra_js %}{% endblock %} diff --git a/core/templates/core/barang_keluar.html b/core/templates/core/barang_keluar.html index 5da9a0f..f1706d8 100644 --- a/core/templates/core/barang_keluar.html +++ b/core/templates/core/barang_keluar.html @@ -1,8 +1,56 @@ {% extends 'base.html' %} {% block content %} +{% if cart %} +
+
+
+
+ Konfirmasi Import Barang Keluar +
+ +
+
+ + + + + + + + + + + + {% for item in cart %} + + + + + + + + {% endfor %} + +
Barang (SKU)Batch NumberQty KeluarCatatanStatus
+
{{ item.sku }}
+
{{ item.batch }}{{ item.qty }}{{ item.note }} + {% if item.valid %} + Ready + {% else %} + Batch/Stok Tidak Valid + {% endif %} +
+
+
+
+{% endif %} +
-
+

@@ -35,6 +83,29 @@

+ +
+
+
+
+
+ +
+ Import Excel +
+ Template +
+
+ {% csrf_token %} +
+ +
+ +
+
+
diff --git a/core/templates/core/faktur_detail.html b/core/templates/core/faktur_detail.html index 4e1a61d..72182e1 100644 --- a/core/templates/core/faktur_detail.html +++ b/core/templates/core/faktur_detail.html @@ -13,35 +13,89 @@
NOMOR FAKTUR

#{{ faktur.faktur_number }}

-
-
SUPPLIER
-
- {{ faktur.supplier.name|default:"Internal" }} +
+ + Template Excel + +
+
SUPPLIER
+
+ {{ faktur.supplier.name|default:"Internal" }} +
+{% if cart %} +
+
+
+
+ Konfirmasi Import (Keranjang) +
+ +
+
+ + + + + + + + + + + + + {% for item in cart %} + + + + + + + + + {% endfor %} + +
Barang (SKU)BatchExpiredQtyHarga BeliStatus
+
{{ item.name }}
+
{{ item.sku }}
+
{{ item.batch }}{{ item.expiry }}{{ item.qty }}Rp {{ item.buy|floatformat:2 }} + {% if item.valid %} + Ready + {% else %} + SKU Tidak Dikenal + {% endif %} +
+
+
+
+{% endif %} +
-
+
- Input Barang + Input Manual
{% csrf_token %} + {% for field in form %}
{{ field }} - {% if field.errors %} -
{{ field.errors }}
- {% endif %}
{% endfor %}
+ +
+
+
+
+ +
+ Import Excel +
+
+ {% csrf_token %} +
+ +
+ +
+
+
+ +
+
+
+
+ +
+ Scan Foto Faktur +
+
+ {% csrf_token %} +
+ +
+ +
+
+
@@ -59,9 +153,9 @@
- Rincian Barang + Rincian Barang Terinput - {{ items|length }} Item + {{ items|length }} Item Terdaftar
@@ -106,6 +200,11 @@