[Jifty-commit] r4476 - in apps/spensive: . lib/Spensive lib/Spensive/Model lib/Spensive/View

jifty-commit at lists.jifty.org jifty-commit at lists.jifty.org
Tue Nov 20 12:09:49 EST 2007


Author: jesse
Date: Tue Nov 20 12:09:48 2007
New Revision: 4476

Added:
   apps/spensive/Makefile.PL
   apps/spensive/lib/Spensive/View/Reports.pm
   apps/spensive/notes
Removed:
   apps/spensive/lib/Spensive/View/CRUD.pm
   apps/spensive/lib/Spensive/View/string.pm
   apps/spensive/lib/Spensive/View/translation.pm
Modified:
   apps/spensive/   (props changed)
   apps/spensive/etc/config.yml
   apps/spensive/lib/Spensive/Dispatcher.pm
   apps/spensive/lib/Spensive/Model/Expense.pm
   apps/spensive/lib/Spensive/Model/ExpenseReport.pm
   apps/spensive/lib/Spensive/View.pm
   apps/spensive/lib/Spensive/View/Expenses.pm

Log:
 r58233 at pinglin (orig r6559):  jesse | 2007-06-11 02:35:09 -0400
  r58226 at pinglin:  jesse | 2007-06-11 02:32:21 -0400
   * Checkpoint. make it possible to tie expenses to an expense report
  
 


Added: apps/spensive/Makefile.PL
==============================================================================
--- (empty file)
+++ apps/spensive/Makefile.PL	Tue Nov 20 12:09:48 2007
@@ -0,0 +1,7 @@
+use inc::Module::Install;
+
+name        'Spensive';
+version     '0.01';
+requires    'Jifty' => '0.70117';
+
+WriteAll;

Modified: apps/spensive/etc/config.yml
==============================================================================
--- apps/spensive/etc/config.yml	(original)
+++ apps/spensive/etc/config.yml	Tue Nov 20 12:09:48 2007
@@ -25,7 +25,6 @@
         - User: {}
         - Authentication::Password: {}
         - OpenID: {}
-
   PubSub: 
     Backend: Memcached
     Enable: ~

Modified: apps/spensive/lib/Spensive/Dispatcher.pm
==============================================================================
--- apps/spensive/lib/Spensive/Dispatcher.pm	(original)
+++ apps/spensive/lib/Spensive/Dispatcher.pm	Tue Nov 20 12:09:48 2007
@@ -13,4 +13,12 @@
            };
 
 
+on qr'/report/(\d+)/build' => run {
+    my $report = Spensive::Model::ExpenseReport->new();
+    $report->load($1);
+    set (report => $report);
+    show 'report/build';
+}
+
+
 1;

Modified: apps/spensive/lib/Spensive/Model/Expense.pm
==============================================================================
--- apps/spensive/lib/Spensive/Model/Expense.pm	(original)
+++ apps/spensive/lib/Spensive/Model/Expense.pm	Tue Nov 20 12:09:48 2007
@@ -42,6 +42,8 @@
         case_insensitive => 1
     );              
 
+    warn "Checking $value";
+
     my %items;
     while (my $item = $expenses->next) {
         $items{$item->title}++;

Modified: apps/spensive/lib/Spensive/Model/ExpenseReport.pm
==============================================================================
--- apps/spensive/lib/Spensive/Model/ExpenseReport.pm	(original)
+++ apps/spensive/lib/Spensive/Model/ExpenseReport.pm	Tue Nov 20 12:09:48 2007
@@ -7,15 +7,33 @@
 use Spensive::Record schema {
     column title => type is 'text';
     column description => type is 'text';
-    column submitter => references Spensive::Model::User;
-    # column submitted => type is 'datetime';
-    #column approved => type is 'datetime';
+    column submitted_by => references Spensive::Model::User;
+    column submitted => type is 'datetime';
+    column approved => type is 'datetime';
+    column approved_by => references Spensive::Model::User;
     column status => type is 'text', valid are qw(unsubmitted approved denied);
-    #column approver => type is 'text';
-    #column submit_to => type is 'text';
 };
 
 # Your model-specific methods go here.
 
+# Your model-specific methods go here.
+
+sub before_create {
+    my $self = shift;
+    my $args = shift;
+
+    $args->{'submitted_by'} = $self->current_user->id;
+    return 1;
+}
+
+
+sub after_set_status {
+    my $self = shift;
+    if  ($self->__value('status') eq 'submitted') {
+        $self->__set(column => 'submitted', value => Jifty::DateTime->now());
+    }
+    return 1;
+}
+
 1;
 

Modified: apps/spensive/lib/Spensive/View.pm
==============================================================================
--- apps/spensive/lib/Spensive/View.pm	(original)
+++ apps/spensive/lib/Spensive/View.pm	Tue Nov 20 12:09:48 2007
@@ -17,18 +17,114 @@
         );
         set (search_collection =>  $search);
         render_region(
-            name => 'myregion',
+            name => 'expenses',
             path => '/expenses/list',
             defaults =>
                 { page => 1, id => 'xxx' }
 
         );
     };
