199 |
199 |
$self->{trans_id} = $_[0];
|
200 |
200 |
}
|
201 |
201 |
|
|
202 |
die "illegal trans_id passed for DATEV export: " . $self->{trans_id} . "\n" unless $self->{trans_id} =~ m/^\d+$/;
|
|
203 |
|
202 |
204 |
return $self->{trans_id};
|
203 |
205 |
}
|
204 |
206 |
|
... | ... | |
346 |
348 |
sub _get_transactions {
|
347 |
349 |
$main::lxdebug->enter_sub();
|
348 |
350 |
my $self = shift;
|
349 |
|
my $fromto = shift;
|
|
351 |
my $fromto = shift;
|
350 |
352 |
my $progress_callback = shift || sub {};
|
351 |
353 |
|
352 |
354 |
my $form = $main::form;
|
353 |
355 |
|
354 |
356 |
my $trans_id_filter = '';
|
355 |
357 |
|
356 |
|
$trans_id_filter = 'AND ac.trans_id = ' . $self->trans_id if $self->trans_id;
|
|
358 |
if ( $self->{trans_id} ) {
|
|
359 |
# ignore dates when trans_id is passed so that the entire transaction is
|
|
360 |
# checked, not just either the initial bookings or the subsequent payments
|
|
361 |
# (the transdates will likely differ)
|
|
362 |
$fromto = '';
|
|
363 |
$trans_id_filter = 'ac.trans_id = ' . $self->trans_id;
|
|
364 |
} else {
|
|
365 |
$fromto =~ s/transdate/ac\.transdate/g;
|
|
366 |
};
|
357 |
367 |
|
358 |
368 |
my ($notsplitindex);
|
359 |
369 |
|
360 |
|
$fromto =~ s/transdate/ac\.transdate/g;
|
361 |
|
|
362 |
370 |
my $filter = ''; # Useful for debugging purposes
|
363 |
371 |
|
364 |
372 |
my %all_taxchart_ids = selectall_as_map($form, $self->dbh, qq|SELECT DISTINCT chart_id, TRUE AS is_set FROM tax|, 'chart_id', 'is_set');
|
... | ... | |
421 |
429 |
$self->{DATEV} = [];
|
422 |
430 |
|
423 |
431 |
my $counter = 0;
|
424 |
|
while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
|
|
432 |
my $continue = 1; #
|
|
433 |
my $name;
|
|
434 |
while ( $continue && (my $ref = $sth->fetchrow_hashref("NAME_lc")) ) {
|
|
435 |
last unless $ref; # for single transactions
|
425 |
436 |
$counter++;
|
426 |
437 |
if (($counter % 500) == 0) {
|
427 |
438 |
$progress_callback->($counter);
|
... | ... | |
445 |
456 |
# keep fetching new acc_trans lines until the end of a balanced group is reached
|
446 |
457 |
while (abs($count) > 0.01 || $firstrun || ($subcent && abs($count) > 0.005)) {
|
447 |
458 |
my $ref2 = $sth->fetchrow_hashref("NAME_lc");
|
448 |
|
last unless ($ref2);
|
|
459 |
unless ( $ref2 ) {
|
|
460 |
$continue = 0;
|
|
461 |
last;
|
|
462 |
};
|
449 |
463 |
|
450 |
464 |
# check if trans_id of current acc_trans line is still the same as the
|
451 |
|
# trans_id of the first line in group
|
|
465 |
# trans_id of the first line in group, i.e. we haven't finished a 0-group
|
|
466 |
# before moving on to the next trans_id, error will likely be in the old
|
|
467 |
# trans_id.
|
452 |
468 |
|
453 |
469 |
if ($ref2->{trans_id} != $trans->[0]->{trans_id}) {
|
454 |
|
$self->add_error("Unbalanced ledger! old trans_id " . $trans->[0]->{trans_id} . " new trans_id " . $ref2->{trans_id} . " count $count");
|
|
470 |
require SL::DB::Manager::AccTransaction;
|
|
471 |
if ( $trans->[0]->{trans_id} ) {
|
|
472 |
my $acc_trans_old_obj = SL::DB::Manager::AccTransaction->get_first(where => [ trans_id => $trans->[0]->{trans_id} ]);
|
|
473 |
$self->add_error("Unbalanced ledger! Old: " . $acc_trans_old_obj->transaction_name) if ref($acc_trans_old_obj);
|
|
474 |
};
|
|
475 |
if ( $ref2->{trans_id} ) {
|
|
476 |
my $acc_trans_curr_obj = SL::DB::Manager::AccTransaction->get_first(where => [ trans_id => $ref2->{trans_id} ]);
|
|
477 |
$self->add_error("Unbalanced ledger! New:" . $acc_trans_curr_obj->transaction_name) if ref($acc_trans_curr_obj);
|
|
478 |
};
|
|
479 |
$self->add_error("count: $count");
|
455 |
480 |
return;
|
456 |
481 |
}
|
457 |
482 |
|
... | ... | |
618 |
643 |
|
619 |
644 |
$absumsatz = $form->round_amount($absumsatz, 2);
|
620 |
645 |
if (abs($absumsatz) >= (0.01 * (1 + scalar @taxed))) {
|
621 |
|
$self->add_error("Datev-Export fehlgeschlagen! Bei Transaktion $trans->[0]->{trans_id} ($absumsatz)");
|
|
646 |
require SL::DB::Manager::AccTransaction;
|
|
647 |
my $acc_trans_obj = SL::DB::Manager::AccTransaction->get_first(where => [ trans_id => $trans->[0]->{trans_id} ]);
|
|
648 |
$self->add_error("Datev-Export fehlgeschlagen! Bei Transaktion " . $acc_trans_obj->transaction_name . " ($absumsatz)");
|
622 |
649 |
|
623 |
650 |
} elsif (abs($absumsatz) >= 0.01) {
|
624 |
651 |
$self->add_net_gross_differences($absumsatz);
|
... | ... | |
1066 |
1093 |
|
1067 |
1094 |
use SL::DATEV qw(:CONSTANTS);
|
1068 |
1095 |
|
|
1096 |
my $startdate = DateTime->new(year => 2014, month => 9, day => 1);
|
|
1097 |
my $enddate = DateTime->new(year => 2014, month => 9, day => 31);
|
1069 |
1098 |
my $datev = SL::DATEV->new(
|
1070 |
1099 |
exporttype => DATEV_ET_BUCHUNGEN,
|
1071 |
1100 |
format => DATEV_FORMAT_KNE,
|
... | ... | |
1073 |
1102 |
to => $enddate,
|
1074 |
1103 |
);
|
1075 |
1104 |
|
|
1105 |
# To only export transactions from a specific trans_id: (from and to are ignored)
|
|
1106 |
my $invoice = SL::DB::Manager::Invoice->find_by( invnumber => '216' );
|
|
1107 |
my $datev = SL::DATEV->new(
|
|
1108 |
exporttype => DATEV_ET_BUCHUNGEN,
|
|
1109 |
format => DATEV_FORMAT_KNE,
|
|
1110 |
trans_id => $invoice->trans_id,
|
|
1111 |
);
|
|
1112 |
|
1076 |
1113 |
my $datev = SL::DATEV->new(
|
1077 |
1114 |
exporttype => DATEV_ET_STAMM,
|
1078 |
1115 |
format => DATEV_FORMAT_KNE,
|
... | ... | |
1084 |
1121 |
my $hashref = $datev->get_datev_stamm;
|
1085 |
1122 |
$datev->save_datev_stamm($hashref);
|
1086 |
1123 |
|
1087 |
|
# manually clean up temporary directories
|
|
1124 |
# manually clean up temporary directories older than 8 hours
|
1088 |
1125 |
$datev->clean_temporary_directories;
|
1089 |
1126 |
|
1090 |
1127 |
# export
|
... | ... | |
1117 |
1154 |
|
1118 |
1155 |
=item new PARAMS
|
1119 |
1156 |
|
1120 |
|
Generic constructor. See section attributes for information about hat to pass.
|
|
1157 |
Generic constructor. See section attributes for information about what to pass.
|
1121 |
1158 |
|
1122 |
1159 |
=item get_datev_stamm
|
1123 |
1160 |
|
... | ... | |
1159 |
1196 |
|
1160 |
1197 |
=item filenames
|
1161 |
1198 |
|
1162 |
|
Returns a list of filenames generated by this DATEV object. This only works if th files were generated during it's lifetime, not if the object was created from a download_token.
|
|
1199 |
Returns a list of filenames generated by this DATEV object. This only works if the files were generated during its lifetime, not if the object was created from a download_token.
|
1163 |
1200 |
|
1164 |
1201 |
=item net_gross_differences
|
1165 |
1202 |
|
... | ... | |
1211 |
1248 |
|
1212 |
1249 |
=item to
|
1213 |
1250 |
|
1214 |
|
Set boundary dates for the export. Currently thse MUST be set for the export to work.
|
|
1251 |
Set boundary dates for the export. Unless a trans_id is passed these MUST be
|
|
1252 |
set for the export to work.
|
|
1253 |
|
|
1254 |
=item trans_id
|
|
1255 |
|
|
1256 |
To check only one gl/ar/ap transaction, pass the trans_id. The attributes
|
|
1257 |
L<from> and L<to> are currently still needed for the query to be assembled
|
|
1258 |
correctly.
|
1215 |
1259 |
|
1216 |
1260 |
=item accnofrom
|
1217 |
1261 |
|
... | ... | |
1255 |
1299 |
|
1256 |
1300 |
=item *
|
1257 |
1301 |
|
1258 |
|
OBE rxport was called, which is not yet implemented.
|
|
1302 |
OBE export was called, which is not yet implemented.
|
1259 |
1303 |
|
1260 |
1304 |
=item *
|
1261 |
1305 |
|
... | ... | |
1274 |
1318 |
=item *
|
1275 |
1319 |
|
1276 |
1320 |
C<Datev-Export fehlgeschlagen! Bei Transaktion %d (%f).> This error occurs if a
|
1277 |
|
transaction could not be reliably sorted out, or had rounding errors over the acceptable threshold.
|
|
1321 |
transaction could not be reliably sorted out, or had rounding errors above the acceptable threshold.
|
1278 |
1322 |
|
1279 |
1323 |
=back
|
1280 |
1324 |
|
... | ... | |
1284 |
1328 |
|
1285 |
1329 |
=item *
|
1286 |
1330 |
|
1287 |
|
Handling of Vollvorlauf is currently not fully implemented. You must provide both from and to to get a working export.
|
|
1331 |
Handling of Vollvorlauf is currently not fully implemented. You must provide both from and to in order to get a working export.
|
1288 |
1332 |
|
1289 |
1333 |
=item *
|
1290 |
1334 |
|
DATEV - Buchungscheck prüft nur Buchungen einer trans_id
DATEV-Check für AR/AP/IS/IR/GL:
In der ersten Inkarnation wurden beim Check alle Buchungen des selben
Tages mit geprüft. In der zweiten Version wurde zusätzlich zum
Tagesdatum nach der trans_id der aktuellen Buchung gefiltert. Hatte die
Zahlung ein anderes Datum als die Rechnung wurde die Rechnung nicht
nochmal geprüft.
Jetzt wird beim Datevcheck bei jeder Buchung/Zahlung immer die komplette
Buchung auf Datevkompatibilität geprüft.
Es ist nun auch möglich, einzelne Transaktionen gezielt zu
kontrollieren, z.B. per console, indem man nur die trans_id ohne
von-bis-Datum eingibt.
Tritt ein DATEV-Exportfehler auf wird nun außerdem mehr Information zu
den verdächtigen Buchungen ausgegeben (vorher nur trans_id und amount).