Index: remit/remit_templates/vouchers/emails/request_approval_admin.txt
===================================================================
--- remit/remit_templates/vouchers/emails/request_approval_admin.txt	(revision 5eb287f761e9b6b8fd3e3900f823020b185ca8d3)
+++ remit/remit_templates/vouchers/emails/request_approval_admin.txt	(revision d50ec5b0ed49d74ae9a68ca7d0988e5e50aba115)
@@ -18,4 +18,5 @@
 Approval Status:    {{ request.approval_status|approval_status }}
 Approval Time:      {{ request.approval_time }}
+Approval Type:      {{ approval_type }}
 
 Check Address:
Index: remit/remit_templates/vouchers/reimbursementrequest_list.html
===================================================================
--- remit/remit_templates/vouchers/reimbursementrequest_list.html	(revision af48a00b31a718273d5f600dba4d9c5733fc4e85)
+++ remit/remit_templates/vouchers/reimbursementrequest_list.html	(revision d50ec5b0ed49d74ae9a68ca7d0988e5e50aba115)
@@ -78,5 +78,11 @@
     </td>
     <td class='request-status-{{ object.approval_status|approval_status_class}}'>
-        {{ object.approval_status|approval_status }} ({{ object.approval_time }})
+        {{ object.approval_status|approval_status }} ({{ object.approval_time|date:"SHORT_DATETIME_FORMAT"}})
+        {% if object.voucher %}
+        <br />[Voucher: {{object.voucher.pk}}]
+        {% endif %}
+        {% if object.rfp %}
+        <br />[{{object.rfp}}]
+        {% endif %}
     </td>
 </tr>
Index: remit/settings.py
===================================================================
--- remit/settings.py	(revision 29e55def499bb2ac6371e9600cce99950b5a896a)
+++ remit/settings.py	(revision d50ec5b0ed49d74ae9a68ca7d0988e5e50aba115)
@@ -39,4 +39,7 @@
 # making browsers want to open in an external application
 LATEX_MIMETYPE = 'application/x-latex'
+
+SHORT_DATETIME_FORMAT = 'Y-m-d G:i'
+SHORT_DATETIME_FORMAT_F = '%Y-%M-%d %H:%M'
 
 from local_settings import *
