# # modules/Products.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: # 17/01/2004 - created # # $Platon$ package Product; 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 $prod_id = shift; my $query = 'SELECT COUNT(*) FROM products WHERE prod_id = ' . dbh_quote($prod_id); return dbh_query( $query, 'SCALAR' ) == 1; } # }}} sub get # {{{ { my $prod_id = shift; my $query = 'SELECT p.*,' . ' u1.login AS created_by_login, u2.login AS changed_by_login FROM products p' . ' LEFT JOIN users u1 ON p.created_by = u1.uid' . ' LEFT JOIN users u2 ON p.changed_by = u2.uid' . ' WHERE p.prod_id = ' . dbh_quote($prod_id); my $product = ( dbh_query( $query, 'HASHREF' ) )[0]; $product->{'created_by_login'} ||= User::getAnnonymousLogin(); $product->{'changed_by_login'} ||= User::getAnnonymousLogin(); return $product; } # }}} sub set # {{{ { my $prod_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 !~ /^(name|description|otc_price|frc_price|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 ( Product::exist($prod_id) ) { my $delim = ' '; $query = 'UPDATE products SET'; foreach $key ( keys %real_data ) { $val = $real_data{$key}; $query .= $delim; $query .= $key; $query .= '='; $query .= $val; $delim = ',' if $delim ne ','; } $query .= ' WHERE prod_id = ' . dbh_quote($prod_id) } else { $query = sprintf( 'INSERT INTO products' . '(name, description, notes, otc_price, frc_price,' . ' created_by, created_date, changed_by, changed_date)' . ' VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)', $real_data{'name'}, $real_data{'description'}, $real_data{'notes'}, $real_data{'otc_price'}, $real_data{'frc_price'}, $real_data{'changed_by'}, $real_data{'changed_date'}, $real_data{'changed_by'}, $real_data{'changed_date'} ); } dbh_query( $query, 'UNDEF' ); } } # }}} sub delete # {{{ { my $prod_id = shift; my $query = 'DELETE FROM products WHERE prod_id = ' . dbh_quote($prod_id); dbh_query( $query, 'UNDEF' ); } # }}} sub getCount # {{{ { my $query = 'SELECT COUNT(*) FROM products'; return dbh_query( $query, 'SCALAR' ); } # }}} sub getAll # {{{ { return Product::getFilteredList( undef, undef ); } # }}} sub getFilteredList # {{{ { my $where = Product::_createWhere(shift); my $order = Product::_createOrder(shift); my $query = 'SELECT * FROM products'; $query .= " WHERE $where" if ( length $where ); $query .= " ORDER BY $order" if ( length $order ); my $ret = dbh_query( $query, 'HASHREF' ); return $ret; } # }}} sub _createWhere # {{{ { my $filter = shift; my @ret_ar = (); my $key; my $val; foreach $key ( keys %$filter ) { $val = $filter->{$key}; next if ( $key !~ /^(prod_id|name|description|otc_price|frc_price)$/ ); next if ( !length $val ); if ( $key eq 'prod_id' ) { push @ret_ar, sprintf( '%s = %d', $key, $val ) if ( $val =~ /\d+/ ); next; } if ( $key =~ /_price$/ ) { push @ret_ar, sprintf( '%s = %f', $key, $val ) if ( $val =~ /[\d]*(\.|\d)[\d]*/ ); next; } push @ret_ar, sprintf( 'LOWER(%s) LIKE LOWER(%s)', $key, dbh_quote( '%' . $val . '%' ) ); } return join ( ' AND ', @ret_ar ); } # }}} sub _createOrder # {{{ { my $key = shift; return '' if ( not defined $key ); return '' if ( $key !~ /^[-]?(prod_id|name|description|otc_price|frc_price)$/ ); return substr( $key, 1 ) . ' DESC' if ( substr( $key, 0, 1 ) eq '-' ); return $key; } # }}} 1; __END__ =head1 NAME Product - <<>> =head1 SYNOPSIS use Product; my $xxx = new Product; =head1 DESCRIPTION The Product module allows you ... <<>> =head2 EXPORT <>> =head1 SEE ALSO =head1 AUTHORS Ondrej Jombik, =cut # vim: ts=4 # vim600: fdm=marker fdl=0 fdc=3