Bivio::Biz::Model::Motion
# Copyright (c) 2007-2011 bivio Software, Inc. All Rights Reserved.
# $Id$
package Bivio::Biz::Model::Motion;
use strict;
use Bivio::Base 'Model.RealmBase';
my($_DT) = b_use('Type.DateTime');
my($_MS) = b_use('Type.MotionStatus');
my($_MT) = b_use('Type.MotionType');
my($_VT) = b_use('Type.MotionVote');
sub create {
my($self, $values) = @_;
$values->{name_lc} = lc($values->{name});
$values->{type} ||= $_MT->VOTE_PER_USER;
$values->{status} ||= $_MS->OPEN;
if ($values->{status}->eq_open) {
$values->{start_date_time} ||= $_DT->now;
}
return shift->SUPER::create(@_);
}
sub update {
my($self, $values) = @_;
if ($values->{name}) {
$values->{name_lc} = lc($values->{name});
}
if ($values->{status}
&& $values->{status} != $self->get('status')) {
if ($values->{status}->eq_open) {
$values->{start_date_time} = $_DT->now;
$values->{end_date_time} = undef;
}
elsif ($values->{status}->eq_closed) {
$values->{end_date_time} = $_DT->now;
}
}
return shift->SUPER::update(@_);
}
sub internal_initialize {
my($self) = @_;
return $self->merge_initialize_info($self->SUPER::internal_initialize, {
version => 1,
table_name => 'motion_t',
columns => {
motion_id => ['PrimaryId', 'PRIMARY_KEY'],
name => ['Line', 'NOT_NULL'],
name_lc => ['Line', 'NOT_NULL'],
question => ['Text64K', 'NOT_NULL'],
status => ['MotionStatus', 'NOT_NULL'],
type => ['MotionType', 'NOT_NULL'],
start_date_time => ['DateTime', 'NONE'],
end_date_time => ['DateTime', 'NONE'],
motion_file_id => ['RealmFile.realm_file_id', 'NONE'],
tuple_def_id => ['TupleUse.tuple_def_id', 'NONE'],
},
other => [
[qw(realm_id RealmOwner.realm_id)],
[qw(motion_file_id RealmFile.realm_file_id)],
[qw(tuple_def_id TupleDef.tuple_def_id)],
],
});
}
sub is_open {
my($self) = @_;
my($end) = $self->get('end_date_time');
return 1 unless $end;
return $_DT->compare_defined($end, $_DT->now) > 0 ? 1 : 0;
}
sub vote_count {
my($self, $vote_type) = @_;
return b_use('SQL.Connection')->execute_one_row('
SELECT COUNT(*)
FROM motion_vote_t mv
WHERE mv.motion_id = ?
' . ($vote_type ? 'AND mv.vote = ?' : ''),
[$self->get('motion_id'), $vote_type->as_sql_param || ()])->[0];
}
sub vote_count_abstain {
return shift->vote_count($_VT->ABSTAIN);
}
sub vote_count_no {
return shift->vote_count($_VT->NO);
}
sub vote_count_yes {
return shift->vote_count($_VT->YES);
}
1;