+
+    form {
+        my $search = Spensive::Model::ExpenseReportCollection->new();
+        $search->limit(
+            column => 'submitted_by',
+            value  => Jifty->web->current_user->id
+        );
+        set (search_collection =>  $search);
+        render_region(
+            name => 'reports',
+            path => '/reports/list',
+            defaults =>
+                { page => 1, id => 'xxx' }
+
+        );
+    };
 };
 
 
 require Spensive::View::Expenses;
 alias Spensive::View::Expenses under 'expenses/';
 
+require Spensive::View::Reports;
+alias Spensive::View::Reports under 'reports/';
+
+  use Jifty::Plugin::TabView::View;
+
+template 'report/build' => page {
+           my $self = shift;
+    h1 { get('report')->title };
+           render_region( name => 'reports', path => 'report_tabs', defaults => { report => get('report')->id});
+                  
+            
+};
+
+template report_tabs => sub {
+    my $self = shift;
+    $self->render_tabs( 'reports', [qw(report)],
+        qw(attach_reports_tab remove_reports_tab ) );
+};
+
+template 'attach_reports' => sub {
+    my $report_id = get('report');
+    my $report = Spensive::Model::ExpenseReport->new();
+    $report->load($report_id);
+    h2 { _('add some stuff') };
+    
+    my $untied = Spensive::Model::ExpenseCollection->new();
+    $untied->limit( 
+                    column => 'incurred_by',
+                                value  => Jifty->web->current_user->id
+
+    );
+    $untied->limit( column => 'expense_report', operator => 'is', value => 'null', entryaggregator => 'or');
+    $untied->limit( column => 'expense_report', operator => '=', value => '');
+       while (my $item = $untied->next) {
+        render_region (name => 'expense-'.$item->id,
+                        path => 'report/add_expense',
+                            defaults => { id => $item->id, report => $report->id});
+}
+};
+template 'remove_reports' => sub {
+    my $report_id = get('report');
+    my $report = Spensive::Model::ExpenseReport->new();
+    $report->load($report_id);
+    h2 { _('remove some stuff') };
+    
+    my $untied = Spensive::Model::ExpenseCollection->new();
+    $untied->limit( column => 'incurred_by', value  => Jifty->web->current_user->id );
+    $untied->limit( column => 'expense_report', operator => '=', value => $report->id);
+       while (my $item = $untied->next) {
+        render_region (name => 'expense-'.$item->id,
+                        path => 'report/remove_expense',
+                            defaults => { id => $item->id, report => $report->id});
+}
+};
+
+
+
 
+template 'report/add_expense' => sub {
+    my $report = get('report');
+    my $item   = Spensive::Model::Expense->new();
+    $item->load( get 'id' );
+    my $action = Jifty->web->new_action( class    => 'UpdateExpense', record   => $item,);
+    h3 { $item->title, ' - ', $item->cost, " - ", };
+    form {
+        render_param($action => 'expense_report', render_as=>'Hidden', default_value => $report);
+    outs_raw($action->button( onclick=> [{submit => $action, }, { delete => Jifty->web->current_region}] ));
+    }
+};
+
+template 'report/remove_expense' => sub {
+    my $report = get('report');
+    my $item   = Spensive::Model::Expense->new();
+    $item->load( get 'id' );
+    my $action = Jifty->web->new_action( class    => 'UpdateExpense', record   => $item,);
+    h3 { $item->title, ' - ', $item->cost, " - ", };
+    form {
+        render_param($action => 'expense_report', render_as=>'Hidden', default_value => undef);
+    outs_raw($action->button( onclick=> [{submit => $action, }, { delete => Jifty->web->current_region}] ));
+}
+};
 1;

