From f13b05eee4e1b95fcedab0803424cbc7629dd7f5 Mon Sep 17 00:00:00 2001 From: emile Date: Sat, 13 Apr 2024 13:53:00 +0300 Subject: [PATCH] ll --- .../__pycache__/models.cpython-310.pyc | Bin 5183 -> 5205 bytes .../billing/__pycache__/urls.cpython-310.pyc | Bin 602 -> 600 bytes .../billing/__pycache__/views.cpython-310.pyc | Bin 1818 -> 1891 bytes .../add/__pycache__/urls.cpython-310.pyc | Bin 442 -> 512 bytes .../add/__pycache__/views.cpython-310.pyc | Bin 1923 -> 3217 bytes osinaweb/billing/add/urls.py | 1 + osinaweb/billing/add/views.py | 80 +++++++++++++++++- .../migrations/0028_remove_order_due_date.py | 17 ++++ .../billing/migrations/0029_invoice_pdf.py | 18 ++++ .../migrations/0030_alter_invoice_order.py | 19 +++++ .../0031_alter_invoice_invoice_number.py | 18 ++++ ...0028_remove_order_due_date.cpython-310.pyc | Bin 0 -> 567 bytes .../0029_invoice_pdf.cpython-310.pyc | Bin 0 -> 648 bytes .../0030_alter_invoice_order.cpython-310.pyc | Bin 0 -> 746 bytes ...ter_invoice_invoice_number.cpython-310.pyc | Bin 0 -> 671 bytes osinaweb/billing/models.py | 6 +- .../templates/add_templates/add-order.html | 34 +++----- .../templates/add_templates/add-product.html | 2 +- .../templates/add_templates/add-service.html | 30 ++++--- .../details_templates/invoice-details.html | 2 +- .../templates/listing_pages/invoices.html | 8 +- .../templates/listing_pages/items.html | 11 ++- .../templates/listing_pages/orders.html | 42 +++++++-- osinaweb/billing/urls.py | 2 +- osinaweb/billing/views.py | 17 ++-- osinaweb/db.sqlite3 | Bin 1007616 -> 1011712 bytes .../osinacore/templates/add-edit-main.html | 52 +++++++++--- .../osinacore/templates/customer_main.html | 53 +++++++++--- osinaweb/osinacore/templates/main.html | 60 ++++++++++--- osinaweb/static/dist/output.css | 32 +++---- osinaweb/static/images/invoice_1.pdf | Bin 0 -> 68758 bytes osinaweb/static/images/invoice_111.pdf | Bin 0 -> 68760 bytes osinaweb/static/images/invoice_112.pdf | Bin 0 -> 68761 bytes osinaweb/static/images/invoice_113.pdf | Bin 0 -> 68761 bytes osinaweb/static/images/invoice_114.pdf | Bin 0 -> 68760 bytes osinaweb/static/images/invoice_2.pdf | Bin 0 -> 67218 bytes osinaweb/static/images/invoice_3.pdf | Bin 0 -> 67219 bytes 37 files changed, 373 insertions(+), 131 deletions(-) create mode 100644 osinaweb/billing/migrations/0028_remove_order_due_date.py create mode 100644 osinaweb/billing/migrations/0029_invoice_pdf.py create mode 100644 osinaweb/billing/migrations/0030_alter_invoice_order.py create mode 100644 osinaweb/billing/migrations/0031_alter_invoice_invoice_number.py create mode 100644 osinaweb/billing/migrations/__pycache__/0028_remove_order_due_date.cpython-310.pyc create mode 100644 osinaweb/billing/migrations/__pycache__/0029_invoice_pdf.cpython-310.pyc create mode 100644 osinaweb/billing/migrations/__pycache__/0030_alter_invoice_order.cpython-310.pyc create mode 100644 osinaweb/billing/migrations/__pycache__/0031_alter_invoice_invoice_number.cpython-310.pyc create mode 100644 osinaweb/static/images/invoice_1.pdf create mode 100644 osinaweb/static/images/invoice_111.pdf create mode 100644 osinaweb/static/images/invoice_112.pdf create mode 100644 osinaweb/static/images/invoice_113.pdf create mode 100644 osinaweb/static/images/invoice_114.pdf create mode 100644 osinaweb/static/images/invoice_2.pdf create mode 100644 osinaweb/static/images/invoice_3.pdf diff --git a/osinaweb/billing/__pycache__/models.cpython-310.pyc b/osinaweb/billing/__pycache__/models.cpython-310.pyc index c7c0d5511efbe6dea3698fe8db2a1697a871ad01..1a83489957415193d492d34151058a36d77be742 100644 GIT binary patch delta 696 zcmXw$&ubG=5Xavno6Wv-ceCC6GA%_aA_=rcgjg?P)0Cn@ZG$=J`lH6Y4J4*Xe2JnL z1r4+a)x-P)iid&+p$7D*C(pfz5K#O>3U%HFciGRIH}jphGxNUXe&+11WyKghzwgd8 zH0QuRAAvhqiY(8Yf{WOYy#mkLVGR&d!W{AHA}z?UtD&Ni3^j_!andd^D#mqy=Xp8=}aH&e8o0jQLu#JrR$?J<*UcJWgaX(kG=#>6-+D+2Dc! zHhS?t`a|+eWNFzV`+<__fy@LGWJ}Ekcb$Ex;JN9NrjEe_JBx3o*UzfW*j)AN&Fxxy zQsW}IWKbCoD(lsnLY`617IL=;ZM^Kx61U=W_|!ejK31Ve3T=WH?bV)b`<;QTV=b`= m1ALpv5cd-~xQ&O2nUuQApr4@HAW06W%O!roJ>_y&PxF5$?4RoZ delta 702 zcmX|;OHUI~6oBXSF}+h}ro&Lch7`~k1w)0HV2BGtr7;=;SRaW_3|P6B(x&uriyD_` z6WpMSvvJ`9UAS|hT^nO!T$#9X(}f8?fcOuL=M08P?lD2@Nm5Z*`4c|9FN_#? zrUxF_5P>A5<9Zr*ymYs1od&qveVzOSa0eIdD^SFj_9`skq5WVmpiu2G<`~P2d${RL z8KJy8UKTFlD?hVPHB~}It3pO)Y%dyED!QM1YXp5V zF3pY+&}gV_(Mw#fKWod)IG-Bz*w^N@2*U;+1U6H@X)P;WcCbv=hwL{0yKT^AD*RjQCK)gfqgd`A zH^b~E=KTTO?=PNbwPzR9dS$Cr3s<0XWD4gMSmFE4QbiusSjI7bHd`V8CY`oR5QYmb z2&%=U{pbp|{KJgq40Q(I4HC`L(=Aos*30;0AeU*8jn8o(Ns6b~7JeR>n7L1$UVNz` lRZYi8KH6b89bSl54DL0|O+l-XVVp{jTN(e9FMM;z`Ui%il(hf= diff --git a/osinaweb/billing/__pycache__/urls.cpython-310.pyc b/osinaweb/billing/__pycache__/urls.cpython-310.pyc index 50de502829b3f841a663a0d29b685b2c6c848608..5855b97faa40ddbc8fe9fd4a919a8aab11af912b 100644 GIT binary patch delta 37 rcmcb`a)X68pO=@50SInJNu{w&>pqa7mvwV4T; delta 39 tcmcb?a*KsGpO=@50SLAfOQx|+3Ss~N diff --git a/osinaweb/billing/__pycache__/views.cpython-310.pyc b/osinaweb/billing/__pycache__/views.cpython-310.pyc index 9d21722b90f361bd8a74e404735650aed05266de..66fe0c6e2e7e693d1b289d79e230142ec45c52b9 100644 GIT binary patch delta 755 zcmaJ;J8#rL5Waod;vAENONcKJ5Ff+OdA+TA-Ix+n!T z4O<`~3MeTNKZ5_TqN75hqoW|~*c_w)Z0)DnZ)WzJ$E)yj7?x90CmQbic)$JNiuXQT zM~B>9sXJTlsA~>%V-M|Nfdqbz-Vj0Fq66}aqsKTpCSxktYka^o9XA9Yvu9+x5qmeS zcT1LH*wZnxR6iMH-^t}%SZ_O%qr8{J*!qJyKv~~YHEUj?>xi3AXkmWZ6(MIFSg%+1 zb@o`lYsj`?xSR_d+d?gbF-H7Hz~mW6m<<%6ZzdthAupxKqwC8Gqq8( z>ksvQ5i`rSAV{791(FtpoO71M4q_(f!9ESJ0I&oQ0knU^;=}>5%6Bl0D5ggNVO2cT zL*-dl*bdpe12S?M;6E}e;QyNpIG~1!3~@44u9z?624_`UW|J=6I|uny2ej(I`jxMn z3%UA_r|rqSKPufmx+2qQUZ{8?6Chg4bj%0(2%R@;Y!zKFx7p6!S$M4KsO2n6Va%3~ z(qfn?36qF5eol`i))2_;;FtV;lERhCF~dVHSdh(*y==Tf1A0EO87By=10nM_Q= fU&OHIdKuNII&e(@{;Z|47R^`Q@tVHxH-qpeMXa2) delta 706 zcmZuuO-~d-5S^Ot`H&q3)KzzN6@{RzAtoB};>~z7(StEjFPq79qXP@0)xAK>?#Y8E zF7&~KlO8=8{{nx3+g$w{epQVw2%#tax~i+DUe)XG>28{qlamu3t(~p*^2hL7dJFCc z#e|wuR!_R@JT4~8Ad|Mp(tP^tsHtP7|QqJsn-qNHnigS4VG$*SXPTM-5`mY< zJ3@U#6u0l+c3;JvXQ#P<$ohReOV(e~;5ccALnkmJ2bjq4)YBkEJ$1+3laJ!4Sl=j% zT)PkQ%8Scf;lGJqPW+4Z3We7=ctZJVYMi9B&5FLcKBh{>RI~1f+=LltgL$~>c7x{) z78Q9aJmY=_ZN;iojeKBixu%in<~TUd!1XGrGMgQjw7INp{PB>e-|s)ix} diff --git a/osinaweb/billing/add/__pycache__/urls.cpython-310.pyc b/osinaweb/billing/add/__pycache__/urls.cpython-310.pyc index 0092be93f4384776bee160f32c75f52dfba80e4d..220996501121db9c45f25d5c64c8d03852a13c22 100644 GIT binary patch delta 164 zcmdnR+`yup&&$ij00g|zQfZ!y3=EG!9Av-&M$gH~jNJk}Ks7uJJdAuSe2jdI9Df1MTn^^| diff --git a/osinaweb/billing/add/__pycache__/views.cpython-310.pyc b/osinaweb/billing/add/__pycache__/views.cpython-310.pyc index 2860681ed60b68b882aa9fd7400ea140ef758b2d..1900e620915ce42fbd989e43143f5f28353e3cec 100644 GIT binary patch literal 3217 zcmaKu&u<&Y7034%_XoNBA=`0N*GX-+P0O?rny$ zZQ(Qd_}1=!`j+)Cdbs#;@bGI~@>2}VVs>s7c48M!;uLP;+N5)GZ@am-%-zlXB1nQF zOhPm7-r&Z<&! z9lxj4Z1n__m^>(6%<@!mJbUkLfAAFdP;#ZRa!)>+*z}{zPY3r9*CsCcXAH`k+6(8* zTDZ(Uvya`{ntIH6?udtwS__}K(0WVRgWOumEy%tKlvVr8KXs0Sr9OZ@T*@KjNQF~- z8nLMM>Q)`pVI8sdsc%~fkvg%rEEd;pW*@gzr?yzPZlAb_RPUMg%Cz9x`*3q>TenoE za;`g!%ZbQlDyvEzW!Uyu9nSb?wstb6{j{j&rP2|iHx~k%*TILPVspgO*B)7lF19Rs zG=LaOT%+MS2HhfWQn$~Y%A?m)#?C`4M|fJFHSRX{Rgn*4-GO_`-8Nk7pvj}uZkp#h ztOOD~-Z|8M!PS1nL`*;9B3;5I$$Nqy)c!#zTL7Bl2#BM8GU=Hk6;frjZGVJtRfH%dcm^~ zp4)Y&j#+#ffawnF64SL?d#v|Y=eVn4P~ES)hU&pHL6J!Yb7W&Y-pzzmW5V3PaUr?k zWG+<&y%@m$8`<6B;zc&$!$7=3)8|kK3i%alaTB_sWAM?@%I{0*#-hk=Lw8raO3uDb z!z~)VgF*KnEf)szcfpdlO;d!nc#Q@^Tf9!gcWL+<>z=qnin}!2qru?(CQ0YZ*PYe! z2x+sI?~%dfzpD5?=?Lp)cmq-c-*Wx*qWmd_fqfM}!tgSJj_v<9j2vL;e*p~F@!BN} zX=^?%gW=yHT*VMzGzD`T(s{u&h0$Xk@VZnm|F2ER8Z-@F1lJPJ;IZ}b4HVK2u=4?@ zcS_|lCI|^X)m`+?EEb-krG4_Y>a)m{)wU_C9W?-eow{QHjGrC3>xivMm?icw=bK7;lIJMe*aU4# ziV=AaOgTkp-Xi0dAr{dN&7PjXL=tuv@G|wSLCgOlZ1wC{?a=l-Q`>$4(+L&#)o0a( zA3-7ifk9cyu5D%m7e_hFIYB38Ztb8idbPViH9_5Jp<=Zt`HR+>h2HB=gK5ZGwWFd% z8vyvHF6vrm8ZWx4H|?{a4yJ>@0F1x6XQ*;&t;QMU#Q9VAII5$?wHmP5*6(rp@$fwX zJY{&_lJ6csOW!}>0$#!RdL1looZ(5m0whuQu*x>NcAItIvFf(z)}~G!y}`Ijvs_;2 znpydxLQPp;&KMj_#BoLecGRU4_x}C+K&`j59hdWB2dOuCi7D0Nrc1IUT$vns8#A`6 zor9gDema}w*(9Yy!3at?j!pY3aWFz-KDwJKl}`2xUaGh6P|>1_`^$U9;TYEB=HAiu zN7OG%wf;E6ISV}yzJ@oOYW4v65g`qfLP0%AM+XAD(EB=g((JH-+f==uk=@V9&Z(sK zW~tiO-n7a}(I#d4gWo)U@^Jjo=H|9oBZXJZc&S^)r*_GyC({>P1ehFl4AQIf1OPQ* z2|=zo@)=Z<4jo9wO*qB7cr6K*kxIJohfb4YwOB_It{&;2*_7uvB4Y1%$027XF3G+g=ApP z7L!WwjiO>amq~AVuvk9hyk`y`fJV&(RbdkneRHW^#b6_^QmPe{B;7vXsXUwkEY;*{ zLv- IcsIWD72a7P;Q#;t delta 858 zcmZuvO>fgc5cTZZv12<jYOx9IdzILk>BF zYYxF@q~r!iBz}#L{1KQjC2A|y+BfUjnVoqvv#Kr1UQ{aC8m>?8YJ;Y^@@~R(_2~GZ zAk5ENrz9*t-~+yQ-?j=b@3HhBJc<*1Uu;~HUKC6 z!CpS!CB@b#b3+x3yXwO<=!W8=3z}tSKbolEz51@n{j|;%6w|N#$jT2SrQ?D2 z5$>2GhT4oPEztxde8DkE)=uBB>O2nQS=bMnZ`F9@gJfvx>+&`Vxkqq^;4Z=b7VhCG zb9zE_&%N)XBF;mC%O(9?O2$CNHW_kO+6k=LMqBfSfDO#JUzzdOIY)bmh;jD7y6RT z3}GaOD73W1z%H2W^h>dB`;Zl4CBw-uHSG=<>Bzn@mnOdM7jhn%g+nnN^;D2k=s47` z?q8RTPsJd!WDrlI33lX4qsl}toSa42<}O-3qr_#w)iPKT=f~GL8B2+Pe1r>1dv$%E3GF|%*_d2SG diff --git a/osinaweb/billing/add/urls.py b/osinaweb/billing/add/urls.py index c29906c6..304ba24f 100644 --- a/osinaweb/billing/add/urls.py +++ b/osinaweb/billing/add/urls.py @@ -6,4 +6,5 @@ urlpatterns = [ path('product', views.add_product, name='addproduct'), path('service', views.add_service, name='addservice'), path('order', views.add_order, name='addorder'), + path('invoice//', views.add_invoice_pdf, name='addinvoice'), ] diff --git a/osinaweb/billing/add/views.py b/osinaweb/billing/add/views.py index 48cff91f..29dfe06c 100644 --- a/osinaweb/billing/add/views.py +++ b/osinaweb/billing/add/views.py @@ -4,6 +4,8 @@ from billing.models import * from django.http import JsonResponse, HttpResponse from django.template.loader import get_template from weasyprint import HTML +from django.conf import settings +import os def add_product (request, *args, **kwargs): @@ -36,14 +38,61 @@ def add_product (request, *args, **kwargs): def add_service (request, *args, **kwargs): - context = { + item_types = ProjectType.objects.all().order_by('name') + customers = CustomerProfile.objects.all().order_by('user__first_name') + if request.method == 'POST': + title = request.POST.get('title') + description = request.POST.get('description') + customer_id = request.POST.get('customer') + customer = get_object_or_404(CustomerProfile, id=customer_id) + + item_type_id = request.POST.get('item_type') + item_type = get_object_or_404(ProjectType, id=item_type_id) + + amount = request.POST.get('amount') + recurring = request.POST.get('recurring') + + Item.objects.create( + type='Service', + title=title, + description = description, + customer = customer, + item_type = item_type, + amount = amount, + recurring = recurring, + ) + return redirect('items') + context = { + 'item_types' : item_types, + 'customers' : customers } return render(request, 'add_templates/add-service.html', context) def add_order (request, *args, **kwargs): customers = CustomerProfile.objects.all().order_by('-id') + if request.method == 'POST': + customer_id = request.POST.get('customer') + customer = get_object_or_404(CustomerProfile, id=customer_id) + + status = request.POST.get('status') + + customer_id = request.POST.get('customer') + customer = get_object_or_404(CustomerProfile, id=customer_id) + + selected_items = request.POST.getlist('items') + + order = Order.objects.create( + customer=customer, + status=status + ) + + for item_id in selected_items: + item = Item.objects.get(id=item_id) + OrderItem.objects.create(order=order, item=item, purchased_at=datetime.now()) + return redirect('orders') + context = { 'customers': customers, @@ -52,12 +101,35 @@ def add_order (request, *args, **kwargs): return render(request, 'add_templates/add-order.html', context) -def add_invoice_pdf(request): + +def add_invoice_pdf(request, order_id): + order = get_object_or_404(Order, id=order_id) + template = get_template('details_templates/invoice-details.html') - context = {} + context = {'order': order} html_string = template.render(context) + # Generate PDF pdf = HTML(string=html_string).write_pdf() + + invoice = Invoice.objects.create( + invoice_number='111', + order=order, + date_created=datetime.now(), + ) + + # Save PDF to a file + pdf_file_path = os.path.join(settings.MEDIA_ROOT, f'invoice_{invoice.id}.pdf') + with open(pdf_file_path, 'wb') as pdf_file: + pdf_file.write(pdf) + + # Associate PDF file path with the Invoice object + invoice.pdf = pdf_file_path + invoice.save() + + # Return PDF response = HttpResponse(pdf, content_type='application/pdf') response['Content-Disposition'] = 'attachment; filename="my_pdf.pdf"' - return response \ No newline at end of file + + return response + diff --git a/osinaweb/billing/migrations/0028_remove_order_due_date.py b/osinaweb/billing/migrations/0028_remove_order_due_date.py new file mode 100644 index 00000000..4dba5ca4 --- /dev/null +++ b/osinaweb/billing/migrations/0028_remove_order_due_date.py @@ -0,0 +1,17 @@ +# Generated by Django 4.2.5 on 2024-04-13 09:41 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('billing', '0027_item_type'), + ] + + operations = [ + migrations.RemoveField( + model_name='order', + name='due_date', + ), + ] diff --git a/osinaweb/billing/migrations/0029_invoice_pdf.py b/osinaweb/billing/migrations/0029_invoice_pdf.py new file mode 100644 index 00000000..8850af53 --- /dev/null +++ b/osinaweb/billing/migrations/0029_invoice_pdf.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.5 on 2024-04-13 10:19 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('billing', '0028_remove_order_due_date'), + ] + + operations = [ + migrations.AddField( + model_name='invoice', + name='pdf', + field=models.FileField(blank=True, null=True, upload_to=''), + ), + ] diff --git a/osinaweb/billing/migrations/0030_alter_invoice_order.py b/osinaweb/billing/migrations/0030_alter_invoice_order.py new file mode 100644 index 00000000..6af90a6a --- /dev/null +++ b/osinaweb/billing/migrations/0030_alter_invoice_order.py @@ -0,0 +1,19 @@ +# Generated by Django 4.2.5 on 2024-04-13 10:25 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('billing', '0029_invoice_pdf'), + ] + + operations = [ + migrations.AlterField( + model_name='invoice', + name='order', + field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.SET_NULL, to='billing.order'), + ), + ] diff --git a/osinaweb/billing/migrations/0031_alter_invoice_invoice_number.py b/osinaweb/billing/migrations/0031_alter_invoice_invoice_number.py new file mode 100644 index 00000000..3890eb47 --- /dev/null +++ b/osinaweb/billing/migrations/0031_alter_invoice_invoice_number.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.5 on 2024-04-13 10:26 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('billing', '0030_alter_invoice_order'), + ] + + operations = [ + migrations.AlterField( + model_name='invoice', + name='invoice_number', + field=models.CharField(max_length=100, null=True), + ), + ] diff --git a/osinaweb/billing/migrations/__pycache__/0028_remove_order_due_date.cpython-310.pyc b/osinaweb/billing/migrations/__pycache__/0028_remove_order_due_date.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9010c15bb6c967a2ba197d2b0d04f9749f1f24e1 GIT binary patch literal 567 zcmY*XJx?4l5VgI#$Fkw8N|7o`w+%)#Nf9B62pT@5oYHJ#?cGdHKJ4{oy$8A`4Yd3a z{*qfN{sKi{ya$4eG^2Ur@$)>}ZgaC>WT)d#zYjTM_Yu6el)xdm|3U#6aKkLGIA_NU z1SB^M66AAnom2wSF)OnN>SHAjh1IjJ?zL9;&pn|$b>Mg7TG^(jBhBU^r zaxLU)C@2*QrKn+Hkn#owR8hs~d{P5u?T6c*@8V!WPwfLg%j&<9# zK7_}=@|VZXOSIY`(ws|_KhR(Fu9f53X#4r3ZX-DNx}Q2Lo!3n*8@w74nAgqBt%_GT zkuOr^+igk`{Y`blC~6R_UiI#_%PyfwM&y2nLe4~zKBbx9f~WuTr(yN1Ov3u=oL!g< b(uVq*h*cH|LjHYqKL_+Vn2!&)AwDM0_LZ3* literal 0 HcmV?d00001 diff --git a/osinaweb/billing/migrations/__pycache__/0029_invoice_pdf.cpython-310.pyc b/osinaweb/billing/migrations/__pycache__/0029_invoice_pdf.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a7c3c73899670d2e8d192fd3118209f4c297b6b0 GIT binary patch literal 648 zcmYjPO>fjN5cNm0n~f+!902vi3286&iW5i(6$zCKltbYXAz9g-*_F4B9pa=_&v5OT z-@sq;l@osf36*hnQ9IF$=J}20Wybag2PGp@Uk=wlIAgyOxN8}KWAgBf0x;l~HN4`D zs03&47zmKx8A#+?`At?5vNJZ%e^V`+i&!>h)78E4F2qUW0c}_%>aG<8j>*G<0xIT&n$&)a~skTGvax-;1WT9JNbq{+X;5r6Y3L-SG!HUrq{+o(s&>q$$wo@vqk^_ literal 0 HcmV?d00001 diff --git a/osinaweb/billing/migrations/__pycache__/0030_alter_invoice_order.cpython-310.pyc b/osinaweb/billing/migrations/__pycache__/0030_alter_invoice_order.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a783736f4b50082dc499684fa93ee927f6dfdc92 GIT binary patch literal 746 zcmYjPO^?$s5Vf6;reQ0skXVW3!nK#Af(u9pEfOD>(mk|$iG-}Qo>mTyUE-A0B5rWq zAA^@{`~5WXAI{W;99(uAd){*S{zszdgCTLL?`+ZH6F-po-MA zpfxKP^_;1o2;UJAi10fRA*Cr7P3iwv6-C$2#WEug@;>&0sn{|8~xKQtuazmpzz8G3?tTia7 zT?bs3HDHLxXe~jB*?8m<-szmXlyi*RDZujq=bv_^^0A%?*n$?IR}yT)uv?eDQY|!Z zeU>Kh!st}P!XR{-i$zuHjd4sYUD7=Uy>!X^&4SO)rc;-iE$j{cL7HRC(81rY`I&{r z=1@xofKFUM{u=DZ)@<{6sbu|lT5df#wX$8AIyYA8GS_h49r~)hcn-^aZ%}^wJM+op z>4ca5^*82r_GR0P#?Q_Gx4n;$5Eg`2VZPDGTy^*3*bVzKnOJsa^aeb<5wm_^ jvg@{+2fjU@`?k^k^awSVyy$IziPKDMjBv;jdKCNz)Wy|` literal 0 HcmV?d00001 diff --git a/osinaweb/billing/migrations/__pycache__/0031_alter_invoice_invoice_number.cpython-310.pyc b/osinaweb/billing/migrations/__pycache__/0031_alter_invoice_invoice_number.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30963540d698da138f403d28ca3e93b97f2cdaf9 GIT binary patch literal 671 zcmZ8fJ#W-N5Zw>^?6VStC<3CQLb~RBh!&wB5Ht{qKw}B5d^ZzkkM-JkeT39NnV!GE zU)q-H{sIyTv-U*^tTdx}GoyVoZ@1as&lsKUhx;c#IAgy8xOpN1hh**{IbgsIt9ij| zQ3%dnF%TfXF_6gD@~bQ)M8|9vZ>g8fgwJYSb!D#`>-?l{0F7IP(#?|)I3#m(a>xn} ztPsE}UPz4AaUj6SI)Mmcm|O@*E+o}bNQr3br*Ezph%Q-bW3;XOy~X13LY1b+PHFqO z(JNF<2iW;!2mP(9yxr7G?6yGc?}m}fFUp{;`cog-jWIJxYlP92Eo-D)@bQU814lGK zs)oE$K2wVNHU=r)Q|i;EG@&;jz!oi_U1@ZkASRzZ3&Xt(w{$Wjrq55y5&NuZai`i( z)*VoFaKFFj?;Un7$66ai+VmXr7wA6rO`9K=M%NEsmu&!Vo$gmnoi|R~GPig(1h6h` z)r`qAT;@Bm^6NLsNw!D-$@Z^I^Y*+8KVm}W?vP8FkkMrn3oiH`kN%{WL;YwL`RPbF hhvl&Hu;x&_UTKW((mg(XGK%+ Add Order + -
+ {% csrf_token %}
-
-
- - -
-
-
-
- - -
@@ -64,7 +50,7 @@
diff --git a/osinaweb/billing/templates/add_templates/add-product.html b/osinaweb/billing/templates/add_templates/add-product.html index 00551e91..aaaacfe8 100644 --- a/osinaweb/billing/templates/add_templates/add-product.html +++ b/osinaweb/billing/templates/add_templates/add-product.html @@ -49,7 +49,7 @@
diff --git a/osinaweb/billing/templates/add_templates/add-service.html b/osinaweb/billing/templates/add_templates/add-service.html index 8635a7e8..a05f106c 100644 --- a/osinaweb/billing/templates/add_templates/add-service.html +++ b/osinaweb/billing/templates/add_templates/add-service.html @@ -8,19 +8,19 @@ Add Service - + {% csrf_token %}
-
-
@@ -28,35 +28,39 @@
-
-
-
-
diff --git a/osinaweb/billing/templates/details_templates/invoice-details.html b/osinaweb/billing/templates/details_templates/invoice-details.html index 3d84361c..cd9c52f3 100644 --- a/osinaweb/billing/templates/details_templates/invoice-details.html +++ b/osinaweb/billing/templates/details_templates/invoice-details.html @@ -16,7 +16,7 @@
-

