1. In der Datenbank wird tatsächlich gespeichert, ob eine Buchung storniert wurde bzw. eine Stornobuchung ist.
2. Der "Storno"-Button wird nur angezeigt, wenn die Buchung noch nicht storniert wurde.
3. Es wird verhindert, dass eine bereits stornierte Buchung erneut storniert wird (Fix für Bug 646).
4. Vor dem Stornieren wird die ursprüngliche Buchung erneut aus der Datenbank geladen, damit die Stornierung nicht vom Benutzer verändert werden kann.
my $i;
- # check if debit and credit balances
-
- if ($form->{storno}) {
- $form->{reference} = "Storno-" . $form->{reference};
- $form->{description} = "Storno-" . $form->{description};
- }
-
# connect to database, turn off AutoCommit
my $dbh = $form->dbconnect_noauto($myconfig);
$query =
qq|UPDATE gl SET
reference = ?, description = ?, notes = ?,
- transdate = ?, department_id = ?, taxincluded = ?
+ transdate = ?, department_id = ?, taxincluded = ?,
+ storno = ?, storno_id = ?
WHERE id = ?|;
@values = ($form->{reference}, $form->{description}, $form->{notes},
conv_date($form->{transdate}), $department_id, $form->{taxincluded},
+ $form->{storno} ? 't' : 'f', conv_i($form->{storno_id}),
conv_i($form->{id}));
do_query($form, $dbh, $query, @values);
}
}
+ if ($form->{storno} && $form->{storno_id}) {
+ do_query($form, $dbh, qq|UPDATE gl SET storno = 't' WHERE id = ?|, conv_i($form->{storno_id}));
+ }
+
# commit and redirect
my $rc = $dbh->commit;
$dbh->disconnect;
if ($form->{id}) {
$query =
- qq|SELECT g.reference, g.description, g.notes, g.transdate,
+ qq|SELECT g.reference, g.description, g.notes, g.transdate, g.storno, g.storno_id,
d.description AS department, e.name AS employee, g.taxincluded, g.gldate
FROM gl g
LEFT JOIN department d ON (d.id = g.department_id)
#======================================================================
use SL::GL;
+use SL::IS;
use SL::PE;
require "bin/mozilla/arap.pl";
}
-sub edit {
+sub prepare_transaction {
$lxdebug->enter_sub();
GL->transaction(\%myconfig, \%$form);
($form->datetonum($form->{transdate}, \%myconfig) <=
$form->datetonum($form->{closedto}, \%myconfig));
+ $lxdebug->leave_sub();
+}
+
+sub edit {
+ $lxdebug->enter_sub();
+
+ prepare_transaction();
+
$form->{title} = "Edit";
- &form_header;
- &display_rows;
- &form_footer;
- $lxdebug->leave_sub();
+ form_header();
+ display_rows();
+ form_footer();
+ $lxdebug->leave_sub();
}
+
sub search {
$lxdebug->enter_sub();
<body onLoad="fokus()">
<form method=post name="gl" action=$form->{script}>
+|;
-<input name=id type=hidden value=$form->{id}>
+ $form->hide_form(qw(id closedto locked storno storno_id));
-<input type=hidden name=closedto value=$form->{closedto}>
-<input type=hidden name=locked value=$form->{locked}>
+ print qq|
<input type=hidden name=title value="$title">
if ($form->{id}) {
- print qq|<input class=submit type=submit name=action value="|
- . $locale->text('Storno') . qq|">|;
+ if (!$form->{storno}) {
+ print qq|<input class=submit type=submit name=action value="|
+ . $locale->text('Storno') . qq|">|;
+ }
# Löschen und Ändern von Buchungen nicht mehr möglich (GoB) nur am selben Tag möglich
my @flds =
qw(accno debit credit projectnumber fx_transaction source memo tax taxchart);
- if ($form->{storno}) {
- for my $i (1 .. $form->{rowcount}) {
- unless (($form->{"debit_$i"} eq "") && ($form->{"credit_$i"} eq "")) {
- if ($form->{"debit_$i"} ne "") {
- $form->{"credit_$i"} = $form->{"debit_$i"};
- $form->{"debit_$i"} = "";
- } elsif ($form->{"credit_$i"} ne "") {
- $form->{"debit_$i"} = $form->{"credit_$i"};
- $form->{"credit_$i"} = "";
- }
- }
- }
- }
for my $i (1 .. $form->{rowcount}) {
sub storno {
$lxdebug->enter_sub();
- $form->{id} = 0;
- $form->{storno} = 1;
+ if (IS->has_storno(\%myconfig, $form, 'gl')) {
+ $form->{title} = $locale->text("Cancel General Ledger Transaction");
+ $form->error($locale->text("Transaction has already been cancelled!"));
+ }
+
+ my %keep_keys = map { $_, 1 } qw(login password id stylesheet);
+ map { delete $form->{$_} unless $keep_keys{$_} } keys %{ $form };
+
+ prepare_transaction();
+
+ for my $i (1 .. $form->{rowcount}) {
+ for (qw(debit credit tax)) {
+ $form->{"${_}_$i"} =
+ ($form->{"${_}_$i"})
+ ? $form->format_amount(\%myconfig, $form->{"${_}_$i"}, 2)
+ : "";
+ }
+ }
+
+ $form->{storno} = 1;
+ $form->{storno_id} = $form->{id};
+ $form->{id} = 0;
+
+ $form->{reference} = "Storno-" . $form->{reference};
+ $form->{description} = "Storno-" . $form->{description};
+
+ for my $i (1 .. $form->{rowcount}) {
+ next if (($form->{"debit_$i"} eq "") && ($form->{"credit_$i"} eq ""));
+
+ if ($form->{"debit_$i"} ne "") {
+ $form->{"credit_$i"} = $form->{"debit_$i"};
+ $form->{"debit_$i"} = "";
+
+ } else {
+ $form->{"debit_$i"} = $form->{"credit_$i"};
+ $form->{"credit_$i"} = "";
+ }
+ }
+
+ post();
+
# saving the history
if(!exists $form->{addition} && $form->{id} ne "") {
$form->{snumbers} = qq|ordnumber_| . $form->{ordnumber};
$form->save_history($form->dbconnect(\%myconfig));
}
# /saving the history
- &post;
+
$lxdebug->leave_sub();
}
'C' => 'G',
'CANCELED' => 'Storniert',
'Calculate' => 'Berechnen',
+ 'Cancel General Ledger Transaction' => 'Buchung stornieren',
'Cannot create Lock!' => 'System kann nicht gesperrt werden!',
'Cannot delete account!' => 'Konto kann nicht gelöscht werden!',
'Cannot delete customer!' => 'Kunde kann nicht gelöscht werden!',
'Transaction Date missing!' => 'Buchungsdatum fehlt!',
'Transaction deleted!' => 'Buchung gelöscht!',
'Transaction description' => 'Vorgangsbezeichnung',
+ 'Transaction has already been cancelled!' => 'Diese Buchung wurde bereits storniert.',
'Transaction posted!' => 'Buchung verbucht!',
'Transaction reversal enforced for all dates' => 'Fehleintragungen müssen für jeden Zeitraum mit einer Kontraeintragung ausgebessert werden',
'Transaction reversal enforced up to' => 'Fehleintragungen können bis zu dem angegebenen Zeitraum nur mit einer Kontraeintragung ausgebessert werden!',
'Buchungsjournal' => 'Buchungsjournal',
'Buchungsnummer' => 'Buchungsnummer',
'CANCELED' => 'Storniert',
+ 'Cancel General Ledger Transaction' => 'Buchung stornieren',
'Cannot delete transaction!' => 'Buchung kann nicht gelöscht werden!',
'Cannot have a value in both Debit and Credit!' => 'Es kann nicht gleichzeitig Soll und Haben gebucht werden!',
'Cannot post a transaction without a value!' => 'Eine Buchung ohne Betrag kann nicht vorgenommen werden!',
'To (time)' => 'Bis',
'Transaction Date missing!' => 'Buchungsdatum fehlt!',
'Transaction deleted!' => 'Buchung gelöscht!',
+ 'Transaction has already been cancelled!' => 'Diese Buchung wurde bereits storniert.',
'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
'Unbalanced Ledger' => 'Bilanzfehler',
'Unit' => 'Einheit',
--- /dev/null
+-- @tag: gl_storno
+-- @description: Spalten für Dialogbuchen zum Speichern, ob diese Buchung storniert wurde bzw. für welche andere Buchung diese eine Stornobuchung ist
+-- @depends: release_2_4_2
+ALTER TABLE gl ADD COLUMN storno boolean;
+ALTER TABLE gl ALTER COLUMN storno SET DEFAULT 'f';
+
+ALTER TABLE gl ADD COLUMN storno_id integer;
+ALTER TABLE gl ADD FOREIGN KEY (storno_id) REFERENCES gl (id);
+
+UPDATE gl SET storno = 'f';
+
+UPDATE gl SET storno = 't'
+ WHERE (reference LIKE 'Storno-%')
+ AND (description LIKE 'Storno-%')
+ AND EXISTS
+ (SELECT gl2.id
+ FROM gl gl2
+ WHERE ('Storno-' || gl2.reference = gl.reference)
+ AND ('Storno-' || gl2.description = gl.description)
+ AND (gl2.id < gl.id));
+
+UPDATE gl SET storno = 't'
+ WHERE (reference NOT LIKE 'Storno-%')
+ AND (description NOT LIKE 'Storno-%')
+ AND EXISTS
+ (SELECT gl2.id
+ FROM gl gl2
+ WHERE ('Storno-' || gl.reference = gl2.reference)
+ AND ('Storno-' || gl.description = gl2.description)
+ AND (gl2.id > gl.id));
+
+UPDATE gl SET storno_id =
+ (SELECT id
+ FROM gl gl2
+ WHERE ('Storno-' || gl2.reference = gl.reference)
+ AND ('Storno-' || gl2.description = gl.description)
+ AND (gl2.id < gl.id)
+ ORDER BY itime
+ LIMIT 1)
+ WHERE storno
+ AND (reference LIKE 'Storno-%')
+ AND (description LIKE 'Storno-%');