diff --git a/accounting/tests.py b/accounting/tests.py index 44fb84e9..93fa9f79 100644 --- a/accounting/tests.py +++ b/accounting/tests.py @@ -3,9 +3,11 @@ from django.core.urlresolvers import reverse from django.contrib.auth.models import Group from django.core.management import call_command from django.conf import settings +from datetime import date, datetime from core.models import User from counter.models import Counter +from accounting.models import GeneralJournal, Operation, Label, AccountingType, SimplifiedAccountingType class RefoundAccountTest(TestCase): @@ -17,7 +19,7 @@ class RefoundAccountTest(TestCase): self.skia.customer.save() def test_permission_denied(self): - self.client.login(useername='guy', password='plop') + self.client.login(username='guy', password='plop') response_post = self.client.post(reverse("accounting:refound_account"), {"user": self.skia.id}) response_get = self.client.get(reverse("accounting:refound_account")) @@ -45,3 +47,153 @@ class RefoundAccountTest(TestCase): self.assertTrue('
' in str(response_get.content)) self.assertFalse(response_post.status_code == 403) self.assertTrue(self.skia.customer.amount == 0) + +class JournalTest(TestCase): + def setUp(self): + call_command("populate") + self.journal = GeneralJournal.objects.filter(id = 1).first() + + def test_permission_granted(self): + self.client.login(username='comptable', password='plop') + response_get = self.client.get(reverse("accounting:journal_details", args=[self.journal.id])) + + self.assertTrue(response_get.status_code == 200) + self.assertTrue('M\\xc3\\xa9thode de paiement' in str(response_get.content)) + + def test_permission_not_granted(self): + self.client.login(username='skia', password='plop') + response_get = self.client.get(reverse("accounting:journal_details", args=[self.journal.id])) + + self.assertTrue(response_get.status_code == 403) + self.assertFalse('M\xc3\xa9thode de paiement' in str(response_get.content)) + +class OperationTest(TestCase): + def setUp(self): + call_command("populate") + self.journal = GeneralJournal.objects.filter(id = 1).first() + self.skia = User.objects.filter(username='skia').first() + at = AccountingType(code='443', label="Ce code n'existe pas", movement_type='CREDIT') + at.save() + l = Label(club_account= self.journal.club_account, name='bob') + l.save() + self.client.login(username='comptable', password='plop') + self.op1 = Operation(journal=self.journal, date=date.today(), amount=1, + remark="Test bilan", mode='CASH', done=True, label=l, + accounting_type=at, target_type='USER', target_id=self.skia.id) + self.op1.save() + self.op2 = Operation(journal=self.journal, date=date.today(), amount=2, + remark="Test bilan", mode='CASH', done=True, label=l, + accounting_type=at, target_type='USER', target_id=self.skia.id) + self.op2.save() + + def test_new_operation(self): + self.client.login(username='comptable', password='plop') + at = AccountingType.objects.filter(code = '604').first() + response = self.client.post(reverse('accounting:op_new', + args=[self.journal.id]), + {'amount': 30, + 'remark' : "Un gros test", + 'journal' : self.journal.id, + 'target_type' : 'OTHER', + 'target_id' : '', + 'target_label' : "Le fantome de la nuit", + 'date' : '04/12/2020', + 'mode' : 'CASH', + 'cheque_number' : '', + 'invoice' : '', + 'simpleaccounting_type' : '', + 'accounting_type': at.id, + 'label' : '', + 'done' : False, + }) + self.assertFalse(response.status_code == 403) + self.assertTrue(self.journal.operations.filter(target_label = "Le fantome de la nuit").exists()) + response_get = self.client.get(reverse("accounting:journal_details", args=[self.journal.id])) + self.assertTrue('Le fantome de la nuit' in str(response_get.content)) + + def test_bad_new_operation(self): + self.client.login(username='comptable', password='plop') + at = AccountingType.objects.filter(code = '604').first() + response = self.client.post(reverse('accounting:op_new', + args=[self.journal.id]), + {'amount': 30, + 'remark' : "Un gros test", + 'journal' : self.journal.id, + 'target_type' : 'OTHER', + 'target_id' : '', + 'target_label' : "Le fantome de la nuit", + 'date' : '04/12/2020', + 'mode' : 'CASH', + 'cheque_number' : '', + 'invoice' : '', + 'simpleaccounting_type' : '', + 'accounting_type': '', + 'label' : '', + 'done' : False, + }) + self.assertTrue('Vous devez fournir soit un type comptable simplifi\\xc3\\xa9 ou un type comptable standard' in str(response.content)) + + def test_new_operation_not_authorized(self): + self.client.login(username='skia', password='plop') + at = AccountingType.objects.filter(code = '604').first() + response = self.client.post(reverse('accounting:op_new', + args=[self.journal.id]), + {'amount': 30, + 'remark' : "Un gros test", + 'journal' : self.journal.id, + 'target_type' : 'OTHER', + 'target_id' : '', + 'target_label' : "Le fantome du jour", + 'date' : '04/12/2020', + 'mode' : 'CASH', + 'cheque_number' : '', + 'invoice' : '', + 'simpleaccounting_type' : '', + 'accounting_type': at.id, + 'label' : '', + 'done' : False, + }) + self.assertTrue(response.status_code == 403) + self.assertFalse(self.journal.operations.filter(target_label = "Le fantome du jour").exists()) + + def test__operation_simple_accounting(self): + self.client.login(username='comptable', password='plop') + sat = SimplifiedAccountingType.objects.all().first() + response = self.client.post(reverse('accounting:op_new', + args=[self.journal.id]), + {'amount': 23, + 'remark' : "Un gros test", + 'journal' : self.journal.id, + 'target_type' : 'OTHER', + 'target_id' : '', + 'target_label' : "Le fantome de l'aurore", + 'date' : '04/12/2020', + 'mode' : 'CASH', + 'cheque_number' : '', + 'invoice' : '', + 'simpleaccounting_type' : sat.id, + 'accounting_type': '', + 'label' : '', + 'done' : False, + }) + self.assertFalse(response.status_code == 403) + self.assertTrue(self.journal.operations.filter(amount=23).exists()) + response_get = self.client.get(reverse("accounting:journal_details", args=[self.journal.id])) + self.assertTrue("Le fantome de l'aurore" in str(response_get.content)) + self.assertTrue(self.journal.operations.filter(amount=23).values('accounting_type').first()['accounting_type'] == AccountingType.objects.filter(code=6).values('id').first()['id']) + + def test_nature_statement(self): + self.client.login(username='comptable', password='plop') + response_get = self.client.get(reverse("accounting:journal_nature_statement", args=[self.journal.id])) + self.assertTrue("bob (Troll Pench\\xc3\\xa9) : 3.00" in str(response_get.content)) + + def test_person_statement(self): + self.client.login(username='comptable', password='plop') + response_get = self.client.get(reverse("accounting:journal_person_statement", args=[self.journal.id])) + self.assertTrue("S' Kia\\n \\n 3.00" in str(response_get.content)) + + + def test_accounting_statement(self): + self.client.login(username='comptable', password='plop') + response_get = self.client.get(reverse("accounting:journal_accounting_statement", args=[self.journal.id])) + self.assertTrue("443 - Cr\\xc3\\xa9dit - Ce code n'existe pas\\n 3.00" in str(response_get.content)) \ No newline at end of file diff --git a/core/management/commands/populate.py b/core/management/commands/populate.py index db81f0c1..65884269 100644 --- a/core/management/commands/populate.py +++ b/core/management/commands/populate.py @@ -10,7 +10,7 @@ from django.contrib.sites.models import Site from core.models import Group, User, Page, PageRev, SithFile -from accounting.models import GeneralJournal, BankAccount, ClubAccount, Operation, AccountingType, Company +from accounting.models import GeneralJournal, BankAccount, ClubAccount, Operation, AccountingType, SimplifiedAccountingType, Company from club.models import Club, Membership from subscription.models import Subscription from counter.models import Customer, ProductType, Product, Counter @@ -295,22 +295,39 @@ Cette page vise à documenter la syntaxe *Markdown* utilisée sur le site. ca.save() gj = GeneralJournal(name="A16", start_date=date.today(), club_account=ca) gj.save() - credit = AccountingType(code='74', label="Someone gave us money", movement_type='CREDIT') + credit = AccountingType(code='74', label="Subventions d'exploitation", movement_type='CREDIT') credit.save() - debit = AccountingType(code='607', label="Had to pay a beer", movement_type='DEBIT') + debit = AccountingType(code='606', label="Achats non stockés de matières et fournitures(*1)", movement_type='DEBIT') debit.save() - t = AccountingType(code='602', label="Gros test de malade", movement_type='DEBIT') - t.save() - Operation(journal=gj, date=date.today(), amount=32.3, remark="...", mode="CASH", done=True, accounting_type=t, target_type="USER", target_id=skia.id).save() - t = AccountingType(code='60', label="...", movement_type='DEBIT') - t.save() - Operation(journal=gj, date=date.today(), amount=32.3, remark="...", mode="CASH", done=True, accounting_type=t, target_type="USER", target_id=skia.id).save() - Operation(journal=gj, date=date.today(), amount=46.42, remark="An answer to life...", mode="CASH", done=True, accounting_type=t, target_type="USER", target_id=skia.id).save() - Operation(journal=gj, date=date.today(), amount=666.42, - remark="An answer to life...", mode="CASH", done=True, accounting_type=credit, target_type="USER", - target_id=skia.id).save() - Operation(journal=gj, date=date.today(), amount=42, - remark="An answer to life...", mode="CASH", done=False, accounting_type=debit, target_type="CLUB", - target_id=bar_club.id).save() + debit2 = AccountingType(code='604', label="Achats d'études et prestations de services(*2)", movement_type='DEBIT') + debit2.save() + buying = AccountingType(code='60', label="Achats (sauf 603)", movement_type='DEBIT') + buying.save() + comptes = AccountingType(code='6', label="Comptes de charge", movement_type='DEBIT') + comptes.save() + simple = SimplifiedAccountingType(label = 'Je fais du simple 6', accounting_type = comptes, movement_type='DEBIT') + simple.save() woenzco = Company(name="Woenzel & co") woenzco.save() + + operation_list = [ + (27, "J'avais trop de bière", 'CASH', None, buying, 'USER', skia.id, "", None), + (4000, "Ceci n'est pas une opération... en fait si mais non", 'CHECK', None, debit,'COMPANY', woenzco.id, "", 23), + (22, "C'est de l'argent ?", 'CARD', None, credit, 'CLUB', troll.id, "", None), + (37, "Je paye CASH", 'CASH', None, debit2, 'OTHER', None, "tous les étudiants <3", None), + (300, "Paiement Guy", 'CASH', None, buying, 'USER', skia.id, "", None), + (32.3, "Essence", 'CASH', None, buying, 'OTHER', None, "station", None), + (46.42, "Allumette", 'CHECK', None, credit, 'CLUB', main_club.id, "", 57), + (666.42, "Subvention de far far away", 'CASH', None, comptes, 'CLUB', main_club.id, "", None), + (496, "Ça, c'est un 6", 'CARD', simple, None, 'USER', skia.id, "", None), + (17, "La Gargotte du Korrigan", 'CASH', None, debit2, 'CLUB', bar_club.id, "", None), + ] + for op in operation_list: + operation = Operation(journal=gj, date=date.today(), amount=op[0], + remark=op[1], mode=op[2], done=True, simpleaccounting_type=op[3], + accounting_type=op[4], target_type=op[5], target_id=op[6], + target_label=op[7], cheque_number=op[8]) + operation.clean() + operation.save() + +