Bill To: Winabig

+

Bill To: {{order.customer}}

Customer Details: 036466464

diff --git a/osinaweb/billing/templates/listing_pages/invoices.html b/osinaweb/billing/templates/listing_pages/invoices.html index a628b223..8c2a6720 100644 --- a/osinaweb/billing/templates/listing_pages/invoices.html +++ b/osinaweb/billing/templates/listing_pages/invoices.html @@ -79,10 +79,10 @@
- + + + +
diff --git a/osinaweb/billing/templates/listing_pages/items.html b/osinaweb/billing/templates/listing_pages/items.html index 1c1cee9d..2b18a490 100644 --- a/osinaweb/billing/templates/listing_pages/items.html +++ b/osinaweb/billing/templates/listing_pages/items.html @@ -126,22 +126,24 @@ + {% for service in services %} -

Item 2

+

{{service.title}}

-

Salim

+

{{service.customer.user.first_name}} {{service.customer.user.last_name}}

-

Type

+

{{service.item_type}}

-

222

+

${{service.amount}}

+ @@ -162,6 +164,7 @@
+ {% endfor %} diff --git a/osinaweb/billing/templates/listing_pages/orders.html b/osinaweb/billing/templates/listing_pages/orders.html index d76197d9..128aba41 100644 --- a/osinaweb/billing/templates/listing_pages/orders.html +++ b/osinaweb/billing/templates/listing_pages/orders.html @@ -42,7 +42,7 @@ - Due Date + Cart Total @@ -56,28 +56,51 @@ + + {% for order in orders %} -

