# get makes
if ($form->{makemodel}) {
- $query = qq|SELECT m.make, m.model FROM makemodel m | .
- qq|WHERE m.parts_id = ?|;
+ #hli
+ $query = qq|SELECT m.make, m.model,m.lastcost,m.lastcost,m.lastupdate,m.sortorder FROM makemodel m | .
+ qq|WHERE m.parts_id = ? order by m.sortorder asc|;
my @values = ($form->{id});
$sth = $dbh->prepare($query);
$sth->execute(@values) || $form->dberror("$query (" . join(', ', @values) . ")");
my $i = 1;
- while (($form->{"make_$i"}, $form->{"model_$i"}) = $sth->fetchrow_array)
+
+ while (($form->{"make_$i"}, $form->{"model_$i"}, $form->{"old_lastcost_$i"},
+ $form->{"lastcost_$i"}, $form->{"lastupdate_$i"}, $form->{"sortorder_$i"}) = $sth->fetchrow_array)
{
$i++;
}
}
($form->{id}) = selectrow_query($form, $dbh, qq|SELECT nextval('id')|);
- do_query($form, $dbh, qq|INSERT INTO parts (id, partnumber) VALUES (?, '')|, $form->{id});
+ do_query($form, $dbh, qq|INSERT INTO parts (id, partnumber, unit) VALUES (?, '', '')|, $form->{id});
$form->{orphaned} = 1;
if ($form->{partnumber} eq "" && $form->{"item"} eq "service") {
# insert makemodel records
unless ($form->{item} eq 'service') {
+ my $lastupdate = '';
+ my $value = 0;
for my $i (1 .. $form->{makemodel_rows}) {
if (($form->{"make_$i"}) || ($form->{"model_$i"})) {
-
- $query = qq|INSERT INTO makemodel (parts_id, make, model) | .
- qq|VALUES (?, ?, ?)|;
- @values = (conv_i($form->{id}), conv_i($form->{"make_$i"}), $form->{"model_$i"});
+ #hli
+ $value = $form->parse_amount($myconfig, $form->{"lastcost_$i"});
+ if ($value == $form->parse_amount($myconfig, $form->{"old_lastcost_$i"}))
+ {
+ if ($form->{"lastupdate_$i"} eq "") {
+ $lastupdate = 'now()';
+ } else {
+ $lastupdate = $dbh->quote($form->{"lastupdate_$i"});
+ }
+ } else {
+ $lastupdate = 'now()';
+ }
+ $query = qq|INSERT INTO makemodel (parts_id, make, model, lastcost, lastupdate, sortorder) | .
+ qq|VALUES (?, ?, ?, ?, ?, ?)|;
+ @values = (conv_i($form->{id}), conv_i($form->{"make_$i"}), $form->{"model_$i"}, $value, $lastupdate, conv_i($form->{"sortorder_$i"}) );
do_query($form, $dbh, $query, @values);
}
}
}
- CVar->save_custom_variables('dbh' => $dbh,
- 'module' => 'IC',
- 'trans_id' => $form->{id},
- 'variables' => $form);
+ CVar->save_custom_variables(dbh => $dbh,
+ module => 'IC',
+ trans_id => $form->{id},
+ variables => $form,
+ save_validity => 1);
# commit
my $rc = $dbh->commit;
my @makemodel_filters = qw(make model);
my @invoice_oi_filters = qw(serialnumber soldtotal);
my @apoe_filters = qw(transdate);
- my @like_filters = (@simple_filters, @makemodel_filters, @invoice_oi_filters);
+ my @like_filters = (@simple_filters, @invoice_oi_filters);
my @all_columns = (@simple_filters, @makemodel_filters, @apoe_filters, qw(serialnumber));
my @simple_l_switches = (@all_columns, qw(listprice sellprice lastcost priceupdate weight unit bin rop image));
my @oe_flags = qw(bought sold onorder ordered rfq quoted);
SELECT id, name, 'customer' AS cv FROM customer UNION
SELECT id, name, 'vendor' AS cv FROM vendor
) AS cv ON cv.id = apoe.customer_id OR cv.id = apoe.vendor_id|,
+ mv => 'LEFT JOIN vendor AS mv ON mv.id = mm.make',
);
- my @join_order = qw(partsgroup makemodel invoice_oi apoe cv pfac);
+ my @join_order = qw(partsgroup makemodel mv invoice_oi apoe cv pfac);
my %table_prefix = (
deliverydate => 'apoe.', serialnumber => 'ioi.',
ordnumber => 'apoe.', make => 'mm.',
quonumber => 'apoe.', model => 'mm.',
invnumber => 'apoe.', partsgroup => 'pg.',
- lastcost => ' ', , soldtotal => ' ',
+ lastcost => 'p.', , soldtotal => ' ',
factor => 'pfac.',
'SUM(ioi.qty)' => ' ',
description => 'p.',
WHERE (a_lc.id = p.id)) AS lastcost|;
$table_prefix{$q_assembly_lastcost} = ' ';
+ # special case makemodel search
+ # all_parts is based upon the assumption that every parameter is named like the column it represents
+ # unfortunately make would have to match vendor.name which is already taken for vendor.name in bsooqr mode.
+ # fortunately makemodel doesn't need to be displayed later, so adding a special clause to where_token is sufficient.
+ if ($form->{make}) {
+ push @where_tokens, 'mv.name ILIKE ?';
+ push @bind_vars, "%$form->{make}%";
+ }
+ if ($form->{model}) {
+ push @where_tokens, 'mm.model ILIKE ?';
+ push @bind_vars, "%$form->{model}%";
+ }
+
# special case: sorting by partnumber
# since partnumbers are expected to be prefixed integers, a special sorting is implemented sorting first lexically by prefix and then by suffix.
# and yes, that expression is designed to hold that array of regexes only once, so the map is kinda messy, sorry about that.
$joins_needed{partsgroup} = 1;
$joins_needed{pfac} = 1;
$joins_needed{makemodel} = 1 if grep { $form->{$_} || $form->{"l_$_"} } @makemodel_filters;
+ $joins_needed{mv} = 1 if $joins_needed{makemodel};
$joins_needed{cv} = 1 if $bsooqr;
$joins_needed{apoe} = 1 if $joins_needed{cv} || grep { $form->{$_} || $form->{"l_$_"} } @apoe_filters;
$joins_needed{invoice_oi} = 1 if $joins_needed{apoe} || grep { $form->{$_} || $form->{"l_$_"} } @invoice_oi_filters;
my ($query, $sth);
- $query =
- qq|SELECT c.new_chart_id, date($transdate) >= c.valid_from AS is_valid, | .
- qq| cnew.accno | .
- qq|FROM chart c | .
- qq|LEFT JOIN chart cnew ON c.new_chart_id = cnew.id | .
- qq|WHERE (c.id = ?) AND NOT c.new_chart_id IS NULL AND (c.new_chart_id > 0)|;
- $sth = prepare_query($form, $dbh, $query);
+ $form->{ACCOUNT_CHAIN_BY_ID} ||= {
+ map { $_->{id} => $_ }
+ selectall_hashref_query($form, $dbh, <<SQL, $transdate) };
+ SELECT c.id, c.new_chart_id, date(?) >= c.valid_from AS is_valid, cnew.accno
+ FROM chart c
+ LEFT JOIN chart cnew ON c.new_chart_id = cnew.id
+ WHERE NOT c.new_chart_id IS NULL AND (c.new_chart_id > 0)
+SQL
while (1) {
- do_statement($form, $sth, $query, $accno_id);
- my $ref = $sth->fetchrow_hashref();
+ my $ref = $form->{ACCOUNT_CHAIN_BY_ID}->{$accno_id};
last unless ($ref && $ref->{"is_valid"} &&
!grep({ $_ == $ref->{"new_chart_id"} } @visited_accno_ids));
$accno_id = $ref->{"new_chart_id"};
}
sub retrieve_accounts {
- $main::lxdebug->enter_sub(2);
+ $main::lxdebug->enter_sub;
my $self = shift;
my $myconfig = shift;
my $form = shift;
my $dbh = $form->get_standard_dbh;
- my %args = @_; # part_id => index
-
- my ($query, $sth);
+ my %args = @_; # index => part_id
$form->{taxzone_id} *= 1;
+ return unless grep $_, values %args; # shortfuse if no part_id supplied
+
# transdate madness.
my $transdate = "";
if ($form->{type} eq "invoice") {
}
if ($transdate eq "") {
- $transdate = "current_date";
+ $transdate = DateTime->today_local->to_lxoffice;
} else {
$transdate = $dbh->quote($transdate);
}
#/transdate
+ my $inc_exp = $form->{"vc"} eq "customer" ? "income_accno_id" : "expense_accno_id";
+
+ my @part_ids = grep { $_ } values %args;
+ my $in = join ',', ('?') x @part_ids;
- my $sth_accno = prepare_query($::form, $dbh, <<SQL);
+ my %accno_by_part = map { $_->{id} => $_ }
+ selectall_hashref_query($form, $dbh, <<SQL, @part_ids);
SELECT
- p.inventory_accno_id AS is_part,
+ p.id, p.inventory_accno_id AS is_part,
bg.inventory_accno_id,
bg.income_accno_id_$form->{taxzone_id} AS income_accno_id,
bg.expense_accno_id_$form->{taxzone_id} AS expense_accno_id,
LEFT JOIN chart c1 ON bg.inventory_accno_id = c1.id
LEFT JOIN chart c2 ON bg.income_accno_id_$form->{taxzone_id} = c2.id
LEFT JOIN chart c3 ON bg.expense_accno_id_$form->{taxzone_id} = c3.id
- WHERE p.id = ?
+ WHERE p.id IN ($in)
SQL
- my $sth_tx = prepare_query($::form, $dbh, <<SQL);
+ my $sth_tax = prepare_query($::form, $dbh, <<SQL);
SELECT c.accno, t.taxdescription AS description, t.rate, t.taxnumber
FROM tax t
LEFT JOIN chart c ON c.id = t.chart_id
ORDER BY startdate DESC LIMIT 1)
SQL
- while (my ($part_id, $index) = each %args) {
- my $ref = $sth_accno->fetchrow_hashref($part_id) or next;
+ while (my ($index => $part_id) = each %args) {
+ my $ref = $accno_by_part{$part_id} or next;
$ref->{"inventory_accno_id"} = undef unless $ref->{"is_part"};
$form->{"${_}_accno_$index"} = $accounts{"${_}_accno"} for qw(inventory income expense);
- my $inc_exp = $form->{"vc"} eq "customer" ? "income" : "expense";
- $ref = $sth->fetchrow_hashref($accounts{"${inc_exp}_accno_id"}, quote_db_date($transdate)) or next;
+ $sth_tax->execute($accounts{$inc_exp}, quote_db_date($transdate));
+ $ref = $sth_tax->fetchrow_hashref or next;
$form->{"taxaccounts_$index"} = $ref->{"accno"};
$form->{"taxaccounts"} .= "$ref->{accno} "if $form->{"taxaccounts"} !~ /$ref->{accno}/;
$form->{"$ref->{accno}_${_}"} = $ref->{$_} for qw(rate description taxnumber);
}
- $::lxdebug->leave_sub(2);
+ $sth_tax->finish;
+
+ $::lxdebug->leave_sub;
}
sub get_basic_part_info {
}
my $placeholders = join ', ', ('?') x scalar(@part_ids);
- my $query = qq|SELECT mm.parts_id, mm.model, v.name AS make
+ my $query = qq|SELECT mm.parts_id, mm.model, mm.lastcost, v.name AS make
FROM makemodel mm
- LEFT JOIN vendor v ON (mm.make = cast (v.id as text))
+ LEFT JOIN vendor v ON (mm.make = v.id)
WHERE mm.parts_id IN ($placeholders)|;
my %makemodel = ();