use SL::CVar;
use SL::DBUtils;
+use SL::HTML::Restrict;
use SL::TransNumber;
use strict;
my ($self, $myconfig, $form) = @_;
# connect to db
- my $dbh = $form->dbconnect($myconfig);
+ my $dbh = $form->get_standard_dbh;
my $sth;
# copy to $form variables
map { $form->{$_} = $ref->{$_} } (keys %{$ref});
+ $form->{mtime} = $form->{itime} if !$form->{mtime};
+ $form->{lastmtime} = $form->{mtime};
$form->{onhand} *= 1;
# part or service item
$form->{amount}{IC_expense} = $form->{expense_accno};
$form->{amount}{IC_cogs} = $form->{expense_accno};
- my @pricegroups = ();
- my @pricegroups_not_used = ();
-
# get prices
- $query =
- qq|SELECT p.parts_id, p.pricegroup_id, p.price,
- (SELECT pg.pricegroup
- FROM pricegroup pg
- WHERE pg.id = p.pricegroup_id) AS pricegroup
- FROM prices p
- WHERE (parts_id = ?)
- ORDER BY pricegroup|;
- $sth = prepare_execute_query($form, $dbh, $query, conv_i($form->{id}));
-
- #for pricegroups
- my $i = 1;
- while (($form->{"klass_$i"}, $form->{"pricegroup_id_$i"},
- $form->{"price_$i"}, $form->{"pricegroup_$i"})
- = $sth->fetchrow_array()) {
- push @pricegroups, $form->{"pricegroup_id_$i"};
- $i++;
- }
-
- $sth->finish;
+ $query = <<SQL;
+ SELECT pg.pricegroup, pg.id AS pricegroup_id, COALESCE(pr.price, 0) AS price
+ FROM pricegroup pg
+ LEFT JOIN prices pr ON (pr.pricegroup_id = pg.id) AND (pr.parts_id = ?)
+ ORDER BY lower(pg.pricegroup)
+SQL
- # get pricegroups
- $query = qq|SELECT id, pricegroup FROM pricegroup|;
- $form->{PRICEGROUPS} = selectall_hashref_query($form, $dbh, $query);
-
- #find not used pricegroups
- while (my $tmp = pop(@{ $form->{PRICEGROUPS} })) {
- my $in_use = 0;
- foreach my $item (@pricegroups) {
- if ($item eq $tmp->{id}) {
- $in_use = 1;
- last;
- }
- }
- push(@pricegroups_not_used, $tmp) unless ($in_use);
+ my $row = 1;
+ foreach $ref (selectall_hashref_query($form, $dbh, $query, conv_i($form->{id}))) {
+ $form->{"${_}_${row}"} = $ref->{$_} for qw(pricegroup_id pricegroup price);
+ $row++;
}
-
- # if not used pricegroups are avaible
- if (@pricegroups_not_used) {
-
- foreach my $name (@pricegroups_not_used) {
- $form->{"klass_$i"} = "$name->{id}";
- $form->{"pricegroup_id_$i"} = "$name->{id}";
- $form->{"pricegroup_$i"} = "$name->{pricegroup}";
+ $form->{price_rows} = $row - 1;
+
+ # get makes
+ if ($form->{makemodel}) {
+ #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"}, $form->{"old_lastcost_$i"},
+ $form->{"lastcost_$i"}, $form->{"lastupdate_$i"}, $form->{"sortorder_$i"}) = $sth->fetchrow_array)
+ {
$i++;
}
- }
-
- #correct rows
- $form->{price_rows} = $i - 1;
-
- unless ($form->{item} eq 'service') {
-
- # get makes
- if ($form->{makemodel}) {
- #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"}, $form->{"old_lastcost_$i"},
- $form->{"lastcost_$i"}, $form->{"lastupdate_$i"}, $form->{"sortorder_$i"}) = $sth->fetchrow_array)
- {
- $i++;
- }
- $sth->finish;
- $form->{makemodel_rows} = $i - 1;
+ $sth->finish;
+ $form->{makemodel_rows} = $i - 1;
- }
}
# get translations
- $form->{language_values} = "";
$query = qq|SELECT language_id, translation, longdescription
FROM translation
WHERE parts_id = ?|;
- my $trq = prepare_execute_query($form, $dbh, $query, conv_i($form->{id}));
- while (my $tr = $trq->fetchrow_hashref("NAME_lc")) {
- $form->{language_values} .= "---+++---" . join('--++--', @{$tr}{qw(language_id translation longdescription)});
- }
- $trq->finish;
-
- # now get accno for taxes
- $query =
- qq|SELECT c.accno
- FROM chart c, partstax pt
- WHERE (pt.chart_id = c.id) AND (pt.parts_id = ?)|;
- $sth = prepare_execute_query($form, $dbh, $query, conv_i($form->{id}));
- while (my ($key) = $sth->fetchrow_array) {
- $form->{amount}{$key} = $key;
- }
-
- $sth->finish;
+ $form->{translations} = selectall_hashref_query($form, $dbh, $query, conv_i($form->{id}));
# is it an orphan
- my @referencing_tables = qw(invoice orderitems inventory rmaitems);
+ my @referencing_tables = qw(invoice orderitems inventory);
my %column_map = ( );
my $parts_id = conv_i($form->{id});
$form->{"unit_changeable"} = $form->{orphaned};
- $dbh->disconnect;
+ Common::webdav_folder($form) if $::lx_office_conf{features}{webdav};
$main::lxdebug->leave_sub();
}
my ($self, $myconfig, $form) = @_;
- my $dbh = $form->dbconnect($myconfig);
+ my $dbh = $form->get_standard_dbh;
# get pricegroups
- my $query = qq|SELECT id, pricegroup FROM pricegroup|;
+ my $query = qq|SELECT id, pricegroup FROM pricegroup ORDER BY lower(pricegroup)|;
my $pricegroups = selectall_hashref_query($form, $dbh, $query);
my $i = 1;
#correct rows
$form->{price_rows} = $i - 1;
- $dbh->disconnect;
-
$main::lxdebug->leave_sub();
return $pricegroups;
my ($query, $sth);
- my $dbh = $form->dbconnect($myconfig);
+ my $dbh = $form->get_standard_dbh;
# get buchungsgruppen
$query = qq|SELECT id, description FROM buchungsgruppen ORDER BY sortkey|;
my @values;
# connect to database, turn off AutoCommit
my $dbh = $form->get_standard_dbh;
+ my $restricter = SL::HTML::Restrict->create;
# save the part
# make up a unique handle and store in partnumber field
map { $form->{$_} = $form->parse_amount($myconfig, $form->{$_}) }
qw(rop weight listprice sellprice gv lastcost);
- my $makemodel = (($form->{make_1}) || ($form->{model_1})) ? 1 : 0;
+ my $makemodel = ($form->{make_1} || $form->{model_1} || ($form->{makemodel_rows} > 1)) ? 1 : 0;
$form->{assembly} = ($form->{item} eq 'assembly') ? 1 : 0;
}
$sth->finish;
- if ($form->{item} ne 'service') {
- # delete makemodel records
- do_query($form, $dbh, qq|DELETE FROM makemodel WHERE parts_id = ?|, conv_i($form->{id}));
- }
+ # delete makemodel records
+ do_query($form, $dbh, qq|DELETE FROM makemodel WHERE parts_id = ?|, conv_i($form->{id}));
if ($form->{item} eq 'assembly') {
# delete assembly records
do_query($form, $dbh, qq|DELETE FROM assembly WHERE id = ?|, conv_i($form->{id}));
}
- # delete tax records
- do_query($form, $dbh, qq|DELETE FROM partstax WHERE parts_id = ?|, conv_i($form->{id}));
-
# delete translations
do_query($form, $dbh, qq|DELETE FROM translation WHERE parts_id = ?|, conv_i($form->{id}));
$form->{orphaned} = 1;
}
- my $partsgroup_id = 0;
+ my $partsgroup_id = undef;
if ($form->{partsgroup}) {
(my $partsgroup, $partsgroup_id) = split(/--/, $form->{partsgroup});
if ($form->{"item"} ne "assembly") {
$subq_expense =
- qq|(SELECT bg.expense_accno_id_0
- FROM buchungsgruppen bg
- WHERE bg.id = | . conv_i($form->{"buchungsgruppen_id"}, 'NULL') . qq|)|;
+ qq|(SELECT tc.expense_accno_id
+ FROM taxzone_charts tc
+ WHERE tc.buchungsgruppen_id = | . conv_i($form->{"buchungsgruppen_id"}, 'NULL') . qq| and tc.taxzone_id = 0)|;
} else {
$subq_expense = "NULL";
}
+ normalize_text_blocks();
+
$query =
qq|UPDATE parts SET
partnumber = ?,
notes = ?,
formel = ?,
rop = ?,
- bin = ?,
+ warehouse_id = ?,
+ bin_id = ?,
buchungsgruppen_id = ?,
payment_id = ?,
inventory_accno_id = $subq_inventory,
- income_accno_id = (SELECT bg.income_accno_id_0 FROM buchungsgruppen bg WHERE bg.id = ?),
+ income_accno_id = (SELECT tc.income_accno_id FROM taxzone_charts tc WHERE tc.taxzone_id = 0 and tc.buchungsgruppen_id = ?),
expense_accno_id = $subq_expense,
obsolete = ?,
image = ?,
$form->{lastcost},
$form->{weight},
$form->{unit},
- $form->{notes},
+ $restricter->process($form->{notes}),
$form->{formel},
$form->{rop},
- $form->{bin},
+ conv_i($form->{warehouse_id}),
+ conv_i($form->{bin_id}),
conv_i($form->{buchungsgruppen_id}),
conv_i($form->{payment_id}),
conv_i($form->{buchungsgruppen_id}),
);
do_query($form, $dbh, $query, @values);
+ $form->new_lastmtime('parts');
+
# delete translation records
do_query($form, $dbh, qq|DELETE FROM translation WHERE parts_id = ?|, conv_i($form->{id}));
- if ($form->{language_values} ne "") {
- foreach my $item (split(/---\+\+\+---/, $form->{language_values})) {
- my ($language_id, $translation, $longdescription) = split(/--\+\+--/, $item);
- if ($translation ne "") {
- $query = qq|INSERT into translation (parts_id, language_id, translation, longdescription)
- VALUES ( ?, ?, ?, ? )|;
- @values = (conv_i($form->{id}), conv_i($language_id), $translation, $longdescription);
- do_query($form, $dbh, $query, @values);
- }
+ my @translations = grep { $_->{language_id} && $_->{translation} } @{ $form->{translations} || [] };
+ if (@translations) {
+ $query = qq|INSERT into translation (parts_id, language_id, translation, longdescription)
+ VALUES ( ?, ?, ?, ? )|;
+ $sth = $dbh->prepare($query);
+
+ foreach my $translation (@translations) {
+ do_statement($form, $sth, $query, conv_i($form->{id}), conv_i($translation->{language_id}), $translation->{translation}, $restricter->process($translation->{longdescription}));
}
+
+ $sth->finish();
}
# delete price records
do_query($form, $dbh, qq|DELETE FROM prices WHERE parts_id = ?|, conv_i($form->{id}));
- # insert price records only if different to sellprice
+ $query = qq|INSERT INTO prices (parts_id, pricegroup_id, price) VALUES(?, ?, ?)|;
+ $sth = prepare_query($form, $dbh, $query);
+
for my $i (1 .. $form->{price_rows}) {
my $price = $form->parse_amount($myconfig, $form->{"price_$i"});
- if ($price == 0) {
- $form->{"price_$i"} = $form->{sellprice};
- }
- if (
- ( $price
- || $form->{"klass_$i"}
- || $form->{"pricegroup_id_$i"})
- and $price != $form->{sellprice}
- ) {
- #$klass = $form->parse_amount($myconfig, $form->{"klass_$i"});
- $query = qq|INSERT INTO prices (parts_id, pricegroup_id, price) | .
- qq|VALUES(?, ?, ?)|;
- @values = (conv_i($form->{id}), conv_i($form->{"pricegroup_id_$i"}), $price);
- do_query($form, $dbh, $query, @values);
- }
+ next unless $price;
+
+ @values = (conv_i($form->{id}), conv_i($form->{"pricegroup_id_$i"}), $price);
+ do_statement($form, $sth, $query, @values);
}
+ $sth->finish;
+
# insert makemodel records
my $lastupdate = '';
my $value = 0;
}
}
- # insert taxes
- foreach my $item (split(/ /, $form->{taxaccounts})) {
- if ($form->{"IC_tax_$item"}) {
- $query =
- qq|INSERT INTO partstax (parts_id, chart_id)
- VALUES (?, (SELECT id FROM chart WHERE accno = ?))|;
- @values = (conv_i($form->{id}), $item);
- do_query($form, $dbh, $query, @values);
- }
- }
-
# add assembly records
if ($form->{item} eq 'assembly') {
+ # check additional assembly row
+ my $i = $form->{assembly_rows};
+ # if last row is not empty add them
+ if ($form->{"partnumber_$i"} ne "") {
+ $query = qq|SELECT id FROM parts WHERE partnumber = ?|;
+ my ($partid) = selectrow_query($form, $dbh, $query,$form->{"partnumber_$i"} );
+ if ( $partid ) {
+ $form->{"qty_$i"} = 1 unless ($form->{"qty_$i"});
+ $form->{"id_$i"} = $partid;
+ $form->{"bom_$i"} = 0;
+ $form->{assembly_rows}++;
+ }
+ else {
+ $::form->error($::locale->text("uncorrect partnumber ").$form->{"partnumber_$i"});
+ }
+ }
for my $i (1 .. $form->{assembly_rows}) {
$form->{"qty_$i"} = $form->parse_amount($myconfig, $form->{"qty_$i"});
do_query($form, $dbh, $query, @values);
}
}
-
my @a = localtime;
$a[5] += 1900;
$a[4]++;
variables => $form,
save_validity => 1);
+ # Delete saved custom variable values for configs that have been
+ # marked invalid for this part.
+ $query = <<SQL;
+ DELETE FROM custom_variables
+ WHERE (config_id IN (
+ SELECT val.config_id
+ FROM custom_variables_validity val
+ LEFT JOIN custom_variable_configs val_cfg ON (val.config_id = val_cfg.id)
+ WHERE (val_cfg.module = 'IC')
+ AND (val.trans_id = ?)))
+ AND (trans_id = ?)
+SQL
+ do_query($form, $dbh, $query, ($form->{id}) x 2);
+
# commit
my $rc = $dbh->commit;
$qty * ($form->{weight} - $weight), conv_i($id));
do_query($form, $dbh, $query, @values);
+ $form->new_lastmtime('parts') if $id == $form->{id};
+
$main::lxdebug->leave_sub();
}
my ($self, $myconfig, $form) = @_;
# connect to database
- my $dbh = $form->dbconnect($myconfig);
+ my $dbh = $form->get_standard_dbh;
my $where = qq|NOT p.obsolete|;
my @values;
# retrieve assembly items
my $query =
qq|SELECT p.id, p.partnumber, p.description,
- p.bin, p.onhand, p.rop,
+ p.onhand, p.rop,
(SELECT sum(p2.inventory_accno_id)
FROM parts p2, assembly a
WHERE (p2.id = a.parts_id) AND (a.id = p.id)) AS inventory
$form->{assembly_items} = selectall_hashref_query($form, $dbh, $query, @values);
- $dbh->disconnect;
-
$main::lxdebug->leave_sub();
}
my ($self, $myconfig, $form) = @_;
my @values = (conv_i($form->{id}));
# connect to database, turn off AutoCommit
- my $dbh = $form->dbconnect_noauto($myconfig);
+ my $dbh = $form->get_standard_dbh;
my %columns = ( "assembly" => "id", "parts" => "id" );
- for my $table (qw(prices partstax makemodel inventory assembly translation parts)) {
+ for my $table (qw(prices makemodel inventory assembly translation parts)) {
my $column = defined($columns{$table}) ? $columns{$table} : "parts_id";
do_query($form, $dbh, qq|DELETE FROM $table WHERE $column = ?|, @values);
}
# commit
my $rc = $dbh->commit;
- $dbh->disconnect;
$main::lxdebug->leave_sub();
}
# connect to database
- my $dbh = $form->dbconnect($myconfig);
+ my $dbh = $form->get_standard_dbh;
my $query =
qq|SELECT p.id, p.partnumber, p.description, p.sellprice,
p.weight, p.onhand, p.unit, pg.partsgroup, p.lastcost,
- p.price_factor_id, pfac.factor AS price_factor
+ p.price_factor_id, pfac.factor AS price_factor, p.notes as longdescription
FROM parts p
LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id)
LEFT JOIN price_factors pfac ON pfac.id = p.price_factor_id
WHERE $where|;
$form->{item_list} = selectall_hashref_query($form, $dbh, $query, @values);
- $dbh->disconnect;
-
$main::lxdebug->leave_sub();
}
# partnumber ean description partsgroup microfiche drawing
#
# column flags:
-# l_partnumber l_description l_listprice l_sellprice l_lastcost l_priceupdate l_weight l_unit l_bin l_rop l_image l_drawing l_microfiche l_partsgroup
+# l_partnumber l_description l_listprice l_sellprice l_lastcost l_priceupdate l_weight l_unit l_rop l_image l_drawing l_microfiche l_partsgroup
#
# exclusives:
# itemstatus = active | onhand | short | obsolete | orphaned
$form->{soldtotal} = undef if $form->{l_soldtotal}; # security fix. top100 insists on putting strings in there...
my @simple_filters = qw(partnumber ean description partsgroup microfiche drawing onhand);
+ my @project_filters = qw(projectnumber projectdescription);
my @makemodel_filters = qw(make model);
my @invoice_oi_filters = qw(serialnumber soldtotal);
my @apoe_filters = qw(transdate);
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 @all_columns = (@simple_filters, @makemodel_filters, @apoe_filters, @project_filters, qw(serialnumber));
+ my @simple_l_switches = (@all_columns, qw(notes listprice sellprice lastcost priceupdate weight unit rop image shop insertdate));
my @oe_flags = qw(bought sold onorder ordered rfq quoted);
my @qsooqr_flags = qw(invnumber ordnumber quonumber trans_id name module qty);
my @deliverydate_flags = qw(deliverydate);
pfac => 'LEFT JOIN price_factors pfac ON (pfac.id = p.price_factor_id)',
invoice_oi =>
q|LEFT JOIN (
- SELECT parts_id, description, serialnumber, trans_id, unit, sellprice, qty, assemblyitem, deliverydate, 'invoice' AS ioi, id FROM invoice UNION
- SELECT parts_id, description, serialnumber, trans_id, unit, sellprice, qty, FALSE AS assemblyitem, NULL AS deliverydate, 'orderitems' AS ioi, id FROM orderitems
+ SELECT parts_id, description, serialnumber, trans_id, unit, sellprice, qty, assemblyitem, deliverydate, 'invoice' AS ioi, project_id, id FROM invoice UNION
+ SELECT parts_id, description, serialnumber, trans_id, unit, sellprice, qty, FALSE AS assemblyitem, NULL AS deliverydate, 'orderitems' AS ioi, project_id, id FROM orderitems
) AS ioi ON ioi.parts_id = p.id|,
apoe =>
q|LEFT JOIN (
- SELECT id, transdate, 'ir' AS module, ordnumber, quonumber, invnumber, FALSE AS quotation, NULL AS customer_id, vendor_id, NULL AS deliverydate, 'invoice' AS ioi FROM ap UNION
- SELECT id, transdate, 'is' AS module, ordnumber, quonumber, invnumber, FALSE AS quotation, customer_id, NULL AS vendor_id, deliverydate, 'invoice' AS ioi FROM ar UNION
- SELECT id, transdate, 'oe' AS module, ordnumber, quonumber, NULL AS invnumber, quotation, customer_id, vendor_id, reqdate AS deliverydate, 'orderitems' AS ioi FROM oe
+ SELECT id, transdate, 'ir' AS module, ordnumber, quonumber, invnumber, FALSE AS quotation, NULL AS customer_id, vendor_id, NULL AS deliverydate, globalproject_id, 'invoice' AS ioi FROM ap UNION
+ SELECT id, transdate, 'is' AS module, ordnumber, quonumber, invnumber, FALSE AS quotation, customer_id, NULL AS vendor_id, deliverydate, globalproject_id, 'invoice' AS ioi FROM ar UNION
+ SELECT id, transdate, 'oe' AS module, ordnumber, quonumber, NULL AS invnumber, quotation, customer_id, vendor_id, reqdate AS deliverydate, globalproject_id, 'orderitems' AS ioi FROM oe
) AS apoe ON ((ioi.trans_id = apoe.id) AND (ioi.ioi = apoe.ioi))|,
cv =>
q|LEFT JOIN (
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',
+ project => 'LEFT JOIN project AS pj ON pj.id = COALESCE(ioi.project_id, apoe.globalproject_id)',
);
- my @join_order = qw(partsgroup makemodel mv invoice_oi apoe cv pfac);
+ my @join_order = qw(partsgroup makemodel mv invoice_oi apoe cv pfac project);
my %table_prefix = (
deliverydate => 'apoe.', serialnumber => 'ioi.',
quonumber => 'apoe.', model => 'mm.',
invnumber => 'apoe.', partsgroup => 'pg.',
lastcost => 'p.', , soldtotal => ' ',
- factor => 'pfac.',
- 'SUM(ioi.qty)' => ' ',
+ factor => 'pfac.', projectnumber => 'pj.',
+ 'SUM(ioi.qty)' => ' ', projectdescription => 'pj.',
description => 'p.',
qty => 'ioi.',
serialnumber => 'ioi.',
# of the scecified table will gently override (coalesce actually) the original value
# use it to conditionally coalesce values from subtables
my @column_override = (
- # column name, prefix, joins_needed
+ # column name, prefix, joins_needed, nick name (in case column is named like another)
[ 'description', 'ioi.', 'invoice_oi' ],
[ 'deliverydate', 'ioi.', 'invoice_oi' ],
[ 'transdate', 'apoe.', 'apoe' ],
'SUM(ioi.qty)' => 'soldtotal',
'ioi.id' => 'ioi_id',
'ioi.ioi' => 'ioi',
+ 'projectdescription' => 'projectdescription',
+ 'insertdate' => 'insertdate',
+ );
+
+ my %real_column = (
+ projectdescription => 'description',
+ insertdate => 'itime::DATE',
);
if (($form->{searchitems} eq 'assembly') && $form->{l_lastcost}) {
my $make_token_builder = sub {
my $joins_needed = shift;
sub {
- my ($col, $alias) = @_;
+ my ($nick, $alias) = @_;
+ my ($col) = $real_column{$nick} || $nick;
my @coalesce_tokens =
map { ($_->[1] || 'p.') . $_->[0] }
grep { !$_->[2] || $joins_needed->{$_->[2]} }
- grep { $_->[0] eq $col }
- @column_override, [ $col, $table_prefix{$col} ];
+ grep { ($_->[3] || $_->[0]) eq $nick }
+ @column_override, [ $col, $table_prefix{$nick}, undef , $nick ];
my $coalesce = scalar @coalesce_tokens > 1;
return ($coalesce
? sprintf 'COALESCE(%s)', join ', ', @coalesce_tokens
: shift @coalesce_tokens)
- . ($alias && ($coalesce || $renamed_columns{$col})
- ? " AS " . ($renamed_columns{$col} || $col)
+ . ($alias && ($coalesce || $renamed_columns{$nick})
+ ? " AS " . ($renamed_columns{$nick} || $nick)
: '');
}
};
}
}
+ # special case insertdate
+ if (grep { $form->{$_} } qw(insertdatefrom insertdateto)) {
+ $form->{"l_insertdate"} = 1;
+ push @select_tokens, 'insertdate';
+
+ my $token_builder = $make_token_builder->();
+ my $token = $token_builder->('insertdate');
+
+ for (qw(insertdatefrom insertdateto)) {
+ next unless $form->{$_};
+ push @where_tokens, sprintf "$token %s ?", /from$/ ? '>=' : '<=';
+ push @bind_vars, $form->{$_};
+ }
+ }
+
if ($form->{"partsgroup_id"}) {
$form->{"l_partsgroup"} = '1'; # show the column
push @where_tokens, "pg.id = ?";
push @bind_vars, $form->{"partsgroup_id"};
}
+ if ($form->{shop} ne '') {
+ $form->{l_shop} = '1'; # show the column
+ if ($form->{shop} eq '0' || $form->{shop} eq 'f') {
+ push @where_tokens, 'NOT p.shop';
+ $form->{shop} = 'f';
+ } else {
+ push @where_tokens, 'p.shop';
+ }
+ }
+
foreach (@like_filters) {
next unless $form->{$_};
$form->{"l_$_"} = '1'; # show the column
$joins_needed{partsgroup} = 1;
$joins_needed{pfac} = 1;
+ $joins_needed{project} = 1 if grep { $form->{$_} || $form->{"l_$_"} } @project_filters;
$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;
-
- # in bsoorq, use qtys instead of onhand
- if ($joins_needed{invoice_oi}) {
- $renamed_columns{onhand} = 'onhand_before_bsooqr';
- $renamed_columns{qty} = 'onhand';
- }
+ $joins_needed{apoe} = 1 if $joins_needed{project} || $joins_needed{cv} || grep { $form->{$_} || $form->{"l_$_"} } @apoe_filters;
+ $joins_needed{invoice_oi} = 1 if $joins_needed{project} || $joins_needed{apoe} || grep { $form->{$_} || $form->{"l_$_"} } @invoice_oi_filters;
# special case for description search.
# up in the simple filter section the description filter got interpreted as something like: WHERE description ILIKE '%$form->{description}%'
my $token_builder = $make_token_builder->(\%joins_needed);
- my @sort_cols = (@simple_filters, qw(id bin priceupdate onhand invnumber ordnumber quonumber name serialnumber soldtotal deliverydate));
+ my @sort_cols = (@simple_filters, qw(id priceupdate onhand invnumber ordnumber quonumber name serialnumber soldtotal deliverydate insertdate shop));
$form->{sort} = 'id' unless grep { $form->{"l_$_"} } grep { $form->{sort} eq $_ } @sort_cols; # sort by id if unknown or invisible column
my $sort_order = ($form->{revers} ? ' DESC' : ' ASC');
my $order_clause = " ORDER BY " . $token_builder->($form->{sort}) . ($form->{revers} ? ' DESC' : ' ASC');
map { $_->{onhand} *= 1 } @{ $form->{parts} };
+ # fix qty sign in ap. those are saved negative
+ if ($bsooqr && $form->{bought}) {
+ for my $row (@{ $form->{parts} }) {
+ $row->{qty} *= -1 if $row->{module} eq 'ir';
+ }
+ }
+
# post processing for assembly parts lists (bom)
# for each part get the assembly parts and add them into the partlist.
my @assemblies;
if ($form->{searchitems} eq 'assembly' && $form->{bom}) {
$query =
qq|SELECT p.id, p.partnumber, p.description, a.qty AS onhand,
- p.unit, p.bin,
+ p.unit, p.notes, p.itime::DATE as insertdate,
p.sellprice, p.listprice, p.lastcost,
p.rop, p.weight, p.priceupdate,
p.image, p.drawing, p.microfiche,
$form->{parts} = \@assemblies;
}
+ if ($form->{l_pricegroups} ) {
+ my $query = <<SQL;
+ SELECT parts_id, price, pricegroup_id
+ FROM prices
+ WHERE parts_id = ?
+SQL
+
+ my $sth = prepare_query($form, $dbh, $query);
+
+ foreach my $part (@{ $form->{parts} }) {
+ do_statement($form, $sth, $query, conv_i($part->{id}));
+
+ while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
+ $part->{"pricegroup_$ref->{pricegroup_id}"} = $ref->{price};
+ }
+ $sth->finish;
+ }
+ };
+
+
$main::lxdebug->leave_sub();
- return wantarray ? @{ $form->{parts} } : $form->{parts};
+ return @{ $form->{parts} };
}
sub _create_filter_for_priceupdate {
my $num_updated = 0;
# connect to database
- my $dbh = $form->dbconnect_noauto($myconfig);
+ my $dbh = $form->get_standard_dbh;
for my $column (qw(sellprice listprice)) {
next if ($form->{$column} eq "");
$sth_multiply->finish();
my $rc= $dbh->commit;
- $dbh->disconnect;
$main::lxdebug->leave_sub();
my ($self, $module, $myconfig, $form) = @_;
# connect to database
- my $dbh = $form->dbconnect($myconfig);
+ my $dbh = $form->get_standard_dbh;
my @values = ('%' . $module . '%');
my $query;
($form->{priceupdate}) = selectrow_query($form, $dbh, qq|SELECT current_date|);
}
- $dbh->disconnect;
$main::lxdebug->leave_sub();
}
$main::lxdebug->enter_sub();
my ($self, $myconfig, $form, $sortorder) = @_;
- my $dbh = $form->dbconnect($myconfig);
+ my $dbh = $form->get_standard_dbh;
my $order = qq| p.partnumber|;
my $where = qq|1 = 1|;
my @values;
} #while
$form->{rows} = $j;
$sth->finish;
- $dbh->disconnect;
$main::lxdebug->leave_sub();
my ($self, $myconfig, $form) = @_;
# connect to database
- my $dbh = $form->dbconnect($myconfig);
+ my $dbh = $form->get_standard_dbh;
my @values;
my $where;
my $languages = selectall_hashref_query($form, $dbh, $query, @values);
- $dbh->disconnect;
-
$main::lxdebug->leave_sub();
return $languages;
# transdate madness.
my $transdate = "";
- if ($form->{type} eq "invoice") {
- if (($form->{vc} eq "vendor") || !$form->{deliverydate}) {
+ if ($form->{type} eq "invoice" or $form->{type} eq "credit_note") {
+ # use deliverydate for sales and purchase invoice, if it exists
+ # also use deliverydate for credit notes
+ if (!$form->{deliverydate}) {
+ $transdate = $form->{invdate};
+ } else {
+ $transdate = $form->{deliverydate};
+ }
+ } elsif ($form->{script} eq 'ir.pl') {
+ # when a purchase invoice is opened from the report of purchase invoices
+ # $form->{type} isn't set, but $form->{script} is, not sure why this is or
+ # whether this distinction matters in some other scenario. Otherwise one
+ # could probably take out this elsif and add a
+ # " or $form->{script} eq 'ir.pl' "
+ # to the above if-statement
+ if (!$form->{deliverydate}) {
$transdate = $form->{invdate};
} else {
$transdate = $form->{deliverydate};
}
+ } elsif (($form->{type} eq "credit_note") and $form->{deliverydate}) {
+ # if credit_note has a deliverydate, use this instead of invdate
+ # useful for credit_notes of invoices from an old period with different tax
+ # if there is no deliverydate then invdate is used, old default (see next elsif)
+ # Falls hier der Stichtag für Steuern anders bestimmt wird,
+ # entsprechend auch bei Taxkeys.pm anpassen
+ $transdate = $form->{deliverydate};
} elsif (($form->{type} eq "credit_note") || ($form->{script} eq 'ir.pl')) {
$transdate = $form->{invdate};
} else {
SELECT
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,
+ tc.income_accno_id AS income_accno_id,
+ tc.expense_accno_id AS expense_accno_id,
c1.accno AS inventory_accno,
c2.accno AS income_accno,
c3.accno AS expense_accno
FROM parts p
LEFT JOIN buchungsgruppen bg ON p.buchungsgruppen_id = bg.id
+ LEFT JOIN taxzone_charts tc on bg.id = tc.buchungsgruppen_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 IN ($in)
+ LEFT JOIN chart c2 ON tc.income_accno_id = c2.id
+ LEFT JOIN chart c3 ON tc.expense_accno_id = c3.id
+ WHERE
+ tc.taxzone_id = '$form->{taxzone_id}'
+ and
+ p.id IN ($in)
SQL
my $sth_tax = prepare_query($::form, $dbh, <<SQL);
my $self = shift;
my %params = @_;
- my $myconfig = \%main::myconfig;
- my $form = $main::form;
+ my $myconfig = $params{myconfig} || \%main::myconfig;
+ my $form = $params{form} || $main::form;
my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig);
$sth->finish();
- my @columns = qw(ean image microfiche drawing weight);
+ my @columns = qw(ean image microfiche drawing);
$query = qq|SELECT id, | . join(', ', @columns) . qq|
FROM parts
my %data = selectall_as_map($form, $dbh, $query, 'id', \@columns, @part_ids);
- map { $form->{TEMPLATE_ARRAYS}{$_} = [] } (qw(make model), @columns);
+ my %template_arrays;
+ map { $template_arrays{$_} = [] } (qw(make model), @columns);
foreach my $i (1 .. $rowcount) {
my $id = $form->{"${prefix}${i}"};
next if (!$id);
foreach (@columns) {
- push @{ $form->{TEMPLATE_ARRAYS}{$_} }, $data{$id}->{$_};
+ push @{ $template_arrays{$_} }, $data{$id}->{$_};
}
- push @{ $form->{TEMPLATE_ARRAYS}{make} }, [];
- push @{ $form->{TEMPLATE_ARRAYS}{model} }, [];
+ push @{ $template_arrays{make} }, [];
+ push @{ $template_arrays{model} }, [];
next if (!$makemodel{$id});
foreach my $ref (@{ $makemodel{$id} }) {
- map { push @{ $form->{TEMPLATE_ARRAYS}{$_}->[-1] }, $ref->{$_} } qw(make model);
+ map { push @{ $template_arrays{$_}->[-1] }, $ref->{$_} } qw(make model);
}
}
+ my $parts = SL::DB::Manager::Part->get_all(query => [ id => \@part_ids ]);
+ my %parts_by_id = map { $_->id => $_ } @$parts;
+
+ for my $i (1..$rowcount) {
+ my $id = $form->{"${prefix}${i}"};
+ next unless $id;
+
+ push @{ $template_arrays{part_type} }, $parts_by_id{$id}->type;
+ }
+
+ return %template_arrays;
$main::lxdebug->leave_sub();
}
+sub normalize_text_blocks {
+ $main::lxdebug->enter_sub();
+
+ my $self = shift;
+ my %params = @_;
+
+ my $form = $params{form} || $main::form;
+
+ # check if feature is enabled (select normalize_part_descriptions from defaults)
+ return unless ($::instance_conf->get_normalize_part_descriptions);
+
+ foreach (qw(description notes)) {
+ $form->{$_} =~ s/\s+$//s;
+ $form->{$_} =~ s/^\s+//s;
+ $form->{$_} =~ s/ {2,}/ /g;
+ }
+ $main::lxdebug->leave_sub();
+}
+
1;