#===================================================================== # LedgerSMB # Small Medium Business Accounting software # http://www.ledgersmb.org/ # # Copyright (C) 2006 # This work contains copyrighted information from a number of sources all used # with permission. # # This file contains source code included with or based on SQL-Ledger which # is Copyright Dieter Simader and DWS Systems Inc. 2000-2005 and licensed # under the GNU General Public License version 2 or, at your option, any later # version. For a full list including contact information of contributors, # maintainers, and copyright holders, see the CONTRIBUTORS file. # # Original Copyright Notice from SQL-Ledger 2.6.17 (before the fork): # Copyright (C) 2001 # # Author: DWS Systems Inc. # Web: http://www.sql-ledger.org # # Contributors: # #====================================================================== # # This file has undergone whitespace cleanup # #====================================================================== # # Price Matrix module # # #====================================================================== package PriceMatrix; sub price_matrix_query { my ( $dbh, $form ) = @_; my $query; my $sth; my @queryargs; if ( $form->{customer_id} ) { my $defaultcurrency = $form->{dbh}->quote( $form->{defaultcurrency} ); my $customer_id = $form->{dbh}->quote( $form->{customer_id} ); $query = qq| SELECT p.id AS parts_id, 0 AS customer_id, 0 AS pricegroup_id, 0 AS pricebreak, p.sellprice, NULL AS validfrom, NULL AS validto, (SELECT substr(value,1,3) FROM defaults WHERE setting_key = 'curr') AS curr, '' AS pricegroup FROM parts p WHERE p.id = ? UNION SELECT p.parts_id, p.customer_id, p.pricegroup_id, p.pricebreak, p.sellprice, p.validfrom, p.validto, p.curr, g.pricegroup FROM partscustomer p LEFT JOIN pricegroup g ON (g.id = p.pricegroup_id) WHERE p.parts_id = ? AND p.customer_id = $customer_id UNION SELECT p.parts_id, p.customer_id, p.pricegroup_id, p.pricebreak, p.sellprice, p.validfrom, p.validto, p.curr, g.pricegroup FROM partscustomer p LEFT JOIN pricegroup g ON (g.id = p.pricegroup_id) JOIN customer c ON (c.pricegroup_id = g.id) WHERE p.parts_id = ? AND c.id = $customer_id UNION SELECT p.parts_id, p.customer_id, p.pricegroup_id, p.pricebreak, p.sellprice, p.validfrom, p.validto, p.curr, g.pricegroup FROM partscustomer p LEFT JOIN pricegroup g ON (g.id = p.pricegroup_id) WHERE p.customer_id = 0 AND p.pricegroup_id = 0 AND p.parts_id = ? ORDER BY customer_id DESC, pricegroup_id DESC, pricebreak |; $sth = $dbh->prepare($query) || $form->dberror($query); } elsif ( $form->{vendor_id} ) { my $vendor_id = $form->{dbh}->quote( $form->{vendor_id} ); # price matrix and vendor's partnumber $query = qq| SELECT partnumber FROM partsvendor WHERE parts_id = ? AND vendor_id = $vendor_id|; $sth = $dbh->prepare($query) || $form->dberror($query); } $sth; } sub price_matrix { my ( $pmh, $ref, $transdate, $decimalplaces, $form, $myconfig ) = @_; $ref->{pricematrix} = ""; my $customerprice; my $pricegroupprice; my $sellprice; my $mref; my %p = (); # depends if this is a customer or vendor if ( $form->{customer_id} ) { $pmh->execute( $ref->{id}, $ref->{id}, $ref->{id}, $ref->{id} ); while ( $mref = $pmh->fetchrow_hashref(NAME_lc) ) { $form->db_parse_numeric(sth=>$sth, hashref=>$mref); # check date if ( $mref->{validfrom} ) { next if $transdate < $form->datetonum( $myconfig, $mref->{validfrom} ); } if ( $mref->{validto} ) { next if $transdate > $form->datetonum( $myconfig, $mref->{validto} ); } # convert price $sellprice = $form->round_amount( $mref->{sellprice} * $form->{ $mref->{curr} }, $decimalplaces ); if ( $mref->{customer_id} ) { $ref->{sellprice} = $sellprice if !$mref->{pricebreak}; $p{ $mref->{pricebreak} } = $sellprice; $customerprice = 1; } if ( $mref->{pricegroup_id} ) { if ( !$customerprice ) { $ref->{sellprice} = $sellprice if !$mref->{pricebreak}; $p{ $mref->{pricebreak} } = $sellprice; } $pricegroupprice = 1; } if ( !$customerprice && !$pricegroupprice ) { $p{ $mref->{pricebreak} } = $sellprice; } } $pmh->finish; if (%p) { if ( $ref->{sellprice} ) { $p{0} = $ref->{sellprice}; } for ( sort { $a <=> $b } keys %p ) { $ref->{pricematrix} .= "${_}:$p{$_} "; } } else { if ($init) { $ref->{sellprice} = $form->round_amount( $ref->{sellprice}, $decimalplaces ); } else { $ref->{sellprice} = $form->round_amount( $ref->{sellprice} * ( 1 - $form->{tradediscount} ), $decimalplaces ); } $ref->{pricematrix} = "0:$ref->{sellprice} " if $ref->{sellprice}; } chop $ref->{pricematrix}; } if ( $form->{vendor_id} ) { $pmh->execute( $ref->{id} ); $mref = $pmh->fetchrow_hashref(NAME_lc); $form->db_parse_numeric(sth=>$sth, hashref=>$mref); if ( $mref->{partnumber} ne "" ) { $ref->{partnumber} = $mref->{partnumber}; } if ( $mref->{lastcost} ) { # do a conversion $ref->{sellprice} = $form->round_amount( $mref->{lastcost} * $form->{ $mref->{curr} }, $decimalplaces ); } $pmh->finish; $ref->{sellprice} *= 1; # add 0:price to matrix $ref->{pricematrix} = "0:$ref->{sellprice}"; } } 1;