Member payment interface change.
[fsij-members-webapp.git] / membership / models.py
1 # -*- coding: utf-8-*-
2
3 from django.db import models
4 from django.contrib.auth.models import User
5 from fsij.accounting.models import LedgerEntry
6 from django.utils.translation import ugettext_lazy as _
7 from django.core.exceptions import ObjectDoesNotExist
8
9 MEMBER_TYPE = ( ('M', u'正会員'), ('S', u'学生会員'), ('A', u'賛助会員'), )
10
11 class Member(models.Model):
12     user = models.ForeignKey(User, unique=True, blank=True, null=True)
13     member_id = models.CharField(max_length=10)
14     member_type = models.CharField(max_length=1, choices=MEMBER_TYPE)
15     name_in_alphabet = models.CharField(max_length=50, blank=True)
16     first_name = models.CharField(max_length=30, blank=True)
17     last_name = models.CharField(max_length=30, blank=True)
18     email = models.EmailField(_('e-mail address'), blank=True)
19     date_joined = 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     class Meta:
23         permissions = (("can_manage", "Can manage members"),)
24     def __unicode__(self):
25         return self.member_id + "/" + self.name()
26     def name(self):
27         if self.member_type == 'A':
28             try:
29                 return self.corporatemember.__unicode__()
30             except ObjectDoesNotExist:
31                 return "A: " + self.last_name + " " + self.first_name
32         else:
33             return self.last_name + " " + self.first_name
34
35 class CorporateMember(models.Model):
36     member = models.OneToOneField(Member,primary_key=True)
37     corporate_name = models.CharField(max_length=50)
38     contribution = models.IntegerField() # Kuchi-Suu in Japanese
39     def __unicode__(self):
40         return self.corporate_name
41
42 class MemberAddress(models.Model):
43     member = models.ForeignKey(Member, unique=True)
44     contact_is_home = models.BooleanField()
45     zip_code = models.CharField(max_length=12)
46     address_line1 = models.CharField(max_length=30)
47     address_line2 = models.CharField(max_length=30, blank=True)
48     address_line3 = models.CharField(max_length=30, blank=True)
49     affiliation = models.CharField(max_length=80, blank=True)
50     date_updated = models.DateField()
51     def __unicode__(self):
52         return self.zip_code
53
54 class MemberPayment(models.Model):
55     member = models.ForeignKey(Member)
56     date = models.DateField()
57     #
58     # FEE_YEAR: Financial year to which this payment is connected
59     #           9999 means Admission-fee, 0 means Advance-payment
60     #
61     fee_year = models.IntegerField()
62     # member type as of payment time
63     member_type = models.CharField(max_length=1, choices=MEMBER_TYPE)
64     # contribution as of payment time, valid if member_type == 'A'
65     contribution = models.IntegerField() # Kuchi-Suu in Japanese
66     le = models.ForeignKey(LedgerEntry, unique=True, blank=True, null=True)
67     def __unicode__(self):
68         if self.fee_year == 0:
69             payment_fee_str = u'前受金'
70         elif self.fee_year == 9999:
71             payment_fee_str = u'入会金'
72         else:
73             payment_fee_str = "%04d" % self.fee_year
74         return self.member.__unicode__() + "/" + payment_fee_str
75
76 def get_valid_member(year):
77     list_2 = MemberPayment.objects.filter(date__year = (year - 2)).order_by('member').values('member').distinct()
78     list_1 = MemberPayment.objects.filter(date__year = (year - 1)).order_by('member').values('member').distinct()
79     list_0 = MemberPayment.objects.filter(date__year = year).order_by('member').values('member').distinct()
80     members = []
81     for m in list_0:
82         members.append(m['member'])
83     for m in list_1:
84         if not m['member'] in members:
85             members.append(m['member'])
86     for m in list_2:
87         if not m['member'] in members:
88             members.append(m['member'])
89     member_list = []
90     for m in Member.objects.filter(id__in=members):
91         if (not m.date_quit) or m.date_quit.year >= year:
92             member_list.append(m)
93     return member_list