Modified: apps/spensive/lib/Spensive/View/Expenses.pm
==============================================================================
--- apps/spensive/lib/Spensive/View/Expenses.pm	(original)
+++ apps/spensive/lib/Spensive/View/Expenses.pm	Tue Nov 20 12:09:48 2007
@@ -22,17 +22,6 @@
 
 };
 
-
-private template 'edit_item' => sub {
-    my $self = shift;
-    my $action = shift;
-        outs_raw( $action->form_field( 'title', focus => 1) );
-    foreach my $argument ( grep { $_ !~ /(?:incurred_by|local_cost|title)/ }
-        $action->argument_names )
-    {
-        outs_raw( $action->form_field( $argument ) );
-    }
-
-};
+sub display_columns { return (qw(title cost date_incurred  payment_method description)); };
 
 1;

Added: apps/spensive/lib/Spensive/View/Reports.pm
==============================================================================
--- (empty file)
+++ apps/spensive/lib/Spensive/View/Reports.pm	Tue Nov 20 12:09:48 2007
@@ -0,0 +1,34 @@
+package Spensive::View::Reports;
+use strict;
+use warnings;
+
+use Jifty::View::Declare -base;
+use Jifty::View::Declare::CRUD;
+
+import_templates Jifty::View::Declare::CRUD under '/';
+
+sub fragment_base_path {'/reports'}
+
+sub object_type { 'ExpenseReport' }
+
+
+template 'index.html' => page {
+    title is  'Reports' ;
+    form {  
+            render_region(
+                name     => 'reportlist',
+                path     => 'reports/list');
+    }
+
+};
+
+
+
+sub display_columns {
+    my $self = shift;
+    return ('title','description');
+
+}
+
+
+1;

Added: apps/spensive/notes
==============================================================================
--- (empty file)
+++ apps/spensive/notes	Tue Nov 20 12:09:48 2007
@@ -0,0 +1,99 @@
+Organizations have many budgets
+Budgets have lists of people who can submit expenses against them
+Budgets have lists of approving managers.
+
+
+
+
+every expense has:
+
+    summary
+    description
+    cost in local currency
+    payment method
+    local currency
+    cost in home currency
+    time incurred
+    time recorded
+    an expense report it's tied to
+    category (transportation, food, entertainment, lodging, communications, capital purchase)
+    tags. 
+
+    and may have: scanned receipt
+
+
+functionality
+
+
+    let staff report expenses
+    let managers approve expenses
+    let accounting staff track expenses
+    let managers visualize spending
+    let staff visualize their own spending
+
+
+Views
+
+
+    Staff person
+
+        Record expenses
+        Edit my expense report that's not pending approval
+        Submit my expense report that's not pending approval
+
+        See history of all submitted expense reports. 
+
+
+    Approving manager for a team of staff
+
+        See my approved and rejected expense reports
+        Graphs and charts of my team's expenses 
+
+
+    Reimburser
+        See all pending expense reports
+        See all rejected expense reports
+        See all approved expense reports
+
+        Pay out individual expense reports
+
+    Manager for a whole organization
+
+        See all approved and rejected expense reports
+        Approve or reject any expense report
+
+
+
+
+
+
+    Expense ledger
+
+    Expense report for a time period, event or one-time
+
+
+
+
+
+
+
+
+
+audience
+
+    small, medium businesses. fewer than 20 people. BPS
+
+
+
+
+interaction
+
+    browser-submit
+    ofx-submit
+    email-submit of one expense
+    email-submit of many expenses.
+
+
+
+reporting
+


More information about the Jifty-commit mailing list