[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