Index: remit/vouchers/migrations/0008_add_rfp.py
===================================================================
--- remit/vouchers/migrations/0008_add_rfp.py	(revision d50ec5b0ed49d74ae9a68ca7d0988e5e50aba115)
+++ remit/vouchers/migrations/0008_add_rfp.py	(revision d50ec5b0ed49d74ae9a68ca7d0988e5e50aba115)
@@ -0,0 +1,118 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Adding model 'RFP'
+        db.create_table('vouchers_rfp', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('create_time', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime.now)),
+        ))
+        db.send_create_signal('vouchers', ['RFP'])
+
+        # Adding field 'ReimbursementRequest.rfp'
+        db.add_column('vouchers_reimbursementrequest', 'rfp', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['vouchers.RFP'], null=True, blank=True), keep_default=False)
+
+
+    def backwards(self, orm):
+        
+        # Deleting model 'RFP'
+        db.delete_table('vouchers_rfp')
+
+        # Deleting field 'ReimbursementRequest.rfp'
+        db.delete_column('vouchers_reimbursementrequest', 'rfp_id')
+
+
+    models = {
+        'finance_core.budgetarea': {
+            'Meta': {'ordering': "['path']", 'object_name': 'BudgetArea'},
+            'account_number': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'always': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'budget_term': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['finance_core.BudgetTerm']", 'through': "orm['finance_core.BudgetAreaTerm']", 'symmetrical': 'False'}),
+            'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'depth': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'interested': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
+            'numchild': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'owner': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'path': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'use_owner': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+        },
+        'finance_core.budgetareaterm': {
+            'Meta': {'object_name': 'BudgetAreaTerm'},
+            'budget_area': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['finance_core.BudgetArea']"}),
+            'budget_term': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['finance_core.BudgetTerm']"}),
+            'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+        },
+        'finance_core.budgetterm': {
+            'Meta': {'object_name': 'BudgetTerm'},
+            'end_date': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
+            'slug': ('django.db.models.fields.SlugField', [], {'max_length': '20', 'db_index': 'True'}),
+            'start_date': ('django.db.models.fields.DateField', [], {}),
+            'submit_deadline': ('django.db.models.fields.DateField', [], {})
+        },
+        'vouchers.documentation': {
+            'Meta': {'object_name': 'Documentation'},
+            'backing_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '50'}),
+            'submitter': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True'}),
+            'upload_time': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'})
+        },
+        'vouchers.reimbursementrequest': {
+            'Meta': {'ordering': "['id']", 'object_name': 'ReimbursementRequest'},
+            'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '7', 'decimal_places': '2'}),
+            'approval_status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'approval_time': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'budget_area': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'as_budget_area'", 'to': "orm['finance_core.BudgetArea']"}),
+            'budget_term': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['finance_core.BudgetTerm']"}),
+            'check_to_addr': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'check_to_email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
+            'check_to_first_name': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
+            'check_to_last_name': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
+            'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'documentation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['vouchers.Documentation']", 'null': 'True', 'blank': 'True'}),
+            'expense_area': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'as_expense_area'", 'to': "orm['finance_core.BudgetArea']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'incurred_time': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
+            'request_time': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'rfp': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['vouchers.RFP']", 'null': 'True', 'blank': 'True'}),
+            'submitter': ('django.db.models.fields.CharField', [], {'max_length': '30'}),
+            'voucher': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['vouchers.Voucher']", 'null': 'True'})
+        },
+        'vouchers.rfp': {
+            'Meta': {'object_name': 'RFP'},
+            'create_time': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+        },
+        'vouchers.voucher': {
+            'Meta': {'object_name': 'Voucher'},
+            'account': ('django.db.models.fields.IntegerField', [], {}),
+            'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '7', 'decimal_places': '2'}),
+            'description': ('django.db.models.fields.TextField', [], {}),
+            'documentation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['vouchers.Documentation']", 'null': 'True', 'blank': 'True'}),
+            'email_address': ('django.db.models.fields.EmailField', [], {'max_length': '50'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
+            'gl': ('django.db.models.fields.IntegerField', [], {}),
+            'group_name': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
+            'mailing_address': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'process_time': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'processed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'signatory': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
+            'signatory_email': ('django.db.models.fields.EmailField', [], {'max_length': '75'})
+        }
+    }
+
+    complete_apps = ['vouchers']
Index: remit/vouchers/models.py
===================================================================
--- remit/vouchers/models.py	(revision 680b2bdd6f9de45dc7f6371d2f3096802974acdd)
+++ remit/vouchers/models.py	(revision d50ec5b0ed49d74ae9a68ca7d0988e5e50aba115)
@@ -57,5 +57,5 @@
         )
 
-    def create_transfers(self, signatory, signatory_email=None):
+    def create_transfers(self, ):
         finance_core.models.make_transfer(
             self.name,
@@ -108,13 +108,14 @@
         signatory_email: email address of signatory (provide None for default)
         """
-        voucher = self.convert_to_voucher(signatory_name, signatory_email,)
+        self.convert_to_voucher(signatory_name, signatory_email,)
         tmpl = get_template('vouchers/emails/request_approval_admin.txt')
         ctx = Context({
             'approver': approver,
             'request': self,
+            'approval_type': 'voucher',
         })
         body = tmpl.render(ctx)
         mail_admins(
-            'Request approval: %s approved $%s' % (
+            'Request approval: %s approved $%s [voucher]' % (
                 approver,
                 self.amount,
@@ -123,5 +124,20 @@
         )
 
-    def approve_with_rfp(self, approver, ):
+    def approve_as_rfp(self, approver, ):
+        self.convert_to_rfp()
+        tmpl = get_template('vouchers/emails/request_approval_admin.txt')
+        ctx = Context({
+            'approver': approver,
+            'request': self,
+            'approval_type': 'RFP',
+        })
+        body = tmpl.render(ctx)
+        mail_admins(
+            'Request approval: %s approved $%s [RFP]' % (
+                approver,
+                self.amount,
+            ),
+            body,
+        )
         
 
@@ -174,4 +190,9 @@
         )
 
+class RFP(models.Model):
+    create_time = models.DateTimeField(default=datetime.datetime.now)
+
+    def __unicode__(self, ):
+        return "RFP: %s" % (self.create_time.strftime(settings.SHORT_DATETIME_FORMAT_F), )
 
 class Documentation(models.Model):
@@ -289,4 +310,5 @@
     def filter_can_only(cls, actions, user):
         return [ action for action in actions if action.can(user) ]
+
 def bulk_action_approve(http_request, rr):
     approver = http_request.user
@@ -297,4 +319,12 @@
         rr.approve(approver, signatory_name)
         return True, "request approved"
+
+def bulk_action_approve_as_rfp(http_request, rr):
+    approver = http_request.user
+    if rr.rfp:
+        return False, "already marked as RFPized"
+    else:
+        rr.approve_as_rfp(approver, )
+        return True, "request marked as RFPized"
 
 def bulk_action_email_factory(stock_email_obj):
@@ -317,4 +347,10 @@
         perm_predicate=perm_checker('vouchers.can_approve'),
     ))
+bulk_request_actions.append(BulkRequestAction(
+    name='approve_as_rfp',
+    label='Mark Requests as RFPized',
+    action=bulk_action_approve_as_rfp,
+    perm_predicate=perm_checker('vouchers.can_approve'),
+))
 for name, stockemail in stock_emails.items():
     if stockemail.context == 'request':