1

+

{{order.order_id}}

-

Nataly

+

{{order.customer.user.first_name}} {{order.customer.user.last_name}}

-

10-2-2014

+

${{order.get_cart_total}}

- -

Paid

+ +

{{order.status}}

- + + +
+ +
+
+ + + {% if order.status == 'Completed' and not order.invoice %} + + + + + + + {% endif %} + + {% if order.invoice %} + + + + + {% endif %} +
@@ -90,6 +113,7 @@
+ {% endfor %}
diff --git a/osinaweb/billing/urls.py b/osinaweb/billing/urls.py index 36de696f..67d72391 100644 --- a/osinaweb/billing/urls.py +++ b/osinaweb/billing/urls.py @@ -12,7 +12,7 @@ urlpatterns = [ path('invoices', views.invoices, name='invoices'), # DETAILS - path('invoice-details//', views.invoice_details, name='invoicedetails'), + path('invoice-details//', views.invoice_details, name='invoicedetails'), path('fetch-customer-items//', views.fetch_customer_items, name='fetch_customer_items'), diff --git a/osinaweb/billing/views.py b/osinaweb/billing/views.py index 918ad6eb..7c9bfb66 100644 --- a/osinaweb/billing/views.py +++ b/osinaweb/billing/views.py @@ -8,23 +8,26 @@ from weasyprint import HTML # LISTING -def items (request, *args, **kwargs): +def items(request, *args, **kwargs): products = Item.objects.filter(type='Product').order_by('-id') + services = Item.objects.filter(type='Service').order_by('-id') context = { 'products': products, + 'services': services, } return render(request, 'listing_pages/items.html', context) -def orders (request, *args, **kwargs): +def orders(request, *args, **kwargs): + orders = Order.objects.all().order_by('-id') context = { - + 'orders': orders, } return render(request, 'listing_pages/orders.html', context) -def invoices (request, *args, **kwargs): +def invoices(request, *args, **kwargs): invoices = Invoice.objects.all().order_by('-id') context = { @@ -35,11 +38,11 @@ def invoices (request, *args, **kwargs): #DETAILS -def invoice_details (request, invoice_id): - invoice = get_object_or_404(Invoice, id=invoice_id) +def invoice_details(request, order_id): + order = get_object_or_404(Order, id=order_id) context = { - 'invoice' : invoice, + 'order' : order, } return render(request, 'invoice-details.html', context) diff --git a/osinaweb/db.sqlite3 b/osinaweb/db.sqlite3 index 5cccc217142a0e730a52bd40e1fb4e57da4947e6..1f4e9d839d6e9f67360f94d383b6e9e3194a0d05 100644 GIT binary patch delta 13026 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 diff --git a/osinaweb/osinacore/templates/add-edit-main.html b/osinaweb/osinacore/templates/add-edit-main.html index 2433a634..d7543513 100644 --- a/osinaweb/osinacore/templates/add-edit-main.html +++ b/osinaweb/osinacore/templates/add-edit-main.html @@ -46,7 +46,9 @@ class="w-full bg-transparent border border-white border-opacity-10 py-2 px-3 text-white outline-none rounded-md" placeholder="Search...">
- + + +
@@ -60,7 +62,9 @@