diff options
-rw-r--r-- | LedgerSMB/Admin.pm | 179 | ||||
-rw-r--r-- | LedgerSMB/DBObject/User.pm | 80 | ||||
-rw-r--r-- | LedgerSMB/Employee.pm | 91 |
3 files changed, 350 insertions, 0 deletions
diff --git a/LedgerSMB/Admin.pm b/LedgerSMB/Admin.pm new file mode 100644 index 00000000..8e6c5dfd --- /dev/null +++ b/LedgerSMB/Admin.pm @@ -0,0 +1,179 @@ +package LedgerSMB::DBObject::Admin; + +use base LedgerSMB::DBObject; + +use LedgerSMB::DBObject::Location; +use LedgerSMB::DBObject::Employee; +use LedgerSMB::DBObject::Contact; + +sub save_user { + + my $self = shift @_; + + my $entity_id = shift @{ $self->exec_method( procname => "save_user" ) }; + $self->merge($entity_id); + + my $employee = LedgerSMB::DBObject::Employee->new(base=>$self, copy=>'list', + merge=>[ + 'salutation', + 'first_name', + 'last_name', + 'employeenumber', + ] + ); + + $employee->{entity_id} = $entity_id->{id}; + $employee->save_employee(); + + my $loc = LedgerSMB::DBObject::Location->new(base=>$self, copy=>'list', + merge=>[ + 'address1', + 'address2', + 'city', + 'state', + 'zipcode', + 'country', + 'companyname', + ] + ); + $loc->save_location(); + $loc->join_to_person(person=>$employee); + + + my $contact = LedgerSMB::DBObject::Contact->new(base=>$self, copy=>'list', + merge=>[ + 'workphone', + 'homephone', + 'email', + ] + ); + + $contact->save_homephone(person=>$employee); + $contact->save_workphone(person=>$employee); + $contact->save_email(person=>$employee); + + my $roles = $self->exec_method( procname => "all_roles" ); + my $user_roles = $self->exec_method(procname => "get_user_roles", args=>[ $self->{ modifying_user } ] ); + + my %active_roles; + for my $role (@{$user_roles}) { + + # These are our user's roles. + + $active_roles{$role} = 1; + } + + my $status; + + for my $role ( @{ $roles } ) { + + # These roles are were ALL checked on the page, so they're the active ones. + + if ($active_roles{$role} && $self->{incoming_roles}->{$role}) { + + # do nothing. + } + elsif ($active_roles{$role} && !($self->{incoming_roles}->{$role} )) { + + # do remove function + $status = $self->exec_method(procname => "remove_user_from_role", + args=>[ $self->{ modifying_user }, $role ] + } + elsif ($self->{incoming_roles}->{$role} and !($active_roles{$role} )) { + + # do add function + $status = $self->exec_method(procname => "add_user_to_role", + args=>[ $self->{ modifying_user }, $role ] + ); + } + } +} + +sub save_group { + + my $self = shift @_; + + my $existant = shift @{ $self->exec_method (procname=> "is_group", args=>[$self->{modifying_group}]) }; + + my $group = shift @{ $self->exec_method (procname=> "save_group") }; + + # first we grab all roles + + my $roles = $self->exec_method( procname => "all_roles" ); + my $user_roles = $self->exec_method(procname => "get_user_roles", + args=>[ $self->{ group_name } ] + ); + + my %active_roles; + for my $role (@{$user_roles}) { + + # These are our user's roles. + + $active_roles{$role} = 1; + } + + my $status; + + for my $role ( @{ $roles } ) { + + # These roles are were ALL checked on the page, so they're the active ones. + + if ($active_roles{$role} && $self->{incoming_roles}->{$role}) { + + # we don't need to do anything. + } + elsif ($active_roles{$role} && !($self->{incoming_roles}->{$role} )) { + + # do remove function + $status = $self->exec_method( + procname => "remove_group_from_role", + args=>[ $self->{ modifying_user }, $role ] + ); + } + elsif ($self->{incoming_roles}->{$role} and !($active_roles{$role} )) { + + # do add function + $status = $self->exec_method( + procname => "add_group_to_role", + args=>[ $self->{ modifying_user }, $role ] + ); + } + } +} + + +sub delete_user { + + my $self = shift @_; + + my $status = shift @{ $self->exec_method(procname=>'delete_user', args=>[$self->{modifying_user}]) }; + + if ($status) { + + return 1; + } else { + + my $error = LedgerSMB::Error->new("Delete user failed."); + $error->set_status($status); + return $error; + } +} + +sub delete_group { + + my $self = shift @_; + + my $status = shift @{ $self->exec_method(procname=>'delete_group', args=>[$self->{groupname}])}; + + if ($status) { + + return 1; + } else { + + my $error = LedgerSMB::Error->new("Delete group failed."); + $error->set_status($status); + return $error; + } +} + +1;
\ No newline at end of file diff --git a/LedgerSMB/DBObject/User.pm b/LedgerSMB/DBObject/User.pm new file mode 100644 index 00000000..c84c6336 --- /dev/null +++ b/LedgerSMB/DBObject/User.pm @@ -0,0 +1,80 @@ +package LedgerSMB::DBObject::User; + +use base qw/LedgerSMB::DBObject/; + +sub save { + + my $self = shift @_; + + my $user = $self->get(); + + if ( $user->{id} && $self->{is_a_user} ) { + + # doesn't check for the password - that's done in the sproc. + $self->{id} = shift @{ $self->exec_method(procname=>'admin__save_user', + args=>[$user->{id}, $self->{username}, $self->{password}] ) }; + if (!$self->{id}) { + + return 0; + } + } + elsif ($user && !$self->{is_a_user}) { + + # there WAS a user, and we've decided we want that user to go away now. + + $self->{id} = $user->{id}; + return $self->remove(); + + } + elsif ($self->{is_a_user}) { + + # No user ID, meaning, creating a new one. + $self->{id} = shift @{ $self->exec_method(procname=>'admin__save_user', + args=>[undef, $self->{username}, $self->{password}] ) }; + } + return 1; +} + +sub get { + + my $self = shift @_; + + my ($user_id, $username) = @{ $self->exec_method(procname=>'admin__get_user', + args=>[$self->{id}])}; + + return {id=>$user_id, username=>$username}; +} + +sub remove { + + my $self = shift; + + my $code = $self->exec_method(procname=>"admin__delete_user", args=>[$self->{id}, $self->{username}]); + $self->{id} = undef; # never existed.. + + return $code->[0]; +} + +sub save_prefs { + + my $self = shift @_; + + my $pref_id = $self->exec_method(procname=>"admin__save_preferences", + args=>[ + 'language', + 'stylesheet', + 'printer', + 'dateformat', + 'numberformat' + ] + ); +} + +sub get_all_users { + + my $self = shift @_; + + $self->{users} = $self->exec_method( procname=>"user__get_all_users" ); +} + +1; diff --git a/LedgerSMB/Employee.pm b/LedgerSMB/Employee.pm new file mode 100644 index 00000000..e792aa84 --- /dev/null +++ b/LedgerSMB/Employee.pm @@ -0,0 +1,91 @@ + +=head1 NAME + +LedgerSMB::Employee - LedgerSMB class for managing Employees + +=head1 SYOPSIS + +This module creates object instances based on LedgerSMB's in-database ORM. + +=head1 METHODS + +The following method is static: + +=over + +=item new ($LedgerSMB object); + +=back + +The following methods are passed through to stored procedures via Autoload. + +=over + +=item save + +=item get + +=item search + +=item list_managers + +The above list may grow over time, and may depend on other installed modules. + +=back + +=head1 Copyright (C) 2007, The LedgerSMB core team. + +This file is licensed under the Gnu General Public License version 2, or at your +option any later version. A copy of the license should have been included with +your software. + +=cut + +package LedgerSMB::Employee; +use base qw(LedgerSMB::DBObject); +use strict; +our $VERSION = '1.0.0'; + +sub save { + my $self = shift; + + my $hashref = shift @{ $self->exec_method( procname => "employee_save" ) }; + $self->merge( $hashref, 'id' ); +} + +sub get { + my $self = shift; + my $hashref = shift @{ $self->exec_method( procname => "employee_get" ) }; + $self->merge( $hashref, keys %{$hashref} ); +} + +sub list_managers { + my $self = shift; + $self->{manager_list} = + $self->exec_method( procname => "employee_list_managers" ); +} + +sub search { + my $self = shift; + $self->{search_results} = + $self->exec_method( procname => "employee_search" ); +} + +sub set_location { + + my $self = shift @_; + my $location = shift @_; + + my $code = $self->exec_method ( procname => 'employee_set_location', + args=>[ $self->{id}, $location->{id} ] ); + + if ($code) { + + # good, it worked. + + return 1; + } + return 0; +} + +1; |