Skip to content
Snippets Groups Projects
Verified Commit 6a92e568 authored by Tom Teichler's avatar Tom Teichler :beers:
Browse files

Turn FiBu into AlekSIS app

parent 1634de60
No related branches found
No related tags found
1 merge request!2Turn FiBu into AlekSIS app
Showing
with 283 additions and 344 deletions
from django import forms
from django.utils import timezone
from material import Layout, Row, Fieldset
from django.utils.translation import ugettext_lazy as _
from .models import Booking, CostCenter, Account
class SimpleBookingForm(forms.ModelForm):
description = forms.CharField(label='Beschreibung – Was soll angeschafft werden?')
description = forms.CharField(label=_("Description – What should be purchased?"))
planned_amount = forms.IntegerField(
label='Erwarteter Betrag – Welcher Betrag ist erforderlich?', help_text="in Euro, ohne Komma")
justification = forms.CharField(label='Begründung – Begründe ggf. deinen Antrag.', required=False)
label=_("Expected amount - What amount is required?"), help_text=_("Without comma"))
justification = forms.CharField(label=_("Reason – If necessary, justify your request."), required=False)
layout = Layout(Row('description', 'planned_amount'), Row('justification'))
......@@ -29,7 +30,7 @@ class CheckBookingForm(forms.ModelForm):
class CompleteBookingForm(forms.ModelForm):
accounts = Account.objects.filter().order_by('cost_center', 'name')
account = forms.ModelChoiceField(queryset=accounts)
submission_date = forms.DateField(label='Bearbeitungsdatum', initial=timezone.now())
submission_date = forms.DateField(label=_("Submission date"), initial=timezone.now())
layout = Layout(Fieldset("Allgemeines",
Row('description', 'justification'),
......
from django.utils.translation import ugettext_lazy as _
MENUS = {
"NAV_MENU_CORE": [
{
"name": _("Financial Accounting"),
"url": "#",
"icon": "account_balance",
"root": True,
"validators": [
"menu_generator.validators.is_authenticated",
"aleksis.core.util.core_helpers.has_person",
],
"submenu": [
{
"name": _("My requests"),
"url": "fibu_index",
"icon": "person",
"validators": ["menu_generator.validators.is_authenticated"],
},
{
"name": _("Bookings"),
"url": "fibu_bookings",
"icon": "euro",
"validators": ["menu_generator.validators.is_authenticated"],
},
{
"name": _("Cost centers"),
"url": "fibu_cost_centers",
"icon": "business",
"validators": ["menu_generator.validators.is_authenticated"],
},
{
"name": _("Accounts"),
"url": "fibu_accounts",
"icon": "account_balance_wallet",
"validators": ["menu_generator.validators.is_authenticated"],
},
{
"name": _("Reports"),
"url": "fibu_reports",
"icon": "assessment",
"validators": ["menu_generator.validators.is_authenticated"],
},
],
}
]
}
# Generated by Django 2.2.8 on 2019-12-27 06:08
# Generated by Django 3.0.2 on 2020-02-02 22:14
import datetime
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
......@@ -18,13 +19,15 @@ class Migration(migrations.Migration):
name='Account',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(default='', max_length=20)),
('income', models.BooleanField(default=False)),
('budget', models.DecimalField(decimal_places=2, default=0.0, max_digits=9)),
('name', models.CharField(max_length=20, verbose_name='Booking account')),
('income', models.BooleanField(default=False, verbose_name='Income account')),
('budget', models.IntegerField(default=0, verbose_name='Budget')),
('saldo', models.DecimalField(decimal_places=2, default=0.0, max_digits=9)),
('rest', models.DecimalField(decimal_places=2, default=0.0, max_digits=9)),
],
options={
'verbose_name': 'Booking account',
'verbose_name_plural': 'Booking accounts',
'permissions': [('manage_account', 'Can manage account')],
},
),
......@@ -32,11 +35,12 @@ class Migration(migrations.Migration):
name='CostCenter',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=30)),
('year', models.IntegerField(choices=[(2020, '2020'), (2021, '2021'), (2022, '2022'), (2023, '2023')],
default=2019, verbose_name='Jahr')),
('name', models.CharField(max_length=30, verbose_name='Cost center')),
('year', models.IntegerField(choices=[(2020, '2020'), (2021, '2021'), (2022, '2022'), (2023, '2023')], default=2020, verbose_name='Year')),
],
options={
'verbose_name': 'Cost center',
'verbose_name_plural': 'Cost centers',
'permissions': [('manage_costcenter', 'Can manage costcenter')],
},
),
......@@ -44,29 +48,31 @@ class Migration(migrations.Migration):
name='Booking',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('invoice_date', models.DateField(default='2000-12-31')),
('invoice_number', models.CharField(default='0', max_length=20)),
('firma', models.CharField(default='', max_length=30)),
('description', models.CharField(max_length=50)),
('amount', models.DecimalField(decimal_places=2, default=0.0, max_digits=9)),
('planned_amount', models.IntegerField()),
('submission_date', models.DateField(default='2000-12-31')),
('justification', models.CharField(blank=True, max_length=2000, null=True)),
('payout_number', models.IntegerField(default=0)),
('booking_date', models.DateField(default='2000-12-31')),
('maturity', models.DateField(default='2000-12-31')),
('upload', models.FileField(blank=True, default=None, null=True, upload_to='uploads/fibu/%Y/')),
('status', models.IntegerField(choices=[(0, 'beantragt'), (1, 'bewilligt'), (2, 'abgelehnt'), (3, 'bestellt'), (4, 'eingereicht'), (5, 'bezahlt')], default=0, verbose_name='Status')),
('account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='fibu.Account')),
('contact', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='bookings', to=settings.AUTH_USER_MODEL, verbose_name='Erstellt von')),
('description', models.CharField(max_length=50, verbose_name='Description')),
('justification', models.CharField(blank=True, max_length=2000, null=True, verbose_name='Reason')),
('planned_amount', models.IntegerField(verbose_name='Planned amount')),
('invoice_date', models.DateField(blank=True, null=True, verbose_name='Date of invoice')),
('invoice_number', models.CharField(blank=True, max_length=20, null=True, verbose_name='Bill number')),
('firma', models.CharField(blank=True, max_length=30, null=True, verbose_name='Company')),
('amount', models.DecimalField(decimal_places=2, default=0.0, max_digits=9, verbose_name='Amount')),
('payout_number', models.IntegerField(blank=True, null=True, verbose_name='Payout number')),
('submission_date', models.DateField(blank=True, null=True, verbose_name='Submission date')),
('booking_date', models.DateField(default=datetime.date.today, verbose_name='Booking date')),
('maturity', models.DateField(blank=True, null=True, verbose_name='Maturity')),
('upload', models.FileField(blank=True, default=None, null=True, upload_to='uploads/fibu/%Y/', verbose_name='Scan of invoice')),
('status', models.IntegerField(choices=[(0, 'requested'), (1, 'rejected'), (2, 'accepted'), (3, 'ordered'), (4, 'submitted'), (5, 'paid')], default=0, verbose_name='Status')),
('account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='fibu.Account', verbose_name='Booking account')),
('contact', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='bookings', to=settings.AUTH_USER_MODEL, verbose_name='Created by')),
],
options={
'permissions': [('manage_booking', 'Can manage bookings'), ('request_booking', 'Can request a booking')],
'verbose_name': 'Booking',
'verbose_name_plural': 'Bookings',
'permissions': [('manage_booking', 'Can manage bookings'), ('request_booking', 'Can request a booking'), ('check_booking', 'Can check bookings')],
},
),
migrations.AddField(
model_name='account',
name='costcenter',
field=models.ForeignKey(default='', on_delete=django.db.models.deletion.CASCADE, to='fibu.CostCenter'),
name='cost_center',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='fibu.CostCenter', verbose_name='Cost center'),
),
]
# Generated by Django 2.2.6 on 2019-12-28 12:57
import datetime
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('fibu', '0001_initial'),
]
operations = [
migrations.AlterModelOptions(
name='account',
options={'permissions': [('manage_account', 'Can manage account')], 'verbose_name': 'Buchungskonto',
'verbose_name_plural': 'Buchungskonten'},
),
migrations.AlterModelOptions(
name='booking',
options={
'permissions': [('manage_booking', 'Can manage bookings'), ('request_booking', 'Can request a booking'),
('check_booking', 'Can check bookings')], 'verbose_name': 'Buchung',
'verbose_name_plural': 'Buchungen'},
),
migrations.AlterModelOptions(
name='costcenter',
options={'permissions': [('manage_costcenter', 'Can manage costcenter')], 'verbose_name': 'Kostenstelle',
'verbose_name_plural': 'Kostenstellen'},
),
migrations.AlterField(
model_name='account',
name='budget',
field=models.DecimalField(decimal_places=2, default=0.0, max_digits=9, verbose_name='Budget'),
),
migrations.AlterField(
model_name='account',
name='costcenter',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='fibu.CostCenter',
verbose_name='Kostenstelle'),
),
migrations.AlterField(
model_name='account',
name='income',
field=models.BooleanField(default=False, verbose_name='Einnahmekonto'),
),
migrations.AlterField(
model_name='account',
name='name',
field=models.CharField(max_length=20, verbose_name='Buchungskonto'),
),
migrations.AlterField(
model_name='booking',
name='booking_date',
field=models.DateField(default=datetime.date.today),
),
migrations.AlterField(
model_name='booking',
name='invoice_date',
field=models.DateField(default=datetime.date.today),
),
migrations.AlterField(
model_name='booking',
name='maturity',
field=models.DateField(default=datetime.date.today),
),
migrations.AlterField(
model_name='booking',
name='status',
field=models.IntegerField(
choices=[(0, 'beantragt'), (1, 'abgelehnt'), (2, 'bewilligt'), (3, 'bestellt'), (4, 'eingereicht'),
(5, 'bezahlt')], default=0, verbose_name='Status'),
),
migrations.AlterField(
model_name='booking',
name='submission_date',
field=models.DateField(default=datetime.date.today),
),
migrations.AlterField(
model_name='costcenter',
name='name',
field=models.CharField(max_length=30, verbose_name='Kostenstelle'),
),
migrations.AlterField(
model_name='costcenter',
name='year',
field=models.IntegerField(choices=[(2019, '2019'), (2020, '2020'), (2021, '2021'), (2022, '2022')],
default=2019, verbose_name='Jahr'),
),
]
# Generated by Django 2.2.8 on 2019-12-28 14:53
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('fibu', '0002_auto_20191228_1357'),
]
operations = [
migrations.AlterField(
model_name='account',
name='budget',
field=models.IntegerField(default=0, verbose_name='Budget'),
),
]
......@@ -3,6 +3,8 @@ from django.db import models
from django.contrib.auth.models import User
from datetime import date
from django.utils.translation import ugettext_lazy as _
current_year = timezone.now().year
YEARS = [(x, str(x)) for x in range(current_year, current_year + 4)]
......@@ -17,40 +19,38 @@ class Status:
status_list = [
Status(name='beantragt', style_class='red'),
Status(name='abgelehnt', style_class='black'),
Status(name='bewilligt', style_class='orange'),
Status(name='bestellt', style_class='yellow darken-1'),
Status(name='eingereicht', style_class='blue'),
Status(name='bezahlt', style_class='green'),
Status(name=_("requested"), style_class='red'),
Status(name=_("rejected"), style_class='black'),
Status(name=_("accepted"), style_class='orange'),
Status(name=_("ordered"), style_class='yellow darken-1'),
Status(name=_("submitted"), style_class='blue'),
Status(name=_("paid"), style_class='green'),
]
status_choices = [(x, val.name) for x, val in enumerate(status_list)]
class CostCenter(models.Model):
# Kostenstellen z.B. Schulträger-konsumtiv, Schulträger-investiv, Elternverein, ...
name = models.CharField(max_length=30, blank=False, verbose_name="Kostenstelle")
year = models.IntegerField(default=timezone.now().year, choices=YEARS, blank=False, verbose_name="Jahr")
name = models.CharField(max_length=30, blank=False, verbose_name=_("Cost center"))
year = models.IntegerField(default=timezone.now().year, choices=YEARS, blank=False, verbose_name=_("Year"))
def __str__(self):
return self.name
class Meta:
verbose_name = "Kostenstelle"
verbose_name_plural = "Kostenstellen"
verbose_name = _("Cost center")
verbose_name_plural = _("Cost centers")
permissions = [
('manage_costcenter', 'Can manage costcenter'),
('manage_costcenter', _("Can manage costcenter")),
]
class Account(models.Model):
# Buchungskonten, z.B. Fachschaften, Sekretariat, Schulleiter, Kopieren, Tafelnutzung
name = models.CharField(max_length=20, blank=False, verbose_name="Buchungskonto")
cost_center = models.ForeignKey(to=CostCenter, on_delete=models.CASCADE, blank=False, verbose_name="Kostenstelle")
name = models.CharField(max_length=20, blank=False, verbose_name=_("Booking account"))
cost_center = models.ForeignKey(to=CostCenter, on_delete=models.CASCADE, blank=False, verbose_name=_("Cost center"))
income = models.BooleanField(default=False,
verbose_name="Einnahmekonto") # True, wenn es sich um ein Einnahmekonto handelt
budget = models.IntegerField(default=0, verbose_name="Budget")
verbose_name=_("Income account"))
budget = models.IntegerField(default=0, verbose_name=_("Budget"))
saldo = models.DecimalField(max_digits=9, decimal_places=2, default=0.00)
rest = models.DecimalField(max_digits=9, decimal_places=2, default=0.00)
......@@ -58,39 +58,39 @@ class Account(models.Model):
return "{}: {}".format(self.cost_center, self.name)
class Meta:
verbose_name = "Buchungskonto"
verbose_name_plural = "Buchungskonten"
verbose_name = _("Booking account")
verbose_name_plural = _("Booking accounts")
permissions = [
('manage_account', 'Can manage account'),
('manage_account', _("Can manage account")),
]
class Booking(models.Model):
# General information
account = models.ForeignKey(to=Account, on_delete=models.SET_NULL, blank=True, null=True,
verbose_name="Buchungskonto")
verbose_name=_("Booking account"))
contact = models.ForeignKey(to=User, related_name='bookings', on_delete=models.SET_NULL
, verbose_name="Erstellt von", blank=True, null=True)
description = models.CharField(max_length=50, verbose_name="Beschreibung")
justification = models.CharField(max_length=2000, blank=True, null=True, verbose_name="Begründung")
planned_amount = models.IntegerField(verbose_name="Erwarteter Betrag", help_text="ganze Euro")
, verbose_name=_("Created by"), blank=True, null=True)
description = models.CharField(max_length=50, verbose_name=_("Description"))
justification = models.CharField(max_length=2000, blank=True, null=True, verbose_name=_("Reason"))
planned_amount = models.IntegerField(verbose_name=_("Planned amount"))
# Details
invoice_date = models.DateField(blank=True, null=True, verbose_name="Rechnungsdatum")
invoice_number = models.CharField(max_length=20, blank=True, null=True, verbose_name="Rechnungsnummer")
firma = models.CharField(max_length=30, blank=True, null=True, verbose_name="Firma")
amount = models.DecimalField(max_digits=9, decimal_places=2, default=0.00, verbose_name="Betrag")
payout_number = models.IntegerField(blank=True, null=True, verbose_name="Auszahlungsnummer")
invoice_date = models.DateField(blank=True, null=True, verbose_name=_("Date of invoice"))
invoice_number = models.CharField(max_length=20, blank=True, null=True, verbose_name=_("Bill number"))
firma = models.CharField(max_length=30, blank=True, null=True, verbose_name=_("Company"))
amount = models.DecimalField(max_digits=9, decimal_places=2, default=0.00, verbose_name=_("Amount"))
payout_number = models.IntegerField(blank=True, null=True, verbose_name=_("Payout number"))
submission_date = models.DateField(blank=True, null=True, verbose_name="Bearbeitungsdatum")
booking_date = models.DateField(default=date.today, verbose_name="Buchungsdatum")
maturity = models.DateField(blank=True, null=True, verbose_name="Fälligkeit")
submission_date = models.DateField(blank=True, null=True, verbose_name=_("Submission date"))
booking_date = models.DateField(default=date.today, verbose_name=_("Booking date"))
maturity = models.DateField(blank=True, null=True, verbose_name=_("Maturity"))
upload = models.FileField(upload_to='uploads/fibu/%Y/', default=None, blank=True, null=True,
verbose_name="Scan der Rechnung")
verbose_name=_("Scan of invoice"))
# Meta information
status = models.IntegerField(default=0, choices=status_choices, verbose_name="Status")
status = models.IntegerField(default=0, choices=status_choices, verbose_name=_("Status"))
def get_status(self):
return status_list[self.status]
......@@ -99,10 +99,10 @@ class Booking(models.Model):
return "{} ({})".format(self.description, self.account)
class Meta:
verbose_name = "Buchung"
verbose_name_plural = "Buchungen"
verbose_name = _("Booking")
verbose_name_plural = _("Bookings")
permissions = [
('manage_booking', 'Can manage bookings'),
('request_booking', 'Can request a booking'),
('check_booking', 'Can check bookings'),
('manage_booking', _("Can manage bookings")),
('request_booking', _("Can request a booking")),
('check_booking', _("Can check bookings")),
]
{% include 'partials/header.html' %}
{% load material_form %}
{% extends 'core/base.html' %}
{% load material_form i18n %}
<main>
<h4>Buchungskonto bearbeiten</h4>
{% block content %}
<h4>{% blocktrans %}Edit booking account{% endblocktrans %}</h4>
<form method="POST" action="">
{% csrf_token %}
......@@ -11,13 +11,11 @@
<span class="right">
<button type="submit" class="waves-effect waves-light btn green">
<i class="material-icons left">save</i> Änderungen übernehmen
<i class="material-icons left">save</i>{% blocktrans %}Save changes{% endblocktrans %}
</button>
<a href="{% url 'fibu_accounts' %}" class="waves-effect waves-light btn red">
<i class="material-icons left">cancel</i> Abbrechen
<i class="material-icons left">cancel</i>{% blocktrans %}Abort{% endblocktrans %}
</a>
</span>
</form>
</main>
{% include 'partials/footer.html' %}
{% endblock %}
{% include 'partials/header.html' %}
{% load material_form %}
{% extends 'core/base.html' %}
{% load material_form i18n %}
<main>
{% block browser_title %}{% blocktrans %}Booking accounts{% endblocktrans %}{% endblock %}
{% block content %}
<a class="waves-effect waves-light btn green modal-trigger right" href="#new-modal">
<i class="material-icons left">add</i> Buchungskonto anlegen
<i class="material-icons left">add</i>{% blocktrans %}Create booking account{% endblocktrans %}
</a>
<h4>Buchungskonten</h4>
<h4>{% blocktrans %}Booking accounts{% endblocktrans %}</h4>
{% if form.errors %}
<script>
......@@ -19,14 +21,14 @@
<form method="POST">
<div id="new-modal" class="modal">
<div class="modal-content">
<h5>Neues Buchungskonto anlegen</h5>
<h5>{% blocktrans %}Create booking account{% endblocktrans %}</h5>
{% csrf_token %}
{% form form=form %}
{% endform %}
</div>
<div class="modal-footer">
<button type="submit" class="waves-effect waves-light btn green">
<i class="material-icons left">save</i> Buchungskonto anlegen
<i class="material-icons left">save</i>{% blocktrans %}Create booking account{% endblocktrans %}
</button>
</div>
</div>
......@@ -35,11 +37,11 @@
<table>
<thead>
<tr>
<th>Buchungskonto</th>
<th>Kostenstelle</th>
<th class="right-align">erwartete Einnahmen</th>
<th class="right-align">erwartete Ausgaben</th>
<th>Aktionen</th>
<th>{% blocktrans %}Booking account{% endblocktrans %}</th>
<th>{% blocktrans %}Cost centre{% endblocktrans %}</th>
<th class="right-align">{% blocktrans %}Expected earnings{% endblocktrans %}</th>
<th class="right-align">{% blocktrans %}Expected expenses{% endblocktrans %}</th>
<th>{% blocktrans %}Aktionen{% endblocktrans %}</th>
</tr>
</thead>
<tbody>
......@@ -56,14 +58,14 @@
{% endif %}
<td class="right-align">
<a href="{% url 'fibu_accounts_edit' account.id %}"
class="waves-effect waves-light btn-flat btn-flat-medium left" title="Bearbeiten">
class="waves-effect waves-light btn-flat btn-flat-medium left" title={% trans "Edit" %}>
<i class="material-icons center green-text">create</i>
</a>
<form action="" method="POST" class="left">
{% csrf_token %}
<input type="hidden" value="{{ account.id }}" name="id">
<button type="submit" onclick="return confirm('Buchungskonto wirklich löschen?')"
name="cancel" class="waves-effect waves-light btn-flat btn-flat-medium" title="Löschen">
<button type="submit" onclick="return confirm({% blocktrans %}'Buchungskonto wirklich löschen?'{% endblocktrans %})"
name="cancel" class="waves-effect waves-light btn-flat btn-flat-medium" title={% trans "Delete "%}>
<i class="material-icons center red-text">cancel</i>
</button>
</form>
......@@ -72,5 +74,4 @@
{% endfor %}
</tbody>
</table>
</main>
{% include 'partials/footer.html' %}
{% endblock %}
{% include 'partials/header.html' %}
{% load material_form %}
{% extends "core/base.html"%}
{% load material_form i18n %}
<main>
<h4>Buchung bearbeiten</h4>
{% block content %}
<h4>{% blocktrans %}Edit booking{% endblocktrans %}</h4>
<form method="POST">
{% csrf_token %}
......@@ -11,13 +11,11 @@
<span class="right">
<button type="submit" class="waves-effect waves-light btn green">
<i class="material-icons left">save</i> Änderungen übernehmen
<i class="material-icons left">save</i>{% blocktrans %}Apply changes{% endblocktrans %}
</button>
<a href="{% url 'fibu_bookings' %}" class="waves-effect waves-light btn red">
<i class="material-icons left">cancel</i> Abbrechen
<i class="material-icons left">cancel</i>{% blocktrans %}Abort{% endblocktrans %}
</a>
</span>
</form>
</main>
{% include 'partials/footer.html' %}
{% endblock %}
{% include 'partials/header.html' %}
{% load material_form %}
{% extends "core/base.html" %}
{% load material_form i18n %}
<main>
<h4>Anträge prüfen</h4>
{% block content %}
<h4>{% blocktrans %}Check requests{% endblocktrans %}</h4>
{% if not filter.qs %}
<span class="flow-text center-align">
Keine offenen Anträge vorhanden
{% blocktrans %}There are no open requests.{% endblocktrans %}
</span>
{% else %}
<div class="collection-item row">
<div class="col s2"><strong>Antragsteller</strong></div>
<div class="col s3"><strong>Anschaffungswunsch</strong></div>
<div class="col s2 right-align"><strong>Geplante Kosten</strong></div>
<div class="col s3"><strong>Buchungskonto</strong></div>
<div class="col s2"><strong>Aktionen</strong></div>
<div class="col s2"><strong>{% blocktrans %}Applicant{% endblocktrans %}</strong></div>
<div class="col s3"><strong>{% blocktrans %}Acquisition request{% endblocktrans %}</strong></div>
<div class="col s2 right-align"><strong>{% blocktrans %}Planned costs{% endblocktrans %}</strong></div>
<div class="col s3"><strong>{% blocktrans %}Booking account{% endblocktrans %}</strong></div>
<div class="col s2"><strong>{% blocktrans %}Actions{% endblocktrans %}</strong></div>
</div>
{% for booking in filter.qs %}
......@@ -27,11 +27,11 @@
<div class="col s3">{{ form.account }}</div>
<div class="col s2">
<button type="submit" name="allow"
class="waves-effect waves-light btn-flat btn-flat-medium" title="Annehmen">
class="waves-effect waves-light btn-flat btn-flat-medium" title={% trans 'Accept' %}>
<i class="material-icons center green-text">check_circle</i>
</button>
<button type="submit" name="deny"
class="waves-effect waves-light btn-flat btn-flat-medium" title="Ablehnen">
class="waves-effect waves-light btn-flat btn-flat-medium" title={% trans 'Reject' %}>
<i class="material-icons center red-text">not_interested</i>
</button>
</div>
......@@ -39,6 +39,6 @@
</div>
{% endfor %}
{% endif %}
</main>
{% endblock %}
{% include 'partials/footer.html' %}
{% include 'partials/header.html' %}
{% load material_form %}
{% extends "core/base.html" %}
{% load material_form i18n %}
<main>
<h4>Antrag bearbeiten</h4>
{% block content %}
<h4>{% blocktrans %}Edit request{% endblocktrans %}</h4>
<form method="POST" action="">
{% csrf_token %}
......@@ -12,13 +12,13 @@
<div class="right">
<button type="submit" class="waves-effect waves-light btn green">
<i class="material-icons left">save</i> Änderungen übernehmen
<i class="material-icons left">save</i>{% blocktrans %}Apply changes{% endblocktrans %}
</button>
<a href="{% url 'fibu_index' %}" class="waves-effect waves-light btn red">
<i class="material-icons left">cancel</i> Abbrechen
<i class="material-icons left">cancel</i>{% blocktrans %}Abort{% endblocktrans %}
</a>
</div>
</form>
</main>
{% endblock %}
{% include 'partials/footer.html' %}
{% include 'partials/header.html' %}
{% load material_form %}
{% extends "core/base.html" %}
{% load material_form i18n %}
<main>
{% block content %}
<div class="right">
{% if is_archive %}
<a href="{% url 'fibu_bookings' %}" class="waves-effect waves-light btn grey">Zur aktuellen Übersicht</a>
<a href="{% url 'fibu_bookings' %}" class="waves-effect waves-light btn grey">{% blocktrans %}Back to overview{% endblocktrans %}</a>
{% else %}
<a href="{% url 'fibu_bookings_archive' "archive" %}" class="waves-effect waves-light btn grey">Zum Archiv
<a href="{% url 'fibu_bookings_archive' "archive" %}" class="waves-effect waves-light btn grey">{% blocktrans %}Archive{% endblocktrans %}
</a>
{% endif %}
<a href="{% url 'fibu_bookings_new' %}" class="waves-effect waves-light btn green">Neue Buchung anlegen</a>&nbsp;
<a href="{% url 'fibu_bookings_new' %}" class="waves-effect waves-light btn green">{% blocktrans %}New booking{% endblocktrans %}</a>&nbsp;
</div>
<h4>{% if is_archive %}Buchungsarchiv{% else %}Aktuelle Buchungen{% endif %}</h4>
<h4>{% if is_archive %}{% blocktrans %}Booking archive{% endblocktrans %}{% else %}{% blocktrans %}Recent bookings{% endblocktrans %}{% endif %}</h4>
<table>
<thead>
<tr>
<th>Artikelbeschreibung</th>
<th class="right-align">erwarteter Betrag</th>
<th class="right-align">Rechnungsbetrag</th>
<th>Buchungskonto</th>
<th>Antragsteller</th>
<th>Status</th>
<th>Aktionen</th>
<th class="right-align">{% blocktrans %}Expected amount{% endblocktrans %}</th>
<th class="right-align">{% blocktrans %}Invoice amount{% endblocktrans %}</th>
<th>{% blocktrans %}Booking account{% endblocktrans %}</th>
<th>{% blocktrans %}Applicant{% endblocktrans %}</th>
<th>{% blocktrans %}Status{% endblocktrans %}</th>
<th>{% blocktrans %}Actions{% endblocktrans %}</th>
</tr>
</thead>
{% for booking in bookings %}
......@@ -32,8 +32,8 @@
<td>
<a href="{% url "fibu_bookings_edit" booking.id %}">{{ booking.description }}</a>
</td>
<td class="right-align">{{ booking.planned_amount }}</td>
<td class="right-align">{{ booking.amount }}</td>
<td class="right-align">{{ booking.planned_amount }}</td>
<td class="right-align">{{ booking.amount }}</td>
<td>{{ booking.account|default:"" }}</td>
<td>{{ booking.contact.get_full_name }}</td>
<td>
......@@ -43,7 +43,7 @@
</td>
<td>
<span class="left">
<a class="waves-effect waves-light btn-flat btn-flat-medium green-text" title="Bearbeiten"
<a class="waves-effect waves-light btn-flat btn-flat-medium green-text" title={% trans 'Edit' %}
href="{% url "fibu_bookings_edit" booking.id %}">
<i class="material-icons">edit</i>
</a>
......@@ -53,9 +53,9 @@
{% csrf_token %}
<input type="hidden" value="{{ booking.id }}" name="booking-id">
<button type="submit"
onclick="return confirm('Wirklich löschen?')"
onclick="return confirm({% blocktrans %}'Wirklich löschen?'{% endblocktrans %})"
name="cancel" class="waves-effect waves-light btn-flat btn-flat-medium red-text"
title="Löschen">
title={% trans 'Delete' %}>
<i class="material-icons center">cancel</i>
</button>
</form>
......@@ -64,5 +64,5 @@
</tr>
{% endfor %}
</table>
</main>
{% include 'partials/footer.html' %}
{% endblock %}
{% include 'partials/header.html' %}
{% load material_form %}
{% extends "core/base.html" %}
{% load material_form i18n %}
<main>
<h4>Neue Buchung</h4>
{% block content %}
<h4>{% blocktrans %}New booking{% endblocktrans %}</h4>
<form method="POST">
{% csrf_token %}
......@@ -11,13 +11,13 @@
<span class="right">
<button type="submit" class="waves-effect waves-light btn green">
<i class="material-icons left">save</i> Buchung anlegen
<i class="material-icons left">save</i>{% blocktrans %}New booking{% endblocktrans %}
</button>
<a href="{% url 'fibu_bookings' %}" class="waves-effect waves-light btn red">
<i class="material-icons left">cancel</i> Abbrechen
<i class="material-icons left">cancel</i>{% blocktrans %}Abort{% endblocktrans %}
</a>
</span>
</form>
</main>
{% endblock %}
{% include 'partials/footer.html' %}
{% include 'partials/header.html' %}
{% load material_form %}
{% extends "core/base.html" %}
{% load material_form i18n %}
<main>
<h4>Kostenstelle bearbeiten</h4>
{% block content %}
<h4>{% blocktrans %}Edit cost center{% endblocktrans%}</h4>
<form method="POST">
{% csrf_token %}
......@@ -11,13 +11,11 @@
<span class="right">
<button type="submit" class="waves-effect waves-light btn green">
<i class="material-icons left">save</i> Änderungen übernehmen
<i class="material-icons left">save</i>{% blocktrans %}Apply changes{% endblocktrans %}
</button>
<a href="{% url 'fibu_cost_centers' %}" class="waves-effect waves-light btn red">
<i class="material-icons left">cancel</i> Abbrechen
<i class="material-icons left">cancel</i>{% blocktrans %}Abort{% endblocktrans %}
</a>
</span>
</form>
</main>
{% include 'partials/footer.html' %}
{% endblock %}
{% include 'partials/header.html' %}
{% load material_form %}
{% extends "core/base.html" %}
{% load material_form i18n %}
<main>
{% block content %}
<a class="waves-effect waves-light btn green modal-trigger right" href="#new-modal">
<i class="material-icons left">add</i> Kostenstelle anlegen
<i class="material-icons left">add</i>{% blocktrans %}Create cost center{% endblocktrans %}
</a>
<h4>Kostenstellen</h4>
<h4>{% blocktrans %}Cost centers{% endblocktrans %}</h4>
{% if form.errors %}
<script>
......@@ -19,14 +19,14 @@
<form method="POST">
<div id="new-modal" class="modal">
<div class="modal-content">
<h5>Neue Kostenstelle anlegen</h5>
<h5>{% blocktrans %}Create cost center{% endblocktrans%}</h5>
{% csrf_token %}
{% form form=form %}
{% endform %}
</div>
<div class="modal-footer">
<button type="submit" class="waves-effect waves-light btn green">
<i class="material-icons left">save</i> Kostenstelle anlegen
<i class="material-icons left">save</i>{% blocktrans %}Create cost center{% endblocktrans%}
</button>
</div>
</div>
......@@ -35,9 +35,9 @@
<table>
<thead>
<tr>
<th>Kostenstelle</th>
<th>Jahr</th>
<th>Aktionen</th>
<th>{% blocktrans %}Cost center{% endblocktrans%}</th>
<th>{% blocktrans %}Year{% endblocktrans%}</th>
<th>{% blocktrans %}Actions{% endblocktrans%}</th>
</tr>
</thead>
{% for cost_center in cost_centers %}
......@@ -49,7 +49,7 @@
{% csrf_token %}
<input type="hidden" value="{{ cost_center.id }}" name="id">
<button type="submit" name="edit"
class="waves-effect waves-light btn-flat btn-flat-medium" title="Bearbeiten">
class="waves-effect waves-light btn-flat btn-flat-medium" title={% trans 'Edit'%}>
<i class="material-icons center green-text">create</i>
</button>
</form>
......@@ -57,9 +57,9 @@
{% csrf_token %}
<input type="hidden" value="{{ cost_center.id }}" name="id">
<button type="submit"
onclick="return confirm('Wollen Sie die Kostenstelle wirklich löschen?')"
onclick="return confirm({% blocktrans %}'Wollen Sie die Kostenstelle wirklich löschen?'{% endblocktrans %})"
name="cancel" class="waves-effect waves-light btn-flat btn-flat-medium"
title="Löschen">
title={% trans 'Delete' %}>
<i class="material-icons center red-text">cancel</i>
</button>
</form>
......@@ -67,6 +67,4 @@
</tr>
{% endfor %}
</table>
</main>
{% include 'partials/footer.html' %}
{% endblock %}
{% include 'partials/header.html' %}
{% load material_form %}
{% extends 'core/base.html' %}
{% load material_form i18n %}
<main>
{% block browser_title %}{% blocktrans %}Financial Accounting{% endblocktrans %}{% endblock %}
{% block content %}
<a class="waves-effect waves-light btn green modal-trigger right" href="#new-modal">
<i class="material-icons left">add</i> Antrag stellen
<i class="material-icons left">add</i>{% blocktrans %}New request{% endblocktrans %}
</a>
<h4>Meine Anträge</h4>
<h4>{% blocktrans %}My requests{% endblocktrans %}</h4>
{% if form.errors %}
......@@ -19,7 +21,7 @@
<form method="POST">
<div id="new-modal" class="modal">
<div class="modal-content">
<h5>Neuen Antrag stellen</h5>
<h5>{% blocktrans %}New request{% endblocktrans %}</h5>
{% csrf_token %}
{% form form=form %}
{% part form.planned_amount prefix %}<i class="material-icons prefix">euro_symbol</i>
......@@ -28,18 +30,18 @@
</div>
<div class="modal-footer">
<button type="submit" class="waves-effect waves-light btn green">
<i class="material-icons left">send</i> Antrag stellen
<i class="material-icons left">send</i>{% blocktrans %}New request{% endblocktrans %}
</button>
</div>
</div>
</form>
<div class="collection-item row">
<div class="col s5"><strong>Beschreibung</strong></div>
<div class="col s2 right-align"><strong>erwarteter Betrag</strong></div>
<div class="col s2 right-align"><strong>Rechnungsbetrag</strong></div>
<div class="col s1 center-align"><strong>Status</strong></div>
<div class="col s2 center-align"><strong>Aktionen</strong></div>
<div class="collection-item row">
<div class="col s5"><strong>{% blocktrans %}Description{% endblocktrans %}</strong></div>
<div class="col s2 right-align"><strong>{% blocktrans %}Expected amount{% endblocktrans %}</strong></div>
<div class="col s2 right-align"><strong>{% blocktrans %}Invoice amount{% endblocktrans %}</strong></div>
<div class="col s1 center-align"><strong>{% blocktrans %}Status{% endblocktrans %}</strong></div>
<div class="col s2 center-align"><strong>{% blocktrans %}Actions{% endblocktrans %}</strong></div>
</div>
<div class="collection">
{% for booking in bookings %}
......@@ -51,28 +53,26 @@
<span class="badge new {{ booking.get_status.style_class }}">{{ booking.get_status.name }}</span>
</div>
<div class="col s2">
{# Delete #}
{% if booking.status < 3 %}
<form action="" method="POST" class="right">
{% csrf_token %}
<input type="hidden" value="{{ booking.id }}" name="booking-id">
<button type="submit"
onclick="return confirm('Wollen Sie den Antrag wirklich zurücknehmen?')"
onclick="return confirm({% blocktrans %}'Are you sure you want to withdraw the request?'{% endblocktrans %})"
name="cancel" class="waves-effect waves-light btn-flat btn-flat-medium"
title="Antrag zurücknehmen">
title="{% blocktrans %}Withdraw request{% endblocktrans %}">
<i class="material-icons center red-text">cancel</i>
</button>
</form>
{% endif %}
{# Edit #}
{% if booking.status == 0 %}
<form action="{% url 'fibu_bookings_user_edit' booking.id %}" class="right">
{% csrf_token %}
<input type="hidden" value="{{ booking.id }}" name="booking-id">
<button type="submit" name="edit"
class="waves-effect waves-light btn-flat btn-flat-medium right"
title="Bearbeiten">
title="{% blocktrans %}Edit{% endblocktrans %}">
<i class="material-icons center green-text">create</i>
</button>
</form>
......@@ -87,7 +87,7 @@
{% if booking.status == 2 %}
<button type="submit" name="ordered"
class="waves-effect waves-light btn-flat btn-flat-medium left"
title="Status auf 'bestellt' ändern">
title="{% blocktrans %}Change status to 'ordered'{% endblocktrans %}">
<i class="material-icons center green-text">shopping_cart</i>
</button>
......@@ -95,7 +95,7 @@
{% elif booking.status == 3 %}
<button type="submit" name="submit-invoice"
class="waves-effect waves-light btn-flat btn-flat-medium left"
title="Status auf 'Rechnung eingereicht' ändern">
title="{% blocktrans %}Change status of invoice to 'submitted '{% endblocktrans %}">
<i class="material-icons center green-text">description</i>
</button>
{% endif %}
......@@ -104,5 +104,4 @@
</div>
{% endfor %}
</div>
</main>
{% include 'partials/footer.html' %}
{% endblock %}
{% include 'partials/header.html' %}
{% load material_form %}
{% extends "core/base.html" %}
{% load material_form i18n %}
<main>
<h4>Schlussrechnung</h4>
{% block content %}
<h4>{% blocktrans %}Financial statements{% endblocktrans %}</h4>
<div class="collection">
{% for cost_center, accounts in cost_center_accounts.items %}
......@@ -10,27 +10,26 @@
<div class="collection">
<div class="row">
<span class="col s5 m5 white-text grey">Buchungskonto</span>
<span class="col s2 m2 white-text grey right-align">Budget</span>
<span class="col s1 m1 white-text grey right-align">Einnahmen</span>
<span class="col s1 m1 white-text grey right-align">Ausgaben</span>
<span class="col s1 m1 white-text grey right-align">Reste</span>
<span class="col s5 m5 white-text grey">{% blocktrans %}Booking account{% endblocktrans %}</span>
<span class="col s2 m2 white-text grey right-align">{% blocktrans %}Budget{% endblocktrans %}</span>
<span class="col s1 m1 white-text grey right-align">{% blocktrans %}Earnings{% endblocktrans %}</span>
<span class="col s1 m1 white-text grey right-align">{% blocktrans %}Expenses{% endblocktrans %}</span>
<span class="col s1 m1 white-text grey right-align">{% blocktrans %}Leftovers{% endblocktrans %}</span>
</div>
{% for account in accounts %}
<div class="collection-item row">
<span class="col s5 m5">{{ account.name }}</span>
<span class="col s2 m2 right-align">{{ account.budget }} €</span>
<span class="col s1 m1 right-align">
{% if account.income %}{{ account.saldo }}{% endif %}
{% if account.income %}{{ account.saldo }}{% endif %}
</span>
<span class="col s1 m1 right-align">
{% if not account.income %}{{ account.saldo }}{% endif %}
{% if not account.income %}{{ account.saldo }}{% endif %}
</span>
<span class="col s1 m1 right-align">{{ account.rest }}</span>
<span class="col s1 m1 right-align">{{ account.rest }}</span>
</div>
{% endfor %}
</div>
{% endfor %}
</div>
</main>
{% include 'partials/footer.html' %}
{% endblock %}
{% include 'partials/header.html' %}
{% load material_form %}
{% extends "core/base.html" %}
{% load material_form i18n %}
<main>
<h4>Berichte</h4>
{% block content %}
<h4>{% blocktrans %}Reports{% endblocktrans %}</h4>
<div class="collection">
<a href="{% url "fibu_reports_expenses" %}" class="collection-item">Ausgaben</a>
<a href="{% url "fibu_reports_expenses" %}" class="collection-item">{% blocktrans %}Expenses{% endblocktrans %}</a>
</div>
</main>
{% include 'partials/footer.html' %}
{% endblock %}
......@@ -3,6 +3,8 @@ from django.contrib.auth.decorators import login_required, permission_required
from django.db.models import Sum
from django.urls import reverse
from django.shortcuts import render, redirect, get_object_or_404
from django.utils.translation import ugettext_lazy as _
from .models import Booking, CostCenter, Account
from .filters import BookingFilter
from .forms import SimpleBookingForm, CheckBookingForm, CompleteBookingForm, CostCenterForm, AccountForm
......@@ -43,7 +45,7 @@ def index(request):
justification=justification)
booking.save()
messages.success(request, "Der Antrag wurde erfolgreich übermittelt.")
messages.success(request, _("The request was successfully submitted."))
return redirect('fibu_index')
......@@ -65,7 +67,7 @@ def user_edit(request, pk):
if form.is_valid():
form.save()
messages.success(request, "Die Änderungen am Antrag wurden erfolgreich übernommen.")
messages.success(request, _("The changes were succesfully applied."))
return redirect(reverse('fibu_index'))
context = {'form': form}
......@@ -82,12 +84,12 @@ def check(request):
if "account" in request.POST:
account = request.POST['account']
Booking.objects.filter(id=booking_id).update(status=2, account=account)
messages.success(request, "Der Antrag wurde angenommen.")
messages.success(request, _("The request was accepted."))
else:
messages.error(request, "Bitte wähle ein Buchungskonto aus, um den Antrag anzunehmen.")
messages.error(request, _("Please select a booking account to create a reqest."))
elif 'deny' in request.POST:
Booking.objects.filter(id=booking_id).update(status=1)
messages.success(request, "Der Antrag wurde abgelehnt.")
messages.success(request, _("The request was rejected."))
booking_list = Booking.objects.filter(status=0).order_by('submission_date')
bookings = BookingFilter(request.GET, queryset=booking_list)
......@@ -117,7 +119,7 @@ def book(request, pk):
form = CompleteBookingForm(request.POST, request.FILES, instance=booking)
if form.is_valid():
form.save()
messages.success(request, "Die Änderungen an der Buchung wurden erfolgreich übernommen.")
messages.success(request, _("The changes were successfully applied."))
return redirect(reverse('fibu_bookings'))
context = {'form': form}
return render(request, template, context)
......@@ -132,7 +134,7 @@ def new_booking(request):
form = CompleteBookingForm(request.POST, request.FILES)
if form.is_valid():
form.save()
messages.success(request, "Die Buchung wurde erfolgreich angelegt.")
messages.success(request, _("The booking was successfully created."))
return redirect(reverse('fibu_bookings'))
context = {'form': form}
......@@ -150,7 +152,7 @@ def cost_centers(request):
cost_center = CostCenter.objects.get(id=cost_center_id)
cost_center.delete()
messages.success(request, "Die Kostenstelle wurde erfolgreich gelöscht.")
messages.success(request, _("The cost center was successfully deleted."))
return redirect('fibu_cost_centers')
else:
......@@ -158,7 +160,7 @@ def cost_centers(request):
if form.is_valid():
form.save()
messages.success(request, "Die Kostenstelle wurde erfolgreich angelegt.")
messages.success(request, _("The cost center was successfully created."))
return redirect('fibu_cost_centers')
cost_centers = CostCenter.objects.filter()
......@@ -179,7 +181,7 @@ def cost_center_edit(request, pk):
if form.is_valid():
form.save()
messages.success(request, "Die Änderungen an der Kostenstelle wurden erfolgreich übernommen.")
messages.success(request, _("The changes were successfully applied."))
return redirect(reverse('fibu_cost_centers'))
......@@ -198,7 +200,7 @@ def account(request):
account = Account.objects.get(id=account_id)
account.delete()
messages.success(request, "Das Buchungskonto wurde erfolgreich gelöscht")
messages.success(request, _("The booking account was successfully deleted."))
return redirect('account')
else:
form = AccountForm(request.POST)
......@@ -206,8 +208,8 @@ def account(request):
if form.is_valid():
form.save()
messages.success(request, "Das Buchungskonto wurde erfolgreich angelegt.")
return redirect('account')
messages.success(request, _("The booking account was successfully created."))
return redirect('fibu_accounts')
accounts = Account.objects.filter().order_by('cost_center', '-income', 'name')
context = {'accounts': accounts, 'form': form}
......@@ -226,7 +228,7 @@ def account_edit(request, pk):
if form.is_valid():
form.save()
messages.success(request, "Die Änderungen am Buchungskonto wurden erfolgreich übernommen.")
messages.success(request, _("The changes were successfully applied."))
return redirect(reverse('account'))
context = {'form': form}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment