Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 54e4131e

Von Moritz Bunkus vor mehr als 18 Jahren hinzugefügt

  • ID 54e4131e091831e00a861fe2c4f53e344b87ddca
  • Vorgänger ed42de15
  • Nachfolger b1f65772

Uebernahme der kompletten Version, so wie sie Philip als "Demo-Version" gezeigt hat, in das unstable-Repo. Dabei werden auch einige Patches, die seit der 2.2.0 hier eingepflegt wurden, wieder ueberschrieben. Diese werden in den naechsten Tagen wieder eingespielt, sofern noetig. Zu den neuen Features gehoeren (ohne Anspruch auf Vollstaendigkeit) Mahnwesen, Einheiten, Template-Neucodierung, AJAX-basierende Dialoge an einigen Stellen, Buchungsgruppen etc etc.

Unterschiede anzeigen:

SL/OE.pm
package OE;
use SL::AM;
sub transactions {
$main::lxdebug->enter_sub();
......
my ($query, $sth, $null);
my $exchangerate = 0;
my $service_units = AM->retrieve_units($myconfig,$form,"service");
my $part_units = AM->retrieve_units($myconfig,$form,"dimension");
$form->{service_units} =$service_units;
$form->{part_units} =$part_units;
($null, $form->{employee_id}) = split /--/, $form->{employee};
unless ($form->{employee_id}) {
$form->get_employee($dbh);
}
($null, $form->{contact_id}) = split /--/, $form->{contact};
$form->{contact_id} = $form->{cp_id};
$form->{contact_id} *= 1;
$form->{payment_id} *= 1;
$form->{language_id} *= 1;
$form->{shipto_id} *= 1;
$form->{delivery_customer_id} *= 1;
$form->{delivery_vendor_id} *= 1;
my $ml = ($form->{type} eq 'sales_order') ? 1 : -1;
......
$dbh->do($query) || $form->dberror($query);
$query = qq|DELETE FROM shipto
WHERE trans_id = $form->{id}|;
WHERE trans_id = $form->{id} AND module = 'OE'|;
$dbh->do($query) || $form->dberror($query);
} else {
......
if ($form->{"qty_$i"}) {
# get item baseunit
$query = qq|SELECT p.unit
FROM parts p
WHERE p.id = $form->{"id_$i"}|;
$sth = $dbh->prepare($query);
$sth->execute || $form->dberror($query);
my ($item_unit) = $sth->fetchrow_array();
$sth->finish;
if ($form->{"inventory_accno_$i"}) {
if (defined($part_units->{$item_unit}->{factor}) && $part_units->{$item_unit}->{factor} ne '' && $part_units->{$item_unit}->{factor} ne '0') {
$basefactor = $part_units->{$form->{"unit_$i"}}->{factor} / $part_units->{$item_unit}->{factor};
} else {
$basefactor = 1;
}
$baseqty = $form->{"qty_$i"} * $basefactor;
} else {
if (defined($service_units->{$item_unit}->{factor}) && $service_units->{$item_unit}->{factor} ne '' && $service_units->{$item_unit}->{factor} ne '0') {
$basefactor = $service_units->{$form->{"unit_$i"}}->{factor} / $service_units->{$item_unit}->{factor};
} else {
$basefactor = 1;
}
$baseqty = $form->{"qty_$i"} * $basefactor;
}
map { $form->{"${_}_$i"} =~ s/\'/\'\'/g }
qw(partnumber description unit);
......
# get pricegroup_id and save ist
($null, my $pricegroup_id) = split /--/, $form->{"sellprice_drag_$i"};
$pricegroup_id *= 1;
$subtotal = $form->{"subtotal_$i"} * 1;
# save detail record in orderitems table
$query = qq|INSERT INTO orderitems (|;
$query .= "id, " if $form->{"orderitems_id_$i"};
$query .= qq|trans_id, parts_id, description, qty, sellprice, discount,
$query .= qq|trans_id, parts_id, description, longdescription, qty, base_qty, sellprice, discount,
unit, reqdate, project_id, serialnumber, ship, pricegroup_id,
ordnumber, transdate, cusordnumber)
ordnumber, transdate, cusordnumber, subtotal)
VALUES (|;
$query .= qq|$form->{"orderitems_id_$i"},|
if $form->{"orderitems_id_$i"};
$query .= qq|$form->{id}, $form->{"id_$i"},
'$form->{"description_$i"}', $form->{"qty_$i"},
'$form->{"description_$i"}', '$form->{"longdescription_$i"}', $form->{"qty_$i"}, $baseqty,
$fxsellprice, $form->{"discount_$i"},
'$form->{"unit_$i"}', $reqdate, (SELECT id from project where projectnumber = '$project_id'),
'$form->{"serialnumber_$i"}', $form->{"ship_$i"}, '$pricegroup_id',
'$form->{"ordnumber_$i"}', '$form->{"transdate_$i"}', '$form->{"cusordnumber_$i"}')|;
'$form->{"ordnumber_$i"}', '$form->{"transdate_$i"}', '$form->{"cusordnumber_$i"}', '$subtotal')|;
$dbh->do($query) || $form->dberror($query);
$form->{"sellprice_$i"} = $fxsellprice;
......
($null, $form->{department_id}) = split(/--/, $form->{department});
$form->{department_id} *= 1;
$form->{payment_id} *= 1;
$form->{language_id} *= 1;
$form->{taxzone_id} *= 1;
$form->{proforma} *= 1;
# save OE record
$query = qq|UPDATE oe set
......
intnotes = '$form->{intnotes}',
curr = '$form->{currency}',
closed = '$form->{closed}',
proforma = '$form->{proforma}',
quotation = '$quotation',
department_id = $form->{department_id},
language_id = $form->{language_id},
taxzone_id = $form->{taxzone_id},
shipto_id = $form->{shipto_id},
payment_id = $form->{payment_id},
delivery_vendor_id = $form->{delivery_vendor_id},
delivery_customer_id = $form->{delivery_customer_id},
employee_id = $form->{employee_id},
cp_id = $form->{contact_id}
WHERE id = $form->{id}|;
......
# add shipto
$form->{name} = $form->{ $form->{vc} };
$form->{name} =~ s/--$form->{"$form->{vc}_id"}//;
$form->add_shipto($dbh, $form->{id});
if (!$form->{shipto_id}) {
$form->add_shipto($dbh, $form->{id}, "OE");
}
# save printed, emailed, queued
$form->save_status($dbh);
......
$dbh->do($query) || $form->dberror($query);
$query = qq|DELETE FROM shipto
WHERE trans_id = $form->{id}|;
WHERE trans_id = $form->{id} AND module = 'OE'|;
$dbh->do($query) || $form->dberror($query);
my $rc = $dbh->commit;
......
o.curr AS currency, e.name AS employee, o.employee_id,
o.$form->{vc}_id, cv.name AS $form->{vc}, o.amount AS invtotal,
o.closed, o.reqdate, o.quonumber, o.department_id, o.cusordnumber,
d.description AS department
d.description AS department, o.payment_id, o.language_id, o.taxzone_id, o.delivery_customer_id, o.delivery_vendor_id, o.proforma, o.shipto_id
FROM oe o
JOIN $form->{vc} cv ON (o.$form->{vc}_id = cv.id)
LEFT JOIN employee e ON (o.employee_id = e.id)
......
$ref = $sth->fetchrow_hashref(NAME_lc);
map { $form->{$_} = $ref->{$_} } keys %$ref;
# set all entries for multiple ids blank that yield different information
while ($ref = $sth->fetchrow_hashref(NAME_lc)) {
map { $form->{$_} = '' if ($ref->{$_} ne $form->{$_}) } keys %$ref;
......
$sth->finish;
if ($form->{delivery_customer_id}) {
$query = qq|SELECT name FROM customer WHERE id=$form->{delivery_customer_id}|;
$sth = $dbh->prepare($query);
$sth->execute || $form->dberror($query);
($form->{delivery_customer_string}) = $sth->fetchrow_array();
$sth->finish;
}
if ($form->{delivery_vendor_id}) {
$query = qq|SELECT name FROM customer WHERE id=$form->{delivery_vendor_id}|;
$sth = $dbh->prepare($query);
$sth->execute || $form->dberror($query);
($form->{delivery_vendor_string}) = $sth->fetchrow_array();
$sth->finish;
}
# shipto and pinted/mailed/queued status makes only sense for single id retrieve
if (!@ids) {
$query = qq|SELECT s.* FROM shipto s
WHERE s.trans_id = $form->{id}|;
WHERE s.trans_id = $form->{id} AND s.module = 'OE'|;
$sth = $dbh->prepare($query);
$sth->execute || $form->dberror($query);
$ref = $sth->fetchrow_hashref(NAME_lc);
delete($ref->{id});
map { $form->{$_} = $ref->{$_} } keys %$ref;
$sth->finish;
......
my %oid = ('Pg' => 'oid',
'Oracle' => 'rowid');
my $transdate = "'$form->{transdate}'";
if (!$transdate) {
$transdate = "current_date";
}
if(!$form->{taxzone_id}) {
$form->{taxzone_id} = 0;
}
# retrieve individual items
# this query looks up all information about the items
# stuff different from the whole will not be overwritten, but saved with a suffix.
$query = qq|SELECT o.id AS orderitems_id,
c1.accno AS inventory_accno,
c2.accno AS income_accno,
c3.accno AS expense_accno,
c1.accno AS inventory_accno, c1.new_chart_id AS inventory_new_chart, date($transdate) - c1.valid_from as inventory_valid,
c2.accno AS income_accno, c2.new_chart_id AS income_new_chart, date($transdate) - c2.valid_from as income_valid,
c3.accno AS expense_accno, c3.new_chart_id AS expense_new_chart, date($transdate) - c3.valid_from as expense_valid,
oe.ordnumber AS ordnumber_oe, oe.transdate AS transdate_oe, oe.cusordnumber AS cusordnumber_oe,
p.partnumber, p.assembly, o.description, o.qty,
o.sellprice, o.parts_id AS id, o.unit, o.discount, p.bin, p.notes AS partnotes,
o.sellprice, o.parts_id AS id, o.unit, o.discount, p.bin, p.notes AS partnotes, p.inventory_accno_id AS part_inventory_accno_id,
o.reqdate, o.project_id, o.serialnumber, o.ship,
o.ordnumber, o.transdate, o.cusordnumber,
pr.projectnumber,
o.ordnumber, o.transdate, o.cusordnumber, o.subtotal, o.longdescription,
pr.projectnumber, p.alu, p.formel,
pg.partsgroup, o.pricegroup_id, (SELECT pricegroup FROM pricegroup WHERE id=o.pricegroup_id) as pricegroup
FROM orderitems o
JOIN parts p ON (o.parts_id = p.id)
JOIN oe ON (o.trans_id = oe.id)
LEFT JOIN chart c1 ON (p.inventory_accno_id = c1.id)
LEFT JOIN chart c2 ON (p.income_accno_id = c2.id)
LEFT JOIN chart c3 ON (p.expense_accno_id = c3.id)
LEFT JOIN chart c1 ON ((select inventory_accno_id from buchungsgruppen where id=p.buchungsgruppen_id) = c1.id)
LEFT JOIN chart c2 ON ((select income_accno_id_$form->{taxzone_id} from buchungsgruppen where id=p.buchungsgruppen_id) = c2.id)
LEFT JOIN chart c3 ON ((select expense_accno_id_$form->{taxzone_id} from buchungsgruppen where id=p.buchungsgruppen_id) = c3.id)
LEFT JOIN project pr ON (o.project_id = pr.id)
LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id)
|
......
$sth->execute || $form->dberror($query);
while ($ref = $sth->fetchrow_hashref(NAME_lc)) {
if (!$ref->{"part_inventory_accno_id"}) {
map({ delete($ref->{$_}); } qw(inventory_accno inventory_new_chart inventory_valid));
}
delete($ref->{"part_inventory_accno_id"});
# in collective order, copy global ordnumber, transdate, cusordnumber into item scope
# unless already present there
......
if (@ids);
map { delete $ref->{$_} } qw|ordnumber_oe transdate_oe cusordnumber_oe|;
# delete orderitems_id in collective orders, so that they get cloned no matter what
delete $ref->{orderitems_id} if (@ids);
while ($ref->{inventory_new_chart} && ($ref->{inventory_valid} >=0)) {
my $query = qq| SELECT accno AS inventory_accno, new_chart_id AS inventory_new_chart, date($transdate) - valid_from AS inventory_valid FROM chart WHERE id = $ref->{inventory_new_chart}|;
my $stw = $dbh->prepare($query);
$stw->execute || $form->dberror($query);
($ref->{inventory_accno}, $ref->{inventory_new_chart}, $ref->{inventory_valid}) = $stw->fetchrow_array;
$stw->finish;
}
while ($ref->{income_new_chart} && ($ref->{income_valid} >=0)) {
my $query = qq| SELECT accno AS income_accno, new_chart_id AS income_new_chart, date($transdate) - valid_from AS income_valid FROM chart WHERE id = $ref->{income_new_chart}|;
my $stw = $dbh->prepare($query);
$stw->execute || $form->dberror($query);
($ref->{income_accno}, $ref->{income_new_chart}, $ref->{income_valid}) = $stw->fetchrow_array;
$stw->finish;
}
while ($ref->{expense_new_chart} && ($ref->{expense_valid} >=0)) {
my $query = qq| SELECT accno AS expense_accno, new_chart_id AS expense_new_chart, date($transdate) - valid_from AS expense_valid FROM chart WHERE id = $ref->{expense_new_chart}|;
my $stw = $dbh->prepare($query);
$stw->execute || $form->dberror($query);
($ref->{expense_accno}, $ref->{expense_new_chart}, $ref->{expense_valid}) = $stw->fetchrow_array;
$stw->finish;
}
#set expense_accno=inventory_accno if they are different => bilanz
$vendor_accno =
......
# get tax rates and description
$accno_id =
($form->{vc} eq "customer") ? $ref->{income_accno} : $vendor_accno;
$query = qq|SELECT c.accno, c.description, t.rate, t.taxnumber
FROM chart c, tax t
WHERE c.id=t.chart_id AND t.taxkey in (SELECT taxkey_id from chart where accno = '$accno_id')
$query = qq|SELECT c.accno, t.taxdescription, t.rate, t.taxnumber
FROM tax t LEFT JOIN chart c ON (c.id=t.chart_id)
WHERE t.taxkey in (SELECT taxkey_id from chart where accno = '$accno_id')
ORDER BY accno|;
$stw = $dbh->prepare($query);
$stw->execute || $form->dberror($query);
$ref->{taxaccounts} = "";
my $i = 0;
while ($ptr = $stw->fetchrow_hashref(NAME_lc)) {
# if ($customertax{$ref->{accno}}) {
if (($ptr->{accno} eq "") && ($ptr->{rate} == 0)) {
$i++;
$ptr->{accno} = $i;
}
$ref->{taxaccounts} .= "$ptr->{accno} ";
if (!($form->{taxaccounts} =~ /$ptr->{accno}/)) {
$form->{"$ptr->{accno}_rate"} = $ptr->{rate};
$form->{"$ptr->{accno}_description"} = $ptr->{description};
$form->{"$ptr->{accno}_description"} = $ptr->{taxdescription};
$form->{"$ptr->{accno}_taxnumber"} = $ptr->{taxnumber};
$form->{taxaccounts} .= "$ptr->{accno} ";
}
......
&webdav_folder($myconfig, $form);
}
# get tax zones
$query = qq|SELECT id, description
FROM tax_zones|;
$sth = $dbh->prepare($query);
$sth->execute || $form->dberror($query);
while (my $ref = $sth->fetchrow_hashref(NAME_lc)) {
push @{ $form->{TAXZONE} }, $ref;
}
$sth->finish;
my $rc = $dbh->commit;
$dbh->disconnect;
......
my $dbh = $form->dbconnect($myconfig);
my $query;
my $sth;
my $nodiscount;
my $yesdiscount;
my $nodiscount_subtotal = 0;
my $discount_subtotal = 0;
my $item;
my $i;
my @partsgroup = ();
my $partsgroup;
my $position = 0;
my $subtotal_header = 0;
my $subposition = 0;
my %oid = ('Pg' => 'oid',
'Oracle' => 'rowid');
......
for $i (1 .. $form->{rowcount}) {
$partsgroup = "";
if ($form->{"partsgroup_$i"} && $form->{groupitems}) {
$form->format_string("partsgroup_$i");
$partsgroup = $form->{"partsgroup_$i"};
}
push @partsgroup, [$i, $partsgroup];
......
if ($form->{"qty_$i"} != 0) {
# add number, description and qty to $form->{number}, ....
if ($form->{"subtotal_$i"} && !$subtotal_header) {
$subtotal_header = $i;
$position = int($position);
$subposition = 0;
$position++;
} elsif ($subtotal_header) {
$subposition += 1;
$position = int($position);
$position = $position.".".$subposition;
} else {
$position = int($position);
$position++;
}
push(@{ $form->{runningnumber} }, $i);
push(@{ $form->{number} }, qq|$form->{"partnumber_$i"}|);
push(@{ $form->{description} }, qq|$form->{"description_$i"}|);
push(@{ $form->{longdescription} }, qq|$form->{"longdescription_$i"}|);
push(@{ $form->{qty} },
$form->format_amount($myconfig, $form->{"qty_$i"}));
push(@{ $form->{ship} },
......
# keep a netprice as well, (sellprice - discount)
#$form->{"netprice_$i"} = $sellprice - $discount;
$form->{"netprice_$i"} = $sellprice - $i_discount;
my $nodiscount_linetotal =
$form->round_amount($form->{"qty_$i"} * $sellprice, 2);
my $linetotal =
$form->round_amount($form->{"qty_$i"} * $form->{"netprice_$i"}, 2);
......
push(@{ $form->{p_discount} }, $form->{"discount_$i"});
$form->{ordtotal} += $linetotal;
$discount_subtotal += $linetotal;
$form->{nodiscount_total} += $nodiscount_linetotal;
$nodiscount_subtotal += $nodiscount_linetotal;
$form->{discount_total} += $form->parse_amount($myconfig, $discount);
if ($form->{"subtotal_$i"} && $subtotal_header && ($subtotal_header != $i)) {
$discount_subtotal = $form->format_amount($myconfig, $discount_subtotal, 2);
push(@{ $form->{discount_sub} }, $discount_subtotal);
$nodiscount_subtotal = $form->format_amount($myconfig, $nodiscount_subtotal, 2);
push(@{ $form->{nodiscount_sub} }, $nodiscount_subtotal);
$discount_subtotal = 0;
$nodiscount_subtotal = 0;
$subtotal_header = 0;
} else {
push(@{ $form->{discount_sub} }, "");
push(@{ $form->{nodiscount_sub} }, "");
}
if ($linetotal == $netto_linetotal) {
$nodiscount += $linetotal;
}
push(@{ $form->{linetotal} },
$form->format_amount($myconfig, $linetotal, 2));
push(@{ $form->{nodiscount_linetotal} },
$form->format_amount($myconfig, $nodiscount_linetotal, 2));
my ($taxamount, $taxbase);
my $taxrate = 0;
......
while (my $ref = $sth->fetchrow_hashref(NAME_lc)) {
if ($form->{groupitems} && $ref->{partsgroup} ne $sameitem) {
map { push(@{ $form->{$_} }, "") }
qw(runningnumber ship bin serialnumber number unit bin qty reqdate sellprice listprice netprice discount linetotal);
qw(runningnumber ship bin serialnumber number unit bin qty reqdate sellprice listprice netprice discount linetotal nodiscount_linetotal);
$sameitem = ($ref->{partsgroup}) ? $ref->{partsgroup} : "--";
push(@{ $form->{description} }, $sameitem);
}
......
. qq|, $ref->{partnumber}, $ref->{description}|);
map { push(@{ $form->{$_} }, "") }
qw(number unit qty runningnumber ship bin serialnumber reqdate sellprice listprice netprice discount linetotal);
qw(number unit qty runningnumber ship bin serialnumber reqdate sellprice listprice netprice discount linetotal nodiscount_linetotal);
}
$sth->finish;
......
my $tax = 0;
foreach $item (sort keys %taxaccounts) {
if ($form->round_amount($taxaccounts{$item}, 2) != 0) {
push(@{ $form->{taxbase} },
$form->format_amount($myconfig, $taxbase{$item}, 2));
......
push(@{ $form->{taxrate} },
$form->format_amount($myconfig, $form->{"${item}_rate"} * 100));
push(@{ $form->{taxnumber} }, $form->{"${item}_taxnumber"});
}
}
$form->{subtotal} = $form->format_amount($myconfig, $form->{total}, 2);
$yesdiscount = $form->{nodiscount_total} - $nodiscount;
$form->{nodiscount_subtotal} = $form->format_amount($myconfig, $form->{nodiscount_total}, 2);
$form->{discount_total} = $form->format_amount($myconfig, $form->{discount_total}, 2);
$form->{nodiscount} = $form->format_amount($myconfig, $nodiscount, 2);
$form->{yesdiscount} = $form->format_amount($myconfig, $yesdiscount, 2);
$form->{subtotal} = $form->format_amount($myconfig, $form->{ordtotal}, 2);
$form->{ordtotal} =
......
$form->{quototal} = $form->{ordtotal} =
$form->format_amount($myconfig, $form->{ordtotal}, 2);
if ($form->{type} =~ /_quotation/) {
$form->set_payment_options($myconfig, $form->{quodate});
} else {
$form->set_payment_options($myconfig, $form->{orddate});
}
# myconfig variables
map { $form->{$_} = $myconfig->{$_} }
(qw(company address tel fax signature businessnumber));
......
my ($dbh, $form, $ml) = @_;
my $query = qq|SELECT oi.parts_id, oi.ship, p.inventory_accno_id, p.assembly
my $service_units = $form->{service_units};
my $part_units = $form->{part_units};
my $query = qq|SELECT oi.parts_id, oi.ship, oi.unit, p.inventory_accno_id, p.assembly
FROM orderitems oi
JOIN parts p ON (p.id = oi.parts_id)
WHERE oi.trans_id = $form->{id}|;
......
my $ispa;
while (my $ref = $sth->fetchrow_hashref(NAME_lc)) {
#print(STDERR "Bin in Schleife $ref->{inventory_accno_id}\n");
if ($ref->{inventory_accno_id} || $ref->{assembly}) {
......
}
# get item baseunit
$query = qq|SELECT p.unit
FROM parts p
WHERE p.id = $ref->{parts_id}|;
my $stw = $dbh->prepare($query);
$stw->execute || $form->dberror($query);
my ($item_unit) = $stw->fetchrow_array();
$stw->finish;
if ($ref->{inventory_accno_id}) {
if (defined($part_units->{$item_unit}->{factor}) && $part_units->{$item_unit}->{factor} ne '' && $part_units->{$item_unit}->{factor} ne '0') {
$basefactor = $part_units->{$ref->{unit}}->{factor} / $part_units->{$item_unit}->{factor};
} else {
$basefactor = 1;
}
$baseqty = $ref->{ship} * $basefactor;
} else {
if (defined($service_units->{$item_unit}->{factor}) && $service_units->{$item_unit}->{factor} ne '' && $service_units->{$item_unit}->{factor} ne '0') {
$basefactor = $service_units->{$ref->{unit}}->{factor} / $part_units->{$item_unit}->{factor};
} else {
$basefactor = 1;
}
$baseqty = $ref->{ship} * $basefactor;
}
#print(STDERR "$baseqty Basismenge\n");
# adjust onhand in parts table
$form->update_balance($dbh, "parts", "onhand",
qq|id = $ref->{parts_id}|,
$ref->{ship} * $ml);
$baseqty * $ml);
}
}

Auch abrufbar als: Unified diff