source: remit/vouchers/models.py @ 6054f18

client
Last change on this file since 6054f18 was 6054f18, checked in by Alex Dehnert <adehnert@…>, 15 years ago

Limit DB->LaTeX to appropriate users

  • Property mode set to 100644
File size: 4.2 KB
Line 
1from django.db import models
2import settings
3import finance_core
4from finance_core.models import BudgetArea, BudgetTerm
5
6import datetime
7
8APPROVAL_STATE_PENDING = 0
9APPROVAL_STATE_APPROVED = 1
10APPROVAL_STATE_REJECTED = -1
11APPROVAL_STATES = (
12    (APPROVAL_STATE_PENDING,  'Pending'),
13    (APPROVAL_STATE_APPROVED, 'Approved'),
14    (APPROVAL_STATE_REJECTED, 'Rejected'),
15)
16
17class ReimbursementRequest(models.Model):
18    submitter = models.CharField(max_length=10) # MIT username of submitter
19    check_to_first_name = models.CharField(max_length=50, verbose_name="check recipient's first name")
20    check_to_last_name = models.CharField(max_length=50, verbose_name="check recipient's last name")
21    check_to_email = models.EmailField(verbose_name="email address for check pickup")
22    check_to_addr = models.TextField(blank=True, verbose_name="address for check mailing", help_text="For most requests, this should be blank for pickup in SAO (W20-549)")
23    amount = models.DecimalField(max_digits=7, decimal_places=2, help_text='Do not include "$"')
24    budget_area = models.ForeignKey(BudgetArea, related_name='as_budget_area')
25    budget_term = models.ForeignKey(BudgetTerm)
26    expense_area = models.ForeignKey(BudgetArea, related_name='as_expense_area') # ~GL
27    request_time = models.DateTimeField(default=datetime.datetime.now)
28    approval_time = models.DateTimeField(blank=True, null=True,)
29    approval_status = models.IntegerField(default=0, choices=APPROVAL_STATES)
30    printing_time = models.DateTimeField(blank=True, null=True,)
31    name = models.CharField(max_length=50, verbose_name='short description', )
32    description = models.TextField(blank=True, verbose_name='long description', )
33
34    class Meta:
35        permissions = (
36            ('can_list', 'Can list requests',),
37            ('can_approve', 'Can approve requests',),
38        )
39
40    def __unicode__(self, ):
41        return "%s: %s %s (%s) (by %s) for $%s" % (
42            self.name,
43            self.check_to_first_name,
44            self.check_to_last_name,
45            self.check_to_email,
46            self.submitter,
47            self.amount,
48        )
49
50    def convert(self, signatory, signatory_email=settings.SIGNATORY_EMAIL):
51        voucher = Voucher()
52        voucher.group_name = settings.GROUP_NAME
53        voucher.account = self.budget_area.get_account_number()
54        voucher.signatory = signatory
55        voucher.signatory_email = signatory_email
56        voucher.first_name = self.check_to_first_name
57        voucher.last_name = self.check_to_last_name
58        voucher.email_address = self.check_to_email
59        voucher.mailing_address = self.check_to_addr
60        voucher.amount = self.amount
61        voucher.description = self.label() + ': ' + self.name
62        voucher.gl = self.expense_area.get_account_number()
63        voucher.save()
64        finance_core.models.make_transfer(
65            self.name,
66            self.amount,
67            finance_core.models.LAYER_EXPENDITURE,
68            self.budget_term,
69            self.budget_area,
70            self.expense_area,
71            self.description,
72        )
73        self.approval_status = 1
74        self.approval_time = datetime.datetime.now()
75        self.save()
76
77    def label(self, ):
78        return settings.GROUP_ABBR + unicode(self.pk) + 'RR'
79
80class Voucher(models.Model):
81    group_name = models.CharField(max_length=10)
82    account = models.IntegerField()
83    signatory = models.CharField(max_length=50)
84    signatory_email = models.EmailField()
85    first_name = models.CharField(max_length=20)
86    last_name = models.CharField(max_length=20)
87    email_address = models.EmailField(max_length=50)
88    mailing_address = models.TextField()
89    amount = models.DecimalField(max_digits=7, decimal_places=2,)
90    description = models.TextField()
91    gl = models.IntegerField()
92    processed = models.BooleanField()
93
94    def mailing_addr_lines(self):
95        import re
96        if self.mailing_address:
97            lst = re.split(re.compile('[\n\r]*'), self.mailing_address)
98            lst = filter(lambda elem: len(elem)>0, lst)
99        else:
100            lst = []
101        lst = lst + ['']*(3-len(lst))
102        return lst
103
104    class Meta:
105        permissions = (
106            ('generate_vouchers', 'Can generate vouchers',),
107        )
108
Note: See TracBrowser for help on using the repository browser.