Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision d180d84e

Von Kivitendo Admin vor mehr als 9 Jahren hinzugefügt

  • ID d180d84e035a21291e2dc186b4430e3336998156
  • Vorgänger cd8b56f2
  • Nachfolger 36ee5173

Keine Weiche für mt940 in SL/Controller/CsvImport.pm mehr

Stattdessen ein eigener Controller BankImport, der die Daten über einen
neuen Helper in SL/Helper/MT940.pm (wo aqbanking-cli aufgerufen wird)
nach CSV konvertiert.

mt940 ist nun kein eigener Importtyp vom CSV-Import mehr. Stattdessen
wird nach der mt940 Upload-Maske ein CSV-Import-Profil geladen und
direkt ein Redirect auf den CSV-Import vom Typ Bankbewegungen
ausgeführt. Durch setzen des Parameters "force_profile" und ein Redirect
auf CsvImport/test statt CsvImport/new wird der Import auch direkt im
"Test und Vorschau"-Modus ausgeführt und der Benutzer sieht direkt das
Ergebnis. Ab hier verhält sich der Import also genau so, als ob der
User direkt eine CSV-Datei hochgeladen hätte.

Ein Nachteil der Umstellung ist, daß die CSV Profildefaults nun nicht
mehr auf den Typ "mt940" reagieren können und auf ein existierendes
CSV-Profil zurückgreifen müssen. Beim ersten MT940 Import wird bei
fehlen dieses Profils eine Meldung an den User gegeben.

Man könnte ein Referenzprofil per Update einspielen, allerdings sind die
Profile an Logins gebunden, und man bräuchte dafür ein globales Profil
und müßte hierfür generell die Profile erweitern.

TODO: Hilfetext wie das Profil einzustellen ist

Unterschiede anzeigen:

SL/Controller/BankImport.pm
1
package SL::Controller::BankImport;
2
use strict;
3
use Data::Dumper;
4
use parent qw(SL::Controller::Base);
5

  
6
use SL::Locale::String qw(t8);
7
use SL::DB::CsvImportProfile;
8
use SL::Helper::MT940;
9

  
10

  
11
sub action_upload_mt940 {
12
  my ($self, %params) = @_;
13

  
14
  my $profile = SL::DB::Manager::CsvImportProfile->find_by(name => 'MT940', login => $::myconfig{login});
15
  $self->render('bankimport/form', title => $::locale->text('MT940 import'), profile => $profile ? 1 : 0);
16

  
17
}
18

  
19
sub action_import_mt940 {
20
  my ($self, %params) = @_;
21

  
22
  die "missing file for action import" unless $::form->{file};
23

  
24
  my $converted_data = SL::Helper::MT940::convert_mt940_data($::form->{file});
25

  
26
  # store the converted data in a session file with a name expected by the profile type "bank_transactions"
27
  my $file = SL::SessionFile->new("csv-import-bank_transactions.csv", mode => '>');
28
  $file->fh->print($converted_data);
29
  $file->fh->close;
30

  
31
  my $profile = SL::DB::Manager::CsvImportProfile->find_by(name => 'MT940', login => $::myconfig{login});
32
  die t8("The MT940 import needs an import profile called MT940") unless $profile;
33

  
34
  $self->redirect_to(controller => 'controller.pl', action => 'CsvImport/test', 'profile.type' => 'bank_transactions', 'profile.id' => $profile->id, force_profile => 1);
35

  
36
};
37

  
38
1;
39

  
SL/Controller/CsvImport.pm
224 224
sub check_type {
225 225
  my ($self) = @_;
226 226

  
227
  die "Invalid CSV import type" if none { $_ eq $::form->{profile}->{type} } qw(parts inventories customers_vendors addresses contacts projects orders bank_transactions mt940);
227
  die "Invalid CSV import type" if none { $_ eq $::form->{profile}->{type} } qw(parts inventories customers_vendors addresses contacts projects orders bank_transactions);
228 228
  $self->type($::form->{profile}->{type});
229 229
}
230 230

  
......
270 270
            : $self->type eq 'projects'          ? $::locale->text('CSV import: projects')
271 271
            : $self->type eq 'orders'            ? $::locale->text('CSV import: orders')
272 272
            : $self->type eq 'bank_transactions' ? $::locale->text('CSV import: bank transactions')
273
            : $self->type eq 'mt940'             ? $::locale->text('CSV import: MT940')
274 273
            : die;
