Compare commits

..

2 Commits

Author SHA1 Message Date
Gregory Trullemans 7cecdad32c Update project 2024-06-11 10:05:50 +02:00
Gregory Trullemans 9ba5868b88 Add bank extract 2022-09-28 09:52:27 +02:00
32 changed files with 65 additions and 50 deletions

View File

@ -29,7 +29,7 @@ Commande à taper :
python manage.py importcsv -b nom_de_la_banque -f path_du_fichier_csv python manage.py importcsv -b nom_de_la_banque -f path_du_fichier_csv
Le fichier importer DOIT être un `.csv`. Le fichier importer DOIT être un `.csv` et dois être push sur Heroku.
Egalement possible de le faire sur heroku via la commandes suivantes : Egalement possible de le faire sur heroku via la commandes suivantes :
heroku login heroku login

View File

@ -1,5 +1,11 @@
from django.contrib import admin from django.contrib import admin
from django_admin_listfilter_dropdown.filters import (
DropdownFilter,
ChoiceDropdownFilter,
RelatedDropdownFilter,
)
from .models import ( from .models import (
Client, Client,
Contract, Contract,
@ -7,6 +13,7 @@ from .models import (
) )
@admin.register(Client)
class ClientAdmin(admin.ModelAdmin): class ClientAdmin(admin.ModelAdmin):
model = Client model = Client
@ -14,6 +21,7 @@ class ClientAdmin(admin.ModelAdmin):
search_fields = ("name", "adress", "city") search_fields = ("name", "adress", "city")
@admin.register(Contract)
class ContractAdmin(admin.ModelAdmin): class ContractAdmin(admin.ModelAdmin):
model = Contract model = Contract
@ -22,13 +30,12 @@ class ContractAdmin(admin.ModelAdmin):
list_filter = ("is_finished",) # 'date__year', list_filter = ("is_finished",) # 'date__year',
@admin.register(Prestation)
class PrestationAdmin(admin.ModelAdmin): class PrestationAdmin(admin.ModelAdmin):
model = Prestation model = Prestation
list_display = ("date", "label", "total_amount", "contract") list_display = ("date", "label", "total_amount", "contract")
search_fields = ("label",) search_fields = ("label", "contract__title")
list_filter = (
("contract", RelatedDropdownFilter),
admin.site.register(Client, ClientAdmin) )
admin.site.register(Contract, ContractAdmin)
admin.site.register(Prestation, PrestationAdmin)

View File

@ -39,20 +39,25 @@ class ContractForm(forms.ModelForm):
class Meta: class Meta:
model = Contract model = Contract
fields = ("title", "client", "advance", "reference", "is_finished", "is_paid", "description") fields = ("title", "client", "advance", "reference", "is_finished", "is_paid", "description")
client = forms.ModelChoiceField(queryset=Contract.objects.all())
widgets = { widgets = {
"title": forms.TextInput( "title": forms.TextInput(
attrs={"class": "form-control", "placeholder": "Titre de la facture"} attrs={"class": "form-control", "placeholder": "Titre du contrat"}
), ),
"client": ModelSelect2Widget( "client": forms.Select(
search_fields=["title__icontains", "contact__icontains", "city__icontains"], attrs={
max_results=10, "class": "form-control"
attrs={"data-minimum-input-length": 0, "class": "form-control"}, },
), ),
"advance": forms.TextInput( "advance": forms.TextInput(
attrs={"class": "form-control", } attrs={"class": "form-control", }
), ),
"reference": forms.TextInput( "reference": forms.TextInput(
attrs={"class": "form-control", } attrs={
"class": "form-control",
"placeholder": date.today().strftime("%Y-%m") + "-00x",
"value": date.today().strftime("%Y-%m") + "-00x",
}
), ),
"is_finished": forms.CheckboxInput( "is_finished": forms.CheckboxInput(
attrs={"class": "form-control", } attrs={"class": "form-control", }

View File

@ -16,7 +16,7 @@
<form action="{% if client_id %}{% url 'client_update' client_id %}{% else %}{% url 'client_create' %}{% endif %}" method="post" class="form-horizontal" id="formulaire" name="formulaire"> <form action="{% if client_id %}{% url 'client_update' client_id %}{% else %}{% url 'client_create' %}{% endif %}" method="post" class="form-horizontal" id="formulaire" name="formulaire">
{% csrf_token %} {% csrf_token %}
<div class="form-group row "> <div class="form-group row ">
<label for="id_date" class="col-4 col-sm-2 col-md-2 col-lg-2 col-xl-2 control-label">Nom</label> <label for="id_date" class="col-4 col-sm-2 col-md-2 col-lg-2 col-xl-2 control-label">Nom<span class="text-danger">*</span></label>
<div class="col-12 col-sm-10 col-md-8 col-lg-8 col-xl-8 {% if form.name.errors %}has-danger{% endif %}"> <div class="col-12 col-sm-10 col-md-8 col-lg-8 col-xl-8 {% if form.name.errors %}has-danger{% endif %}">
{{ form.name }} {{ form.name }}
{% if form.name.errors %}<span class="btn btn-sm btn-danger-outline">{% for error in form.name.errors %}{{error}}{% endfor %}</span>{% endif %} {% if form.name.errors %}<span class="btn btn-sm btn-danger-outline">{% for error in form.name.errors %}{{error}}{% endfor %}</span>{% endif %}

View File

@ -49,7 +49,7 @@ def client_listing(request):
""" Récupère la liste de tous les clients. """ """ Récupère la liste de tous les clients. """
client_list = Client.objects.all() client_list = Client.objects.all()
context = {"client_list": client_list} context = {"client_list": client_list}
return render(request, "billing/clients/listing.html", context) return render(request, "clients/listing.html", context)
@login_required @login_required
@ -62,7 +62,7 @@ def client_details(request, client_id=None):
""" """
client = get_object_or_404(Client, pk=client_id) client = get_object_or_404(Client, pk=client_id)
context = {"client": client} context = {"client": client}
return render(request, "billing/clients/details.html", context) return render(request, "clients/details.html", context)
@login_required @login_required
@ -90,7 +90,7 @@ def client_create_or_update(request, client_id=None):
form = ClientForm(instance=client) form = ClientForm(instance=client)
context = {"form": form, "client_id": client_id} context = {"form": form, "client_id": client_id}
return render(request, "billing/clients/create.html", context) return render(request, "clients/create.html", context)
@login_required @login_required
@ -99,7 +99,7 @@ def contract_listing(request):
""" Récupère la liste de tous les contrats. """ """ Récupère la liste de tous les contrats. """
contract_list = Contract.objects.all() contract_list = Contract.objects.all()
context = {"contract_list": contract_list} context = {"contract_list": contract_list}
return render(request, "billing/contracts/listing.html", context) return render(request, "contracts/listing.html", context)
@login_required @login_required
@ -125,7 +125,7 @@ def contract_detail(request, contract_id):
"prestation_count": prestation_count, "prestation_count": prestation_count,
"total": total, "total": total,
} }
return render(request, "billing/contracts/details.html", context) return render(request, "contracts/details.html", context)
@login_required @login_required
@ -153,7 +153,7 @@ def contract_create_or_update(request, contract_id=None):
form = ContractForm(instance=contract) form = ContractForm(instance=contract)
context = {"form": form, "contract_id": contract_id} context = {"form": form, "contract_id": contract_id}
return render(request, "billing/contracts/create.html", context) return render(request, "contracts/create.html", context)
@login_required @login_required
@ -206,7 +206,7 @@ def prestation_create_or_update(request, prestation_id=None):
form = PrestationForm(instance=prestation) form = PrestationForm(instance=prestation)
context = {"form": form, "prestation_id": prestation_id} context = {"form": form, "prestation_id": prestation_id}
return render(request, "billing/prestations/create.html", context) return render(request, "prestations/create.html", context)
@login_required @login_required

View File

@ -47,10 +47,12 @@ INSTALLED_APPS = [
"django.contrib.messages", "django.contrib.messages",
"django.contrib.staticfiles", "django.contrib.staticfiles",
"comptabilite.apps.ComptabiliteConfig", "comptabilite.apps.ComptabiliteConfig",
"core.apps.CoreConfig",
"eventCompta.apps.ManagementConfig", "eventCompta.apps.ManagementConfig",
"billing.apps.BillingConfig", "billing.apps.BillingConfig",
"django.contrib.humanize", "django.contrib.humanize",
"django_select2", "django_select2",
"django_admin_listfilter_dropdown",
] ]
MIDDLEWARE = [ MIDDLEWARE = [

View File

@ -343,7 +343,7 @@ def year_listing(request):
year_list.append((year.year, Transaction.objects.by_year(year.year).count(),)) year_list.append((year.year, Transaction.objects.by_year(year.year).count(),))
context = {"year_list": year_list} context = {"year_list": year_list}
return render(request, "comptability/year_listing.html", context) return render(request, "year_listing.html", context)
@login_required @login_required
@ -390,7 +390,7 @@ def transaction_listing_for_year_and_type(
"total_simulated": total_simulated, "total_simulated": total_simulated,
"total": total, "total": total,
} }
return render(request, "comptability/transactions/listing.html", context) return render(request, "transactions/listing.html", context)
@login_required @login_required
@ -402,7 +402,7 @@ def transaction_details(request, transaction_id):
transaction = Transaction.objects.get(pk=transaction_id) transaction = Transaction.objects.get(pk=transaction_id)
context = {"event": transaction.event, "transaction": transaction} context = {"event": transaction.event, "transaction": transaction}
# changed template # changed template
return render(request, "comptability/transactions/details.html", context) return render(request, "transactions/details.html", context)
@login_required @login_required
@ -430,4 +430,4 @@ def transaction_create_or_update(request, transaction_id=None):
form = TransactionForm(instance=transaction) form = TransactionForm(instance=transaction)
context = {"form": form, "transaction_id": transaction_id} context = {"form": form, "transaction_id": transaction_id}
return render(request, "comptability/transactions/create.html", context) return render(request, "transactions/create.html", context)

7
core/apps.py Normal file
View File

@ -0,0 +1,7 @@
from django.apps import AppConfig
class CoreConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = "core"
verbose_name = "Core"

View File

@ -68,34 +68,10 @@
<script src="{% static "js/highcharts/highcharts.js" %}"></script> <script src="{% static "js/highcharts/highcharts.js" %}"></script>
<script src="{% static "js/highcharts/exporting.js" %}"></script> <script src="{% static "js/highcharts/exporting.js" %}"></script>
<script src="{% static "js/highcharts/dark-unica.js" %}"></script> <script src="{% static "js/highcharts/dark-unica.js" %}"></script>
<!-- <script src="{% static "js/tablesort.js" %}"></script> -->
<!-- <link href="{% static "css/theme.default.min.css" %}" rel="stylesheet"> -->
<script src="{% static "js/jquery.tablesorter.js" %}"></script> <script src="{% static "js/jquery.tablesorter.js" %}"></script>
<script src="{% static "js/jquery.tablesorter.widgets.js" %}"></script> <script src="{% static "js/jquery.tablesorter.widgets.js" %}"></script>
<script src="{% static "js/jqueryui/jquery-ui.min.js" %}"></script> <script src="{% static "js/jqueryui/jquery-ui.min.js" %}"></script>
{% block extra_script %}{% endblock %} {% block extra_script %}{% endblock %}
<script type="text/javascript">
$(document).ready(function() {
Highcharts.setOptions({
lang: {
months: ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'],
shortMonths: [ "Jan" , "Feb" , "Mar" , "Apr" , "May" , "Jun" , "Jul" , "Aug" , "Sep" , "Oct" , "Nov" , "Dec"],
weekdays: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],
decimalPoint: ",",
thousandsSep: ".",
downloadJPEG: "Telecharger en JPEG",
downloadPDF: "Telecharger en PDF",
downloadPNG: "Telecharger en PNG",
downloadSVG: "Telecharger en SVG",
printChart: "Imprimer",
resetZoom: "Rétablir",
resetZoomTitle: "Rétablir",
loading: "Chargement…",
noData: "Pas de données disponibles."
}
});
});
</script>
<section id="main" class="container">{% block content %}{% endblock %}</section> <section id="main" class="container">{% block content %}{% endblock %}</section>

18
extracts/2022_09_27.csv Normal file
View File

@ -0,0 +1,18 @@
Date;Montant;Solde apr?s op?ration;Devise;Contrepartie;Compte contrepartie;Type d'op?ration;Communication;Compte donneur d'ordre
16/08/2022;100.00;47929.25;EUR;ORANGE ORANGE;BE21 3630 5476 2503;Paiement instantan? en votre faveur;accompte Nelly Orange;BE49 1030 4549 3371
19/08/2022;1000.00;48929.25;EUR;T'COM-LIFE SRL;BE67 0682 4888 8687;Virement en votre faveur;2022-02;BE49 1030 4549 3371
19/08/2022;50.00;48979.25;EUR;ORANGE ORANGE;BE21 3630 5476 2503;Paiement instantan? en votre faveur;Orange, Nelly (2eme paiement de l'acompte);BE49 1030 4549 3371
22/08/2022;150.00;49129.25;EUR;Leonard Denis - Vanest Geraldine;BE96 7506 4819 6905;Virement en votre faveur;Acompte inscription Camille Leonard;BE49 1030 4549 3371
22/08/2022;6.00;49135.25;EUR;Mme Arlette Ponsaerts;BE89 1030 1699 6185;Virement en votre faveur;Carres confiture;BE49 1030 4549 3371
29/08/2022;-21.00;49114.25;EUR;FfG;BE26 0015 2429 9729;Votre virement via Online;20220257/C2054;BE49 1030 4549 3371
29/08/2022;-56.00;49058.25;EUR;FfG;BE26 0015 2429 9729;Votre virement via Online;20220054/C2054;BE49 1030 4549 3371
29/08/2022;-216.00;48842.25;EUR;FfG;BE26 0015 2429 9729;Votre virement via Online;20220367/C2054;BE49 1030 4549 3371
29/08/2022;-30.00;48812.25;EUR;FfG;BE26 0015 2429 9729;Votre virement via Online;20220368/C2054;BE49 1030 4549 3371
29/08/2022;-551.00;48261.25;EUR;FfG;BE26 0015 2429 9729;Votre virement via Online;20220369/C2054;BE49 1030 4549 3371
29/08/2022;-35.00;48226.25;EUR;Morgane Petit;BE54 0635 0646 2697;Votre virement via Online;Prestations juillet 2022;BE49 1030 4549 3371
31/08/2022;150.00;48376.25;EUR;EMILIE DELCORD;BE06 0014 0032 3322;Paiement instantan? en votre faveur;Cotisation TRA 2021-22 Cornet Lenny;BE49 1030 4549 3371
02/09/2022;-4.50;48371.75;EUR;;;Tenue de compte Business Pack;;BE49 1030 4549 3371
06/09/2022;150.00;48521.75;EUR;ANNE RICARD;BE45 9733 8532 8389;Paiement instantan? en votre faveur;cotisation tr2022-23 pisart lily;BE49 1030 4549 3371
19/09/2022;250.00;48771.75;EUR;TROCH - OSEE;BE52 1030 1653 2609;Virement en votre faveur;cotisation TR 2022-23 TROCH Clara;BE49 1030 4549 3371
19/09/2022;250.00;49021.75;EUR;PAINDAVEINE-DE BUSSCHER M + A;BE13 7320 2918 6139;Paiement instantan? en votre faveur;COTISATIONTR 2022-2023-JULIETTE PAINDAVEINE;BE49 1030 4549 3371
21/09/2022;150.00;49171.75;EUR;MLLE LAURENCE DUBRAY;BE51 3101 3370 2462;Paiement instantan? en votre faveur;inscription Munga Livia;BE49 1030 4549 3371
1 Date Montant Solde apr?s op?ration Devise Contrepartie Compte contrepartie Type d'op?ration Communication Compte donneur d'ordre
2 16/08/2022 100.00 47929.25 EUR ORANGE ORANGE BE21 3630 5476 2503 Paiement instantan? en votre faveur accompte Nelly Orange BE49 1030 4549 3371
3 19/08/2022 1000.00 48929.25 EUR T'COM-LIFE SRL BE67 0682 4888 8687 Virement en votre faveur 2022-02 BE49 1030 4549 3371
4 19/08/2022 50.00 48979.25 EUR ORANGE ORANGE BE21 3630 5476 2503 Paiement instantan? en votre faveur Orange, Nelly (2eme paiement de l'acompte) BE49 1030 4549 3371
5 22/08/2022 150.00 49129.25 EUR Leonard Denis - Vanest Geraldine BE96 7506 4819 6905 Virement en votre faveur Acompte inscription Camille Leonard BE49 1030 4549 3371
6 22/08/2022 6.00 49135.25 EUR Mme Arlette Ponsaerts BE89 1030 1699 6185 Virement en votre faveur Carres confiture BE49 1030 4549 3371
7 29/08/2022 -21.00 49114.25 EUR FfG BE26 0015 2429 9729 Votre virement via Online 20220257/C2054 BE49 1030 4549 3371
8 29/08/2022 -56.00 49058.25 EUR FfG BE26 0015 2429 9729 Votre virement via Online 20220054/C2054 BE49 1030 4549 3371
9 29/08/2022 -216.00 48842.25 EUR FfG BE26 0015 2429 9729 Votre virement via Online 20220367/C2054 BE49 1030 4549 3371
10 29/08/2022 -30.00 48812.25 EUR FfG BE26 0015 2429 9729 Votre virement via Online 20220368/C2054 BE49 1030 4549 3371
11 29/08/2022 -551.00 48261.25 EUR FfG BE26 0015 2429 9729 Votre virement via Online 20220369/C2054 BE49 1030 4549 3371
12 29/08/2022 -35.00 48226.25 EUR Morgane Petit BE54 0635 0646 2697 Votre virement via Online Prestations juillet 2022 BE49 1030 4549 3371
13 31/08/2022 150.00 48376.25 EUR EMILIE DELCORD BE06 0014 0032 3322 Paiement instantan? en votre faveur Cotisation TRA 2021-22 Cornet Lenny BE49 1030 4549 3371
14 02/09/2022 -4.50 48371.75 EUR Tenue de compte Business Pack BE49 1030 4549 3371
15 06/09/2022 150.00 48521.75 EUR ANNE RICARD BE45 9733 8532 8389 Paiement instantan? en votre faveur cotisation tr2022-23 pisart lily BE49 1030 4549 3371
16 19/09/2022 250.00 48771.75 EUR TROCH - OSEE BE52 1030 1653 2609 Virement en votre faveur cotisation TR 2022-23 TROCH Clara BE49 1030 4549 3371
17 19/09/2022 250.00 49021.75 EUR PAINDAVEINE-DE BUSSCHER M + A BE13 7320 2918 6139 Paiement instantan? en votre faveur COTISATIONTR 2022-2023-JULIETTE PAINDAVEINE BE49 1030 4549 3371
18 21/09/2022 150.00 49171.75 EUR MLLE LAURENCE DUBRAY BE51 3101 3370 2462 Paiement instantan? en votre faveur inscription Munga Livia BE49 1030 4549 3371