Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 57342517

Von Jan Büren vor fast 3 Jahren hinzugefügt

  • ID 5734251762d9fc172a5110472d029bb6a36578a0
  • Vorgänger 053d0c37
  • Nachfolger bb84bc55

Kreditorenbuchung um Steuerschlüssel 94 (reverse charge) erweitert

Bucht die gegensätzliche Steuer auf eine verknüpfte Dialogbuchung
und setzt den Steuerschlüssel beim DATEV-Export auf 0. Ferner sind
Steuer inklusive Buchungen unterbunden und die Dialogbuchung ist
nicht veränderbar, wird aber entsprechend modifiziert wenn die
Quell-Buchung geändert (gelöscht) wird.

Unterschiede anzeigen:

SL/AP.pm
39 39
use SL::DBUtils;
40 40
use SL::IO;
41 41
use SL::MoreCommon;
42
use SL::DB::ApGl;
42 43
use SL::DB::Default;
43 44
use SL::DB::Draft;
44 45
use SL::DB::Order;
......
406 407
    SL::DB::Manager::Draft->delete_all(where => [ id => delete($form->{draft_id}) ]);
407 408
  }
408 409

  
410
  # hook for taxkey 94
411
  $self->_reverse_charge($myconfig, $form);
409 412
  # safety check datev export