275 274

  
276 275
  if ($self->{type} eq 'customers_vendors' or $self->{type} eq 'orders'  ) {
......
290 289
sub test_and_import_deferred {
291 290
  my ($self, %params) = @_;
292 291

  
293
  $self->profile_from_form;
292
  if ( $::form->{force_profile} && $::form->{profile}->{id} ) {
293
    $self->load_default_profile;
294
  }  else {
295
    $self->profile_from_form;
296
  };
294 297

  
295
  if ( $::form->{file} && $::form->{FILENAME} =~ /\.940$/ ) {
296
    my $mt940_file = SL::SessionFile->new($::form->{FILENAME}, mode => '>');
297
    $mt940_file->fh->print($::form->{file});
298
    $mt940_file->fh->close;
299

  
300
    my $aqbin = $::lx_office_conf{applications}->{aqbanking};
301
    die "Can't find aqbanking-cli, please check your configuration file.\n" unless -f $aqbin;
302
    my $cmd = "$aqbin --cfgdir=\"users\" import --importer=\"swift\" --profile=\"SWIFT-MT940\" -f " . $mt940_file->file_name . " | $aqbin --cfgdir=\"users\" listtrans --exporter=\"csv\" --profile=\"AqMoney2\" ";
303
    my $converted_mt940;
304
    open(MT, "$cmd |");
305
    $converted_mt940 .=  '"transaction_id";"local_bank_code";"local_account_number";"remote_bank_code";"remote_account_number";"transdate";"valutadate";"amount";"currency";"remote_name";"remote_name_1";"purpose";"purpose1";"purpose2";"purpose3";"purpose4";"purpose5";"purpose6";"purpose7";"purpose8";"purpose9";"purpose10";"purpose11"' . "\n";
306
    my $headerline = <MT>;  # discard original header line
307
    while (<MT>) {
308
      $converted_mt940 .= $_;
309
    };
298
  if ($::form->{file}) {
310 299
    my $file = SL::SessionFile->new($self->csv_file_name, mode => '>');
311
    $file->fh->print($converted_mt940);
300
    $file->fh->print($::form->{file});
312 301
    $file->fh->close;
313
  } elsif ($::form->{file}) {
314
      my $file = SL::SessionFile->new($self->csv_file_name, mode => '>');
315
      $file->fh->print($::form->{file});
316
      $file->fh->close;
317 302
  }
318 303

  
319 304
  my $file = SL::SessionFile->new($self->csv_file_name, mode => '<', encoding => $self->profile->get('charset'));
......
641 626
       : $self->{type} eq 'projects'          ? SL::Controller::CsvImport::Project->new(@args)
642 627
       : $self->{type} eq 'orders'            ? SL::Controller::CsvImport::Order->new(@args)
643 628
       : $self->{type} eq 'bank_transactions' ? SL::Controller::CsvImport::BankTransaction->new(@args)
644
       : $self->{type} eq 'mt940'             ? SL::Controller::CsvImport::BankTransaction->new(@args)
645 629
       :                                        die "Program logic error";
646 630
}
647 631

  
SL/Helper/MT940.pm
1
package SL::Helper::MT940;
2

  
3
use strict;
4

  
5
sub convert_mt940_data {
6
  my ($mt940_data) = @_;
7

  
8
  # takes the data from an uploaded mt940 file, converts it to csv via aqbanking and returns the converted data
9
  # The uploaded file data is stored as a session file, just like the aqbanking settings file.
10

  
11
  my $import_filename = 'bank_transfer.940';
12
  my $sfile = SL::SessionFile->new($import_filename, mode => '>');
13
  $sfile->fh->print($mt940_data);
14
  $sfile->fh->close;
15

  
16
  my $aqbin = $::lx_office_conf{applications}->{aqbanking};
17
  die "Can't find aqbanking-cli, please check your configuration file.\n" unless -f $aqbin;
18
  my $cmd = "$aqbin --cfgdir=\"" . $sfile->get_path . "\" import --importer=\"swift\" --profile=\"SWIFT-MT940\" -f " . $sfile->get_path . "/$import_filename | $aqbin --cfgdir=\"" . $sfile->get_path . "\" listtrans --exporter=\"csv\" --profile=\"AqMoney2\" ";
19

  
20
  my $converted_data = '"empty";"local_bank_code";"local_account_number";"remote_bank_code";"remote_account_number";"transdate";"valutadate";"amount";"currency";"remote_name";"remote_name_1";"purpose";"purpose1";"purpose2";"purpose3";"purpose4";"purpose5";"purpose6";"purpose7";"purpose8";"purpose9";"purpose10";"purpose11"' . "\n";
21

  
22
  open my $mt, "-|", "$cmd" || die "Problem with executing aqbanking\n";
23
  my $headerline = <$mt>;  # discard original aqbanking header line
24
  while (<$mt>) {
25
    $converted_data .= $_;
26
  };
27
  close $mt;
28
  return $converted_data;
29
};
30

  
31
1;
locale/de/all
453 453
  'CSS style for pictures'      => 'CSS Style für Bilder',
454 454
  'CSV'                         => 'CSV',
455 455
  'CSV export -- options'       => 'CSV-Export -- Optionen',
456
  'CSV import: MT940'           => 'CSV Import: MT940',
457 456
  'CSV import: bank transactions' => 'CSV Import: Bankbewegungen',
458 457
  'CSV import: contacts'        => 'CSV-Import: Ansprechpersonen',
459 458
  'CSV import: customers and vendors' => 'CSV-Import: Kunden und Lieferanten',
......
1362 1361
  'Import'                      => 'Import',
1363 1362
  'Import CSV'                  => 'CSV-Import',
1364 1363
  'Import Status'               => 'Import Status',
1364
  'Import a MT940 file:'        => 'Laden Sie eine MT940 Datei hoch:',
1365 1365
  'Import file'                 => 'Import-Datei',
1366 1366
  'Import not started yet, please wait...' => 'Der Taskserver ist gerade ausgelastet. Ihr Import wird gleich gestartet, bitte warten...',
1367 1367
  'Import preview'              => 'Import-Vorschau',
......
1940 1940
  'Please contact your administrator or a service provider.' => 'Bitte kontaktieren Sie Ihren Administrator oder einen Dienstleister.',
1941 1941
  'Please contact your administrator.' => 'Bitte wenden Sie sich an Ihren Administrator.',
1942 1942
  'Please correct the settings and try again or deactivate that client.' => 'Bitte korrigieren Sie die Einstellungen und versuchen Sie es erneut, oder deaktivieren Sie diesen Mandanten.',
1943
  'Please create a CSV import profile called "MT940" for the import type bank transactions:' => 'Bitte erstellen Sie ein CSV Import Profil mit dem Namen "MT940" für den Importtyp Bankbewegungen',
1943 1944
  'Please define a taxkey for the following taxes and run the update again:' => 'Bitte definieren Sie einen Steuerschlüssel für die folgenden Steuern und starten Sie dann das Update erneut:',
1944 1945
  'Please do so in the administration area.' => 'Bitte erledigen Sie dies im Administrationsbereich.',
1945 1946
  'Please enter a profile name.' => 'Bitte geben Sie einen Profilnamen an.',
......
2580 2581
  'The GL transaction #1 has been deleted.' => 'Die Dialogbuchung #1 wurde gelöscht.',
2581 2582
  'The IBAN is missing.'        => 'Die IBAN fehlt.',
2582 2583
  'The LDAP server "#1:#2" is unreachable. Please check config/kivitendo.conf.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/kivitendo.conf.',
2584
  'The MT940 import needs an import profile called MT940' => 'Der MT940 Import benötigt ein Importprofil mit dem Namen "MT940"',
2583 2585
  'The SEPA export has been created.' => 'Der SEPA-Export wurde erstellt',
2584 2586
  'The SEPA strings have been saved.' => 'Die bei SEPA-Überweisungen verwendeten Begriffe wurden gespeichert.',
2585 2587
  'The WebDAV feature has been used.' => 'Das WebDAV-Feature wurde benutzt.',
menus/erp.ini
427 427
[Cash--Bank Import--MT940]
428 428
ACCESS=bank_transaction
429 429
module=controller.pl
430
action=CsvImport/new
431
profile.type=mt940
430
action=BankImport/upload_mt940
432 431

  
433 432
[Cash--Bank transactions MT940]
434 433
ACCESS=bank_transaction
templates/webpages/bankimport/form.html
1
[%- USE HTML %]
2
[%- USE LxERP %]
3
[%- USE L %]
4
[%- USE T8 %]
5

  
6
 <div class="listtop">[% FORM.title %]</div>
7

  
8
 [% IF profile %]
9
 <p>
10
 [% "Import a MT940 file:" | $T8 %]
11
 </p>
12

  
13
 <form method="post" action="controller.pl" enctype="multipart/form-data">
14
  [% L.hidden_tag('action', 'BankImport/import_mt940') %]
15

  
16
    [% L.input_tag('file', '', type => 'file', accept => '*') %]
17
    [% L.submit_tag('action_import_mt940', LxERP.t8('Import')) %]
18

  
19
 </form>
20
 [% ELSE %]
21
 <p>
22
 [% "Please create a CSV import profile called \"MT940\" for the import type bank transactions:" | $T8 %] <a href="[% SELF.url_for(controller => 'CsvImport', action => 'new', 'profile.type' => 'bank_transactions' ) %]">CsvImport</a>
23
 </p>
24
 [% END %]
templates/webpages/csv_import/_form_mt940.html
1
[% USE LxERP %]
2
[% USE L %]
3

  
4
<tr>
5
 <th align="right">[%- LxERP.t8("Existing bank transactions") %]:</th>
6
 <td colspan="10">
7
  [% opts = [ [ 'skip', LxERP.t8('Skip entry') ] , [ 'insert_new', LxERP.t8('Insert new') ] ] %]
8
  [% L.select_tag('settings.update_policy', opts, default = SELF.profile.get('update_policy'), style = 'width: 300px') %]
9
 </td>
10
</tr>
11

  
12

  
templates/webpages/csv_import/form.html
260 260
 [%- INCLUDE 'csv_import/_form_inventories.html' %]
261 261
[%- ELSIF SELF.type == 'orders' %]
262 262
 [%- INCLUDE 'csv_import/_form_orders.html' %]
263
[%- ELSIF SELF.type == 'mt940' %]
264
 [%- INCLUDE 'csv_import/_form_mt940.html' %]
265 263
[%- ELSIF SELF.type == 'bank_transactions' %]
266 264
 [%- INCLUDE 'csv_import/_form_banktransactions.html' %]
267 265
[%- END %]

Auch abrufbar als: Unified diff