diff options
Diffstat (limited to 'LedgerSMB/PriceMatrix.pm')
-rw-r--r-- | LedgerSMB/PriceMatrix.pm | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/LedgerSMB/PriceMatrix.pm b/LedgerSMB/PriceMatrix.pm new file mode 100644 index 00000000..ad2d3b08 --- /dev/null +++ b/LedgerSMB/PriceMatrix.pm @@ -0,0 +1,204 @@ +#===================================================================== +# 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(curr,1,3) FROM defaults) AS curr, + '' AS pricegroup + FROM parts p + WHERE p.id = ? + + UNION + + SELECT p.*, 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.*, 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.*, '' AS pricegroup + FROM partscustomer p + 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)) { + + # 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); + + 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; |