Initial commit.
[fsij-members-webapp.git] / membership / models.py
1 from django.db import models
2 from django.contrib.auth.models import User
3 from fsij.accounting.models import LedgerEntry
4
5 # member_type
6 # 1: member
7 # 2: student member
8 # 3: associate member (corporate member)
9 class MemberType(models.Model):
10     name = models.CharField(max_length=10)
11     def __unicode__(self):
12         return self.name
13
14 class Member(models.Model):
15     user = models.ForeignKey(User, unique=True, blank=True, null=True)
16     member_id = models.CharField(max_length=10)
17     member_type = models.ForeignKey(MemberType)
18     name_in_alphabet = models.CharField(max_length=50, blank=True)
19     date_join = models.DateField('date joined', blank=True, null=True)
20     date_quit = models.DateField('date quit', blank=True, null=True)
21     advance_payment = models.IntegerField()
22     def __unicode__(self):
23         return self.member_id + "/" + self.name()
24     class Meta:
25         permissions = (("can_manage", "Can manage members"),)
26     def name(self):
27         if self.member_type.id == 3:
28             try:
29                 corp = self.corporatemember
30             except (Corporatemember.DoesNotExist):
31                 corp = None
32             if corp:
33                 return corp.corporate_name
34         elif self.user:
35             return self.user.last_name + " " + self.user.first_name
36         return self.name_in_alphabet
37
38 class CorporateMember(models.Model):
39     member = models.OneToOneField(Member)
40     corporate_name = models.CharField(max_length=50)
41     contact_person = models.CharField(max_length=50)
42     contribution = models.IntegerField() # Kuchi-Suu in Japanese
43     def __unicode__(self):
44         return self.corporate_name
45
46 class MemberAddress(models.Model):
47     member = models.ForeignKey(Member, unique=True)
48     contact_is_home = models.BooleanField()
49     zip_code = models.CharField(max_length=12)
50     address_line1 = models.CharField(max_length=30)
51     address_line2 = models.CharField(max_length=30, blank=True)
52     address_line3 = models.CharField(max_length=30, blank=True)
53     affiliation = models.CharField(max_length=80, blank=True)
54     date_updated = models.DateField()
55     def __unicode__(self):
56         return self.zip_code
57
58 # MemberFee -- Object which stands for member's fee
59 # Instance example: admission_fee, 2002 member's fee, ...
60 # Secretariat creates one for each year
61 class MemberFee(models.Model):
62     year = models.IntegerField()
63     def __unicode__(self):
64         if self.year == 9999:
65             return "Admission"
66         else:
67             return "%04d" % self.year
68
69 class MemberPayment(models.Model):
70     member = models.ForeignKey(Member)
71     date = models.DateField()
72     fee = models.ForeignKey(MemberFee)
73     # member type as of payment time
74     member_type = models.ForeignKey(MemberType)
75     # contribution as of payment time, valid if member_type.id == 3
76     contribution = models.IntegerField() # Kuchi-Suu in Japanese
77     t_i = models.ForeignKey(LedgerEntry, unique=True, blank=True, null=True)
78     def __unicode__(self):
79         return self.member.__unicode__() + "/" + self.fee.__unicode__()
80
81 def get_valid_member(year):
82     list_2 = MemberPayment.objects.filter(date__year = (year - 2)).order_by('member').values('member').distinct()
83     list_1 = MemberPayment.objects.filter(date__year = (year - 1)).order_by('member').values('member').distinct()
84     list_0 = MemberPayment.objects.filter(date__year = year).order_by('member').values('member').distinct()
85     members = []
86     for m in list_0:
87         members.append(m['member'])
88     for m in list_1:
89         if not m['member'] in members:
90             members.append(m['member'])
91     for m in list_2:
92         if not m['member'] in members:
93             members.append(m['member'])
94     member_list = []
95     for m in Member.objects.filter(id__in=members):
96         if (not m.date_quit) or m.date_quit.year >= year:
97             member_list.append(m)
98     return member_list