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/IR.pm
package IR;
use SL::AM;
sub post_invoice {
$main::lxdebug->enter_sub();
......
my $taxdiff;
my $item;
my $service_units = AM->retrieve_units($myconfig,$form,"service");
my $part_units = AM->retrieve_units($myconfig,$form,"dimension");
if ($form->{id}) {
&reverse_invoice($dbh, $form);
......
for my $i (1 .. $form->{rowcount}) {
$form->{"qty_$i"} = $form->parse_amount($myconfig, $form->{"qty_$i"});
if ($form->{storno}) {
$form->{"qty_$i"} *= -1;
}
if ($form->{"qty_$i"} != 0) {
# 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);
......
$form->update_balance($dbh, "parts", "onhand",
qq|id = $form->{"id_$i"}|,
$form->{"qty_$i"})
$baseqty)
unless $form->{shipped};
# check if we sold the item already and
......
FROM invoice i, ar a, parts p
WHERE i.parts_id = p.id
AND i.parts_id = $form->{"id_$i"}
AND (i.qty + i.allocated) > 0
AND (i.base_qty + i.allocated) > 0
AND i.trans_id = a.id
ORDER BY transdate|;
$sth = $dbh->prepare($query);
$sth->execute || $form->dberror($query);
my $totalqty = $form->{"qty_$i"};
my $totalqty = $base_qty;
while (my $ref = $sth->fetchrow_hashref(NAME_lc)) {
my $qty = $ref->{qty} + $ref->{allocated};
my $qty = $ref->{base_qty} + $ref->{allocated};
if (($qty - $totalqty) > 0) {
$qty = $totalqty;
}
$linetotal = $form->round_amount($form->{"sellprice_$i"} * $qty, 2);
$linetotal = $form->round_amount(($form->{"sellprice_$i"} * $qty) / $basefactor, 2);
if ($ref->{allocated} < 0) {
......
: "NULL";
# save detail record in invoice table
$query = qq|INSERT INTO invoice (trans_id, parts_id, description, qty,
$query = qq|INSERT INTO invoice (trans_id, parts_id, description, qty, base_qty,
sellprice, fxsellprice, allocated, unit, deliverydate,
project_id, serialnumber)
VALUES ($form->{id}, $form->{"id_$i"},
'$form->{"description_$i"}', | . ($form->{"qty_$i"} * -1) . qq|,
'$form->{"description_$i"}', | . ($form->{"qty_$i"} * -1) . qq|, | . ($baseqty * -1) . qq|,
$form->{"sellprice_$i"}, $fxsellprice, $allocated,
'$form->{"unit_$i"}', $deliverydate, (SELECT id FROM project WHERE projectnumber = '$project_id'),
'$form->{"serialnumber_$i"}')|;
......
($null, $form->{department_id}) = split(/--/, $form->{department});
$form->{department_id} *= 1;
$form->{payment_id} *= 1;
$form->{language_id} *= 1;
$form->{taxzone_id} *= 1;
$form->{storno} *= 1;
$form->{invnumber} = $form->{id} unless $form->{invnumber};
......
datepaid = $datepaid,
duedate = $duedate,
invoice = '1',
taxzone_id = '$form->{taxzone_id}',
taxincluded = '$form->{taxincluded}',
notes = '$form->{notes}',
intnotes = '$form->{intnotes}',
curr = '$form->{currency}',
department_id = $form->{department_id},
storno = '$form->{storno}',
cp_id = $form->{contact_id}
WHERE id = $form->{id}|;
$dbh->do($query) || $form->dberror($query);
if ($form->{storno}) {
$query = qq| update ap set paid=paid+amount where id=$form->{storno_id}|;
$dbh->do($query) || $form->dberror($query);
$query = qq| update ap set storno='$form->{storno}' where id=$form->{storno_id}|;
$dbh->do($query) || $form->dberror($query);
$query = qq? update ap set intnotes='Rechnung storniert am $form->{invdate} ' || intnotes where id=$form->{storno_id}?;
$dbh->do($query) || $form->dberror($query);
$query = qq| update ap set paid=amount where id=$form->{id}|;
$dbh->do($query) || $form->dberror($query);
}
# add shipto
$form->{name} = $form->{vendor};
$form->{name} =~ s/--$form->{vendor_id}//;
$form->add_shipto($dbh, $form->{id});
$form->add_shipto($dbh, $form->{id}, "AP");
# delete zero entries
$query = qq|DELETE FROM acc_trans
......
$dbh->do($query) || $form->dberror($query);
$query = qq|DELETE FROM shipto
WHERE trans_id = $form->{id}|;
WHERE trans_id = $form->{id} AND module = 'AP'|;
$dbh->do($query) || $form->dberror($query);
$main::lxdebug->leave_sub();
......
# retrieve invoice
$query = qq|SELECT a.cp_id, a.invnumber, a.transdate AS invdate, a.duedate,
a.ordnumber, a.quonumber, a.paid, a.taxincluded, a.notes,
a.ordnumber, a.quonumber, a.paid, a.taxincluded, a.notes, a.taxzone_id, a.storno,
a.intnotes, a.curr AS currency
FROM ap a
WHERE a.id = $form->{id}|;
......
# get shipto
$query = qq|SELECT s.* FROM shipto s
WHERE s.trans_id = $form->{id}|;
WHERE s.trans_id = $form->{id} AND s.module = 'AP'|;
$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 $transdate = "current_date";
if($form->{invdate}) {
$transdate = "'$form->{invdate}'";
}
if(!$form->{taxzone_id}) {
$form->{taxzone_id} = 0;
}
# retrieve individual items
$query = qq|SELECT c1.accno AS inventory_accno,
c2.accno AS income_accno,
c3.accno AS expense_accno,
p.partnumber, i.description, i.qty, i.fxsellprice AS sellprice,
$query = qq|SELECT 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,
p.partnumber, i.description, i.qty, i.fxsellprice AS sellprice, p.inventory_accno_id AS part_inventory_accno_id,
i.parts_id AS id, i.unit, p.bin, i.deliverydate,
pr.projectnumber,
i.project_id, i.serialnumber,
pg.partsgroup
FROM invoice i
JOIN parts p ON (i.parts_id = p.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 (i.project_id = pr.id)
LEFT JOIN partsgroup pg ON (pg.id = p.partsgroup_id)
WHERE i.trans_id = $form->{id}
......
$sth->execute || $form->dberror($query);
while (my $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"});
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} ";
}
......
# get vendor
my $query = qq|SELECT v.name AS vendor, v.creditlimit, v.terms,
v.email, v.cc, v.bcc, v.language,
v.street, v.zipcode, v.city, v.country,
$duedate + v.terms AS duedate, v.notes AS intnotes
v.email, v.cc, v.bcc, v.language_id, v.payment_id,
v.street, v.zipcode, v.city, v.country, v.taxzone_id,
$duedate + v.terms AS duedate
FROM vendor v
WHERE v.id = $form->{vendor_id}|;
my $sth = $dbh->prepare($query);
......
qw(shiptoname shiptostreet shiptozipcode shiptocity shiptocountry shiptocontact shiptophone shiptofax shiptoemail);
$query = qq|SELECT s.* FROM shipto s
WHERE s.trans_id = $form->{vendor_id}|;
WHERE s.trans_id = $form->{vendor_id} AND s.module= 'CT'|;
$sth = $dbh->prepare($query);
$sth->execute || $form->dberror($query);
......
$where .= " ORDER BY p.partnumber";
}
my $transdate = "";
if ($form->{type} eq "invoice") {
$transdate = "'$form->{invdate}'";
} elsif ($form->{type} eq "purchase_order") {
$transdate = "'$form->{transdate}'";
} elsif ($form->{type} eq "request_quotation") {
$transdate = "'$form->{transdate}'";
}
if ($transdate eq "") {
$transdate = "current_date";
}
# connect to database
my $dbh = $form->dbconnect($myconfig);
my $query = qq|SELECT p.id, p.partnumber, p.description,
c1.accno AS inventory_accno,
c2.accno AS income_accno,
c3.accno AS expense_accno,
pg.partsgroup,
p.lastcost AS sellprice, p.unit, p.bin, p.onhand, p.notes AS partnotes
my $query = qq|SELECT p.id, p.partnumber, p.description, p.sellprice,
p.listprice, p.inventory_accno_id,
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,
p.unit, p.assembly, p.bin, p.onhand, p.notes AS partnotes, p.notes AS longdescription, p.not_discountable,
pg.partsgroup, p.formel, p.alu
FROM parts p
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 partsgroup pg ON (pg.id = p.partsgroup_id)
WHERE $where|;
my $sth = $dbh->prepare($query);
......
while (my $ref = $sth->fetchrow_hashref(NAME_lc)) {
# In der Buchungsgruppe ist immer ein Bestandskonto verknuepft, auch wenn
# es sich um eine Dienstleistung handelt. Bei Dienstleistungen muss das
# Buchungskonto also aus dem Ergebnis rausgenommen werden.
if (!$ref->{inventory_accno_id}) {
map({ delete($ref->{"inventory_${_}"}); } qw(accno new_chart valid));
}
delete($ref->{inventory_accno_id});
#set expense_accno=inventory_accno if they are different => bilanz
$vendor_accno =
($ref->{expense_accno} != $ref->{inventory_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 c.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} ";
}
......
$main::lxdebug->leave_sub();
}
sub post_payment {
$main::lxdebug->enter_sub();
my ($self, $myconfig, $form, $locale) = @_;
# connect to database, turn off autocommit
my $dbh = $form->dbconnect_noauto($myconfig);
$form->{datepaid} = $form->{invdate};
# total payments, don't move we need it here
for my $i (1 .. $form->{paidaccounts}) {
$form->{"paid_$i"} = $form->parse_amount($myconfig, $form->{"paid_$i"});
$form->{paid} += $form->{"paid_$i"};
$form->{datepaid} = $form->{"datepaid_$i"} if ($form->{"datepaid_$i"});
}
$form->{exchangerate} =
$form->get_exchangerate($dbh, $form->{currency}, $form->{invdate},
"buy");
# record payments and offsetting AP
for my $i (1 .. $form->{paidaccounts}) {
if ($form->{"paid_$i"} != 0) {
my ($accno) = split /--/, $form->{"AP_paid_$i"};
$form->{"datepaid_$i"} = $form->{invdate}
unless ($form->{"datepaid_$i"});
$form->{datepaid} = $form->{"datepaid_$i"};
$exchangerate = 0;
if (($form->{currency} eq $form->{defaultcurrency}) || ($form->{defaultcurrency} eq "")) {
$form->{"exchangerate_$i"} = 1;
} else {
$exchangerate =
$form->check_exchangerate($myconfig, $form->{currency},
$form->{"datepaid_$i"}, 'buy');
$form->{"exchangerate_$i"} =
($exchangerate)
? $exchangerate
: $form->parse_amount($myconfig, $form->{"exchangerate_$i"});
}
# record AP
$amount =
$form->round_amount($form->{"paid_$i"} * $form->{"exchangerate"},
2) * -1;
$query = qq|DELETE FROM acc_trans WHERE trans_id=$form->{id} AND chart_id=(SELECT c.id FROM chart c
WHERE c.accno = '$form->{AP}') AND amount=$amount AND transdate='$form->{"datepaid_$i"}'|;
$dbh->do($query) || $form->dberror($query);
$query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount,
transdate)
VALUES ($form->{id}, (SELECT c.id FROM chart c
WHERE c.accno = '$form->{AP}'),
$amount, '$form->{"datepaid_$i"}')|;
$dbh->do($query) || $form->dberror($query);
$query = qq|DELETE FROM acc_trans WHERE trans_id=$form->{id} AND chart_id=(SELECT c.id FROM chart c
WHERE c.accno = '$accno') AND amount=$form->{"paid_$i"} AND transdate='$form->{"datepaid_$i"}' AND source='$form->{"source_$i"}' AND memo='$form->{"memo_$i"}'|;
$dbh->do($query) || $form->dberror($query);
$query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate,
source, memo)
VALUES ($form->{id}, (SELECT c.id FROM chart c
WHERE c.accno = '$accno'),
$form->{"paid_$i"}, '$form->{"datepaid_$i"}',
'$form->{"source_$i"}', '$form->{"memo_$i"}')|;
$dbh->do($query) || $form->dberror($query);
# gain/loss
$amount =
$form->{"paid_$i"} * $form->{exchangerate} - $form->{"paid_$i"} *
$form->{"exchangerate_$i"};
if ($amount > 0) {
$form->{fx}{ $form->{fxgain_accno} }{ $form->{"datepaid_$i"} } +=
$amount;
} else {
$form->{fx}{ $form->{fxloss_accno} }{ $form->{"datepaid_$i"} } +=
$amount;
}
$diff = 0;
# update exchange rate
if (($form->{currency} ne $form->{defaultcurrency}) && !$exchangerate) {
$form->update_exchangerate($dbh, $form->{currency},
$form->{"datepaid_$i"},
$form->{"exchangerate_$i"}, 0);
}
}
}
# record exchange rate differences and gains/losses
foreach my $accno (keys %{ $form->{fx} }) {
foreach my $transdate (keys %{ $form->{fx}{$accno} }) {
if (
($form->{fx}{$accno}{$transdate} =
$form->round_amount($form->{fx}{$accno}{$transdate}, 2)
) != 0
) {
$query = qq|DELETE FROM acc_trans WHERE trans_id=$form->{id} AND chart_id=(SELECT c.id FROM chart c
WHERE c.accno = '$accno') AND amount=$form->{fx}{$accno}{$transdate} AND transdate='$transdate' AND cleared='0' AND fx_transaction='1'|;
$dbh->do($query) || $form->dberror($query);
$query = qq|INSERT INTO acc_trans (trans_id, chart_id, amount,
transdate, cleared, fx_transaction)
VALUES ($form->{id},
(SELECT c.id FROM chart c
WHERE c.accno = '$accno'),
$form->{fx}{$accno}{$transdate}, '$transdate', '0', '1')|;
$dbh->do($query) || $form->dberror($query);
}
}
}
my $datepaid = ($form->{paid}) ? qq|'$form->{datepaid}'| : "NULL";
# save AP record
my $query = qq|UPDATE ap set
paid = $form->{paid},
datepaid = $datepaid
WHERE id=$form->{id}|;
$dbh->do($query) || $form->dberror($query);
my $rc = $dbh->commit;
$dbh->disconnect;
$main::lxdebug->leave_sub();
return $rc;
}
1;

Auch abrufbar als: Unified diff