410 413
  if ($::instance_conf->get_datev_check_on_ap_transaction) {
411 414
    my $datev = SL::DATEV->new(
......
422 425
  return 1;
423 426
}
424 427

  
428
sub _reverse_charge {
429
  my ($self, $myconfig, $form) = @_;
430

  
431
  # check taxkey settings or return
432
  my $tax = SL::DB::Manager::Tax->get_first( where => [taxkey => 94 ]);
433
  return unless ref $tax eq 'SL::DB::Tax';
434

  
435
  # delete previous bookings, if they exists (repost)
436
  my $ap_gl = SL::DB::Manager::ApGl->get_first(where => [ ap_id => $form->{id} ]);
437
  my $gl_id = ref $ap_gl eq 'SL::DB::ApGl' ? $ap_gl->gl_id : undef;
438

  
439
  SL::DB::Manager::GLTransaction->delete_all(where => [ id    => $gl_id ])       if $gl_id;
440
  SL::DB::Manager::ApGl->         delete_all(where => [ ap_id => $form->{id} ])  if $gl_id;
441
  SL::DB::Manager::RecordLink->   delete_all(where => [ from_table => 'ap', to_table => 'gl', from_id => $form->{id} ]);
442

  
443
  # gl booking
444
  my ($credit, $debit);
445
  $credit   = SL::DB::Manager::Chart->find_by(id => $tax->chart_id);
446
  $debit    = SL::DB::Manager::Chart->find_by(id => $tax->reverse_charge_chart_id);
447

  
448
  croak("No such Chart ID" . $tax->chart_id)          unless ref $credit eq 'SL::DB::Chart';
449
  croak("No such Chart ID" . $tax->reverse_chart_id)  unless ref $debit  eq 'SL::DB::Chart';
450

  
451
  my ($i, $current_transaction);
452

  
453
  for $i (1 .. $form->{rowcount}) {
454
    next unless $form->{"taxkey_$i"} == 94;
455

  
456
    my ($tmpnetamount, $tmptaxamount) = $form->calculate_tax($form->{"amount_$i"}, 0.19, $form->{taxincluded}, 2);
457
    $current_transaction = SL::DB::GLTransaction->new(
458
          employee_id    => $form->{employee_id},
459
          transdate      => $form->{transdate},
460
          description    => $form->{notes} || $form->{invnumber},
461
          reference      => $form->{invnumber},
462
          department_id  => $form->{department_id} ? $form->{department_id} : undef,
463
          imported       => 0, # not imported
464
          taxincluded    => 0,
465
        )->add_chart_booking(
466
          chart  => $tmptaxamount < 0 ? $credit : $debit,
467
          credit => abs($tmptaxamount),
468
          source => "Reverse Charge for " . $form->{invnumber},
469
        )->add_chart_booking(
470
          chart  => $tmptaxamount < 0 ? $debit : $credit,
471
          debit  => abs($tmptaxamount),
472
          source => "Reverse Charge for " . $form->{invnumber},
473
      )->post;
474
    # add a stable link from ap to gl
475
    my %props_gl = (
476
        ap_id => $form->{id},
477
        gl_id => $current_transaction->id,
478
      );
479
    SL::DB::ApGl->new(%props_gl)->save;
480
    # Record a record link from ap to gl
481
    my %props_rl = (
482
        from_table => 'ap',
483
        from_id    => $form->{id},
484
        to_table   => 'gl',
485
        to_id      => $current_transaction->id,
486
      );
487
    SL::DB::RecordLink->new(%props_rl)->save;
488
  }
489
}
490

  
425 491
sub delete_transaction {
426 492
  $main::lxdebug->enter_sub();
427 493

  
428 494
  my ($self, $myconfig, $form) = @_;
429 495

  
430 496
  SL::DB->client->with_transaction(sub {
497

  
498
    # if tax 94 reverse charge, clear all GL bookings and links
499
    my $ap_gl = SL::DB::Manager::ApGl->get_first(where => [ ap_id => $form->{id} ]);
500
    my $gl_id = ref $ap_gl eq 'SL::DB::ApGl' ? $ap_gl->gl_id : undef;
501

  
502
    SL::DB::Manager::GLTransaction->delete_all(where => [ id    => $gl_id ])       if $gl_id;
503
    SL::DB::Manager::ApGl->         delete_all(where => [ ap_id => $form->{id} ])  if $gl_id;
504
    SL::DB::Manager::RecordLink->   delete_all(where => [ from_table => 'ap', to_table => 'gl', from_id => $form->{id} ]);
505
    # done gl delete for tax 94 case
506

  
507
    # begin ap delete
431 508
    my $query = qq|DELETE FROM ap WHERE id = ?|;
432 509
    do_query($form, SL::DB->client->dbh, $query, $form->{id});
433 510
    1;
SL/DATEV.pm
835 835
      }
836 836
      if ($transaction->[$i]->{'taxkey'}) {
837 837
        $taxkey = $transaction->[$i]->{'taxkey'};
838
        $taxkey = 0 if $taxkey == 94; # taxbookings are in gl
838 839
      }
839 840
      if ($transaction->[$i]->{'charttax'}) {
840 841
        $charttax = $transaction->[$i]->{'charttax'};
bin/mozilla/ap.pl
493 493
    $form->{"selected_taxchart_$i"}  = $selected_taxchart;
494 494
    $form->{"AP_amount_chart_id_$i"} = $amount_chart_id;
495 495
    $form->{"taxcharts_$i"}          = \@taxcharts;
496

  
497
    # reverse charge hack for template, display two taxes
498
    if ($taxchart_to_use->taxkey == 94) {
499
      my $tmpnetamount;
500
      ($tmpnetamount, $form->{"tax_reverse_$i"}) = $form->calculate_tax($form->parse_amount(\%myconfig, $form->{"amount_$i"}), 0.19, $form->{taxincluded},2);
501
      $form->{"tax_charge_$i"}  = $form->{"tax_reverse_$i"} * -1;
502
      $form->{"tax_reverse_$i"} = $form->format_amount(\%myconfig, $form->{"tax_reverse_$i"}, 2);
503
      $form->{"tax_charge_$i"}  = $form->format_amount(\%myconfig, $form->{"tax_charge_$i"}, 2);
504
    }
496 505
  }
497 506

  
498 507
  $form->{taxchart_value_title_sub} = sub {
......
797 806
  $form->error($locale->text('Cannot post transaction for a closed period!')) if ($form->date_closed($form->{"transdate"}, \%myconfig));
798 807

  
799 808
  my $zero_amount_posting = 1;
809
  # no taxincluded for 94
810
  my $tax = SL::DB::Manager::Tax->get_first( where => [taxkey => 94 ]);
811
  my $tax_id = ref $tax eq 'SL::DB::Tax' ? $tax->id : undef;
800 812
  for my $i (1 .. $form->{rowcount}) {
813
    # no taxincluded for 94
814
    if ($tax_id && $form->{"taxchart_$i"} =~ m/^$tax_id--/ && $form->{taxincluded}) {
815
      $form->error($locale->text('Cannot Post AP transaction with tax included!'));
816
    }
801 817
    if ($form->parse_amount(\%myconfig, $form->{"amount_$i"})) {
802 818
      $zero_amount_posting = 0;
803
      last;
804 819
    }
805 820
  }
806 821

  
......
1348 1363

  
1349 1364
    $is_linked_bank_transaction = 1;
1350 1365
  }
1366
  my $is_linked_gl_transaction;
1367
  if ($::form->{id} && SL::DB::Manager::ApGl->find_by(ap_id => $::form->{id})) {
1368
    $is_linked_gl_transaction = 1;
1369
  }
1351 1370

  
1352 1371
  my $create_post_action = sub {
1353 1372
    # $_[0]: description
......
1419 1438
                    : $is_storno           ? t8('Reversal invoices cannot be canceled.')
1420 1439
                    : $::form->{totalpaid} ? t8('Invoices with payments cannot be canceled.')
1421 1440
                    : $has_sepa_exports    ? t8('This invoice has been linked with a sepa export, undo this first.')
1441
                    : $is_linked_gl_transaction ? t8('This transaction is linked with a gl transaction. Please delete the ap transaction booking if needed.')
1422 1442
                    :                        undef,
1423 1443
        ],
1424 1444
        action => [ t8('Delete'),
......
1426 1446
          confirm  => t8('Do you really want to delete this object?'),
1427 1447
          disabled => !$may_edit_create           ? t8('You must not change this AP transaction.')
1428 1448
                    : !$::form->{id}              ? t8('This invoice has not been posted yet.')
1429
                    : $change_never               ? t8('Changing invoices has been disabled in the configuration.')
1430
                    : $change_on_same_day_only    ? t8('Invoices can only be changed on the day they are posted.')
1431
                    : $has_storno                 ? t8('This invoice has been canceled already.')
1432 1449
                    : $is_closed                  ? t8('The billing period has already been locked.')
1433 1450
                    : $has_sepa_exports           ? t8('This invoice has been linked with a sepa export, undo this first.')
1434 1451
                    : $is_linked_bank_transaction ? t8('This transaction is linked with a bank transaction. Please undo and redo the bank transaction booking if needed.')
1452
                    : $is_linked_gl_transaction   ? undef # linked transactions can be deleted, if period is not closed
1453
                    : $change_never               ? t8('Changing invoices has been disabled in the configuration.')
1454
                    : $change_on_same_day_only    ? t8('Invoices can only be changed on the day they are posted.')
1455
                    : $has_storno                 ? t8('This invoice has been canceled already.')
1435 1456
                    :                               undef,
1436 1457
        ],
1437 1458
      ], # end of combobox "Storno"
templates/webpages/ap/form_header.html
211 211
              <input name="amount_[% i %]" size="10" value="[% temp = "amount_"_ i %][% $temp | html %]">
212 212
            </td>
213 213
            <td>
214
              [% temp = "tax_"_ i %][% $temp | html %]
214
              [% IF "tax_reverse_"_ i  %]
215
                [% temp_r = "tax_reverse_"_ i %][% $temp_r | html %]
216
                &nbsp;&nbsp;&nbsp;
217
                [% temp_c = "tax_charge_"_ i %][% $temp_c | html %]
218
              [% ELSE %]
219
                [% temp = "tax_"_ i %][% $temp | html %]
220
              [% END %]
215 221
            </td>
216 222
            <td>
217 223
              [% temp = 'selected_taxchart_'_ i %]

Auch abrufbar als: Unified diff