Abrechnung

This commit is contained in:
holger.trampe 2020-10-01 12:50:04 +02:00
parent 4e3f916ffb
commit 8b106c569c
6 changed files with 56 additions and 26 deletions

View File

@ -59,13 +59,12 @@ class AgencyBillPlan(forms.ModelForm):
"agb" : "AGB akzeptieren", "agb" : "AGB akzeptieren",
"contract" : "Auftragsdatenverarbeitung akzeptieren" "contract" : "Auftragsdatenverarbeitung akzeptieren"
} }
fields = ['name','inhaber','agency_email', 'phone', 'street', 'plz', 'city', 'paymentplan', 'agb', 'contract', 'lexofficeid', 'firstbillid'] fields = ['name','inhaber','agency_email', 'phone', 'street', 'plz', 'city', 'paymentplan', 'agb', 'contract', 'lexofficeid']
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(AgencyBillPlan, self).__init__(*args, **kwargs) super(AgencyBillPlan, self).__init__(*args, **kwargs)
self.fields['paymentplan'] = forms.CharField(initial=6, required=True, widget=forms.HiddenInput()) self.fields['paymentplan'] = forms.CharField(initial=6, required=True, widget=forms.HiddenInput())
self.fields['lexofficeid'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) self.fields['lexofficeid'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput())
self.fields['firstbillid'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput())
self.fields['name'] = forms.CharField(required=True) self.fields['name'] = forms.CharField(required=True)

View File

@ -35,15 +35,15 @@
<h5 class="card-title">Ihre Zahlungsweise</h5> <h5 class="card-title">Ihre Zahlungsweise</h5>
{% getNextMonth request.user.profile.agency as nextMonth %} {% getNextMonth request.user.profile.agency as nextMonth %}
{{request.user.profile.agency.firstbillid}}
Ihre Agentur wurde am {{ request.user.profile.agency.registerdate|date:"d.m.Y" }} registriert. Ihre Agentur wurde am {{ request.user.profile.agency.registerdate|date:"d.m.Y" }} registriert.
{% if paymentplan == None and request.user.profile.agency.firstbillid == None %} {% if paymentplan == "" or request.user.profile.agency.lexofficeid == "" %}
Es wurde noch keine Zahlungsweise ausgewählt. Sie können die Digitale Agentur bis zum {{nextMonth|date:"d.m.Y"}} kostenlos nutzen. Möchten Sie die Digitale Agentur auch nach diesem Zeitraum nutzen, wählen Sie bitte einen Zahlplan aus. Es wurde noch keine Zahlungsweise ausgewählt. Sie können die Digitale Agentur bis zum {{nextMonth|date:"d.m.Y"}} kostenlos nutzen. Möchten Sie die Digitale Agentur auch nach diesem Zeitraum nutzen, wählen Sie bitte einen Zahlplan aus.
<br /> <br />
<a href="{% url 'ag-billplanupdate' request.user.profile.agency.pk %}" class="btn btn-primary btn mt-2" onclick="">Zahlplan jetzt auswählen</a> <a href="{% url 'ag-billplanupdate' request.user.profile.agency.pk %}" class="btn btn-primary btn mt-2" onclick="">Zahlplan jetzt auswählen</a>
{% else %} {% else %}
Zahlungsweise: TODO <br />Ausgewählter Zahlungsplan: {{request.user.profile.agency.paymentplan}} Monat{% if request.user.profile.agency.paymentplan > 1 %}e{% endif %} <br />
<a href="#" class="btn btn-primary btn mt-2" onclick="">Zahlplan abbestellen</a>
{% endif %} {% endif %}
<hr> <hr>
<h5 class="card-title.">Fragen, Hilfe, Kündigung</h5> <h5 class="card-title.">Fragen, Hilfe, Kündigung</h5>
@ -72,7 +72,9 @@
<div class="card d-block mb-3"> <div class="card d-block mb-3">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">Rechnungen</h5> <h5 class="card-title">Rechnungen</h5>
{% for bill in bills %}
<a href="{{bill.lexid}}">Rechnung vom {{bill.billdate|date:"d.m.Y"}} (Nr. {{bill.billnumber}})</a><br />
{% endfor %}
</div> </div>
</div> </div>
</div> </div>

View File

@ -35,4 +35,6 @@ urlpatterns = [
path('abcatadd/', AbsenceReasonAddView.as_view(), name="abcat-add"), path('abcatadd/', AbsenceReasonAddView.as_view(), name="abcat-add"),
path('ag/billmail/update/<int:pk>', permission_required('users.agencyinfo')(BillMailUpdate.as_view()), name='ag-billmailupdate'), path('ag/billmail/update/<int:pk>', permission_required('users.agencyinfo')(BillMailUpdate.as_view()), name='ag-billmailupdate'),
path('ag/billplan/<int:pk>', permission_required('users.agencyinfo')(BillPlanUpdate.as_view()), name='ag-billplanupdate'), path('ag/billplan/<int:pk>', permission_required('users.agencyinfo')(BillPlanUpdate.as_view()), name='ag-billplanupdate'),
#path('ag/getbill/<slug:billid>', permission_required('users.agencyinfo')(GetBill), name='ag-getbill'),
] ]

View File

@ -15,7 +15,7 @@ from django.template.loader import render_to_string
from users.usersforms import UsersPermForm from users.usersforms import UsersPermForm
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import CreateView from django.views.generic import CreateView
from users.models import Profile, UserNotifications, UserTime from users.models import Profile, UserNotifications, UserTime, AgencyBills
from areas.models import Areas from areas.models import Areas
from tasks.models import Tasks from tasks.models import Tasks
import webcolors import webcolors
@ -257,9 +257,12 @@ def DASettings(request):
json_data = json.dumps(lexdata) json_data = json.dumps(lexdata)
r = requests.get("https://api.lexoffice.io/v1/invoices/ad75e041-1657-43a3-b3cb-7349aa00a94f", data=json_data, headers=headers)
# Alle Rechnungen der Agentur abfragen
context.update({"bills" : AgencyBills.objects.filter(agency=request.user.profile.agency)})
#r = requests.get("https://api.lexoffice.io/v1/invoices/" + AgencyBills.objects.filter(agency=request.user.profile.agency)[0].lexid, data=json_data, headers=headers)
@ -1477,8 +1480,19 @@ class BillMailUpdate(UpdateView):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context.update({'active_link' : 'dasettings'}) context.update({'active_link' : 'dasettings'})
return context return context
'''
def getBill(request, billid):
if(request.method == "GET"):
Bill = AgencyBills.objects.get(billid=billid)
response = HttpResponse(content_type='text/pdf')
response['Content-Disposition'] = 'attachment; filename="RechnungPLATZHALTER.pdf"'
return response
else:
pass
'''
from dateutil.relativedelta import * from dateutil.relativedelta import *
class BillPlanUpdate(UpdateView): class BillPlanUpdate(UpdateView):
@ -1595,7 +1609,8 @@ class BillPlanUpdate(UpdateView):
# Response in JSON umwandeln # Response in JSON umwandeln
response_text = json.loads(r.text) response_text = json.loads(r.text)
# Rechnungsidee speichern # Rechnungsidee speichern
self.object.firstbillid = response_text["id"]
# HEADERS CURL # HEADERS CURL
headers = { headers = {
'Authorization': 'Bearer 8f9ba01f-9e84-42c7-9548-48c254f14c19', 'Authorization': 'Bearer 8f9ba01f-9e84-42c7-9548-48c254f14c19',
@ -1604,14 +1619,20 @@ class BillPlanUpdate(UpdateView):
} }
json_data = json.dumps(lexdata) json_data = json.dumps(lexdata)
newbill_id = response_text["id"]
if len(agency.lexofficeid) == 0:
# OrganizationId berechnen, wenn noch nicht gesetzt # OrganizationId berechnen, wenn noch nicht gesetzt
r = requests.get("https://api.lexoffice.io/v1/invoices/" + response_text["id"], data=json_data, headers=headers) r = requests.get("https://api.lexoffice.io/v1/invoices/" + response_text["id"], data=json_data, headers=headers)
response_text = json.loads(r.text) response_text = json.loads(r.text)
if len(agency.lexofficeid) == 0:
self.object.lexofficeid = response_text["organizationId"] self.object.lexofficeid = response_text["organizationId"]
newbill = AgencyBills(agency=agency, lexid=newbill_id, billtype="invoice", billnumber=response_text["voucherNumber"])
newbill.save()
self.object.save() self.object.save()
else: else:

View File

@ -1,5 +1,5 @@
from django.contrib import admin from django.contrib import admin
from .models import Profile, Agency, AgencyGroup, AgencyJob, AgencyNetwork, AgencyNetworkPreperation, UserTime, UserYearAbsenceInfo, UserNotifications from .models import Profile, Agency, AgencyGroup, AgencyJob, AgencyNetwork, AgencyNetworkPreperation, UserTime, UserYearAbsenceInfo, UserNotifications, AgencyBills
from .priomodel import Prio from .priomodel import Prio
from standards.models import StandardCommentRate, StandardComments from standards.models import StandardCommentRate, StandardComments
from django.contrib.auth.models import Permission from django.contrib.auth.models import Permission
@ -31,3 +31,4 @@ admin.site.register(FreeDays)
admin.site.register(UserYearAbsenceInfo) admin.site.register(UserYearAbsenceInfo)
admin.site.register(ChatRoom) admin.site.register(ChatRoom)
admin.site.register(UserNotifications) admin.site.register(UserNotifications)
admin.site.register(AgencyBills)

View File

@ -98,9 +98,6 @@ class Agency(models.Model):
# ID für die Verbindung mit Lexoffice # ID für die Verbindung mit Lexoffice
lexofficeid = models.CharField(default="", max_length=200, blank=True) lexofficeid = models.CharField(default="", max_length=200, blank=True)
# First Bill id to retrieve office-organization-id
firstbillid = models.CharField(default=None, max_length=200, blank=True, null=True)
# Bezahlplan 3,6,12 Monate # Bezahlplan 3,6,12 Monate
paymentplan = models.IntegerField(default=None, null=True, blank=True) paymentplan = models.IntegerField(default=None, null=True, blank=True)
@ -135,11 +132,6 @@ class Agency(models.Model):
vve = models.CharField(default="", max_length=200, blank=True) vve = models.CharField(default="", max_length=200, blank=True)
def __str__(self): def __str__(self):
return f'{self.name}' return f'{self.name}'
@ -154,6 +146,19 @@ class Agency(models.Model):
else: else:
return settings.MEDIA_URL + "ag_default.jpg" return settings.MEDIA_URL + "ag_default.jpg"
# Speichern der Rechnungs-ID von LexOffice
class AgencyBills(models.Model):
lexid = models.CharField(max_length=200, default="", null=True, blank=True)
agency = models.ForeignKey(Agency, on_delete=models.PROTECT)
billtype = models.CharField(default="", max_length=200)
billdate = models.DateField(default=timezone.now)
billnumber = models.CharField(default="", max_length=200)
# TODO: Rechnungsstatus dazu ob offen oder nicht
def __str__(self):
return f'{self.lexid}'
''' '''
Class AgencyJob Class AgencyJob