# # modules/Call.pm # # Developed by Ondrej Jombik # Copyright (c) 2004 Platon SDG, http://platon.sk/ # Licensed under terms of GNU General Public License. # All rights reserved. # # Changelog: # 18/01/2004 - created # # $Platon$ package Call; use strict; use Carp; use vars qw($VERSION @ISA @EXPORT $AUTOLOAD); @ISA = qw(Exporter); @EXPORT = qw( ); $VERSION = '0.1'; use dbh_query; use User; sub new # {{{ { my $this = shift; my $class = ref($this) || $this; my $self = {}; bless $self, $class; return $self; } # }}} sub exist # {{{ { my $call_id = shift; my $query = 'SELECT COUNT(*) FROM calls WHERE call_id = ' . dbh_quote($call_id); return dbh_query( $query, 'SCALAR' ) == 1; } # }}} sub get # {{{ { my $call_id = shift; my $query = 'SELECT a.*, c0.name AS customer, u0.login AS call_login,' . ' u1.login AS created_by_login, u2.login AS changed_by_login FROM calls a' . ' LEFT JOIN customers c0 ON a.cid = c0.cid' . ' LEFT JOIN users u0 ON a.uid = u0.uid' . ' LEFT JOIN users u1 ON a.created_by = u1.uid' . ' LEFT JOIN users u2 ON a.changed_by = u2.uid' . ' WHERE a.call_id = ' . dbh_quote($call_id); my $call = ( dbh_query( $query, 'HASHREF' ) )[0]; $call->{'created_by_login'} ||= User::getAnnonymousLogin(); $call->{'changed_by_login'} ||= User::getAnnonymousLogin(); $call->{'call_login'} ||= User::getAnnonymousLogin(); return $call; } # }}} sub set # {{{ { my $call_id = shift; my $data = shift; my $cur_login = shift; my %real_data = (); my $key; my $val; foreach $key ( keys %$data ) { $val = $data->{$key}; next if ( $key !~ /^(cid|uid|call_date|type|subject|notes)$/ ); $real_data{$key} = dbh_quote($val); } if ( scalar keys %real_data ) { $real_data{'changed_by'} = dbh_quote($cur_login); $real_data{'changed_date'} = 'SYSDATE()'; my $query; if ( Call::exist($call_id) ) { my $delim = ' '; $query = 'UPDATE calls SET'; foreach $key ( keys %real_data ) { $val = $real_data{$key}; $query .= $delim; $query .= $key; $query .= '='; $query .= $val; $delim = ',' if $delim ne ','; } $query .= ' WHERE call_id = ' . dbh_quote($call_id) } else { $query = sprintf( 'INSERT INTO calls' . '(cid, uid, call_date, type, subject, notes,' . ' created_by, created_date, changed_by, changed_date)' . ' VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)', $real_data{'cid'}, $real_data{'uid'}, $real_data{'call_date'}, $real_data{'type'}, $real_data{'subject'}, $real_data{'notes'}, $real_data{'changed_by'}, $real_data{'changed_date'}, $real_data{'changed_by'}, $real_data{'changed_date'} ); } dbh_query( $query, 'UNDEF' ); } } # }}} sub delete # {{{ { my $call_id = shift; my $query = 'DELETE FROM calls WHERE call_id = ' . dbh_quote($call_id); dbh_query( $query, 'UNDEF' ); } # }}} sub getCount # {{{ { my $query = 'SELECT COUNT(*) FROM calls'; return dbh_query( $query, 'SCALAR' ); } # }}} sub getAll # {{{ { return Call::getFilteredList( undef, undef ); } # }}} sub getFilteredList # {{{ { my $where = Call::_createWhere(shift); my $order = Call::_createOrder(shift); my $query = 'SELECT a.*, c0.name AS customer, u0.login AS call_login' . ' FROM calls a' . ' LEFT JOIN customers c0 ON a.cid = c0.cid' . ' LEFT JOIN users u0 ON a.uid = u0.uid'; $query .= " WHERE $where" if ( length $where ); $query .= " ORDER BY $order" if ( length $order ); my $ret = dbh_query( $query, 'HASHREF' ); for ( $_ = 0 ; $_ < scalar(@$ret) ; $_++ ) { $ret->[$_]{'call_login'} ||= User::getAnnonymousLogin(); } return $ret; } # }}} sub _createWhere # {{{ { my $filter = shift; my @ret_ar = (); my $key; my $val; foreach $key ( keys %$filter ) { $val = $filter->{$key}; next if ( $key !~ /^(cid|uid|call_id|call_uid|call_login|customer|call_date|type|subject)$/ ); next if ( !length $val ); if ( $key =~ /^(cid|uid|call_id|call_uid)$/ ) { $key = 'uid' if ( $key eq 'call_uid' ); my %map = ( cid => 'c0.', call_id => 'a.', uid => 'a.' ); push @ret_ar, sprintf( '%s%s = %d', $map{$key}, $key, $val ) if ( $val =~ /\d+/ ); next; } if ( $key eq 'type' ) { push @ret_ar, sprintf( 'LOWER(%s) LIKE LOWER(%s)', "a.$key", dbh_quote($val) ); next; } my $prefix; if ( $key =~ /call_login$/ ) { $key =~ s/call_//g; $prefix = 'u0.'; } elsif ( $key eq 'customer' ) { $key = 'name'; $prefix = 'c0.'; } else { $prefix = 'a.'; } push @ret_ar, sprintf( 'LOWER(%s%s) LIKE LOWER(%s)', $prefix, $key, dbh_quote( '%' . $val . '%' ) ); } return join ( ' AND ', @ret_ar ); } # }}} sub _createOrder # {{{ { my $key = shift; return '' if ( not defined $key ); return '' if ( $key !~ /^[-]?(call_id|call_login|customer|call_date|type|subject)$/ ); my $prefix; if ( $key =~ /call_login$/ ) { $key =~ s/call_//g; $prefix = 'u0.'; } elsif ( $key =~ /customer$/ ) { $key =~ s/customer/name/g; $prefix = 'c0.'; } else { $prefix = 'a.'; } return $prefix . substr( $key, 1 ) . ' DESC' if ( substr( $key, 0, 1 ) eq '-' ); return $prefix . $key; } # }}} 1; __END__ =head1 NAME Call - <<>> =head1 SYNOPSIS use Call; my $xxx = new Call; =head1 DESCRIPTION The Call module allows you ... <<>> =head2 EXPORT <>> =head1 SEE ALSO =head1 AUTHORS Ondrej Jombik, =cut # vim: ts=4 # vim600: fdm=marker fdl=0 fdc=3