Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 8b4dd266

Von Moritz Bunkus vor mehr als 2 Jahren hinzugefügt

  • ID 8b4dd266547b401f2ca79790a41e557a169094b8
  • Vorgänger 55962438
  • Nachfolger 420d3963

proof of concept: Formular-Gültigkeit beim Buchen von Verkaufsrechnungen

Ziel: verhindern, dass eine noch nicht gebuchte Rechnung durch
Verwendung des »Zurück«-Buttons im Browser mehrfach gebucht werden
kann.

Implementation: Beim Neuanlegen einer Rechnung wird ein einmaliges
Gültigkeitstoken mit einem Scope (»Verkaufsrechnung buchen«)
erzeugt. Dieses hat eine Laufzeit von 24h. Es wird als Hidden-Variable
im Formular mitgeschleift, sofern noch keine Datenbank-ID existiert,
die Rechnung also noch nicht gebucht wurde.

Wird die Rechnung gebucht, so wird zuerst überprüft, ob das vom
Browser mitgeschickte Token noch gültig ist:

1. ob es das Token mit demselben Scope in der Datenbank noch gibt
2. ob das Ablaufdatum des Tokens noch nicht erreicht ist

Falls ja, wird die Rechnung gebucht und das Token aus der Datenbank
und dem Formular entfernt. Es ist somit entwertet und kann nicht
erneut zum Buchen verwendet werden, da es bei der Prüfung oben Punkt 1
verletzt.

Falls nein, wird hingegen eine Fehlermeldung angezeigt, dass das
Formular nicht mehr gültig ist. Das kann man auch durch Verwenden von
Funktionen wie »Erneuern« nicht umgehen: das Fomular mit der
ungebuchten Rechnung ist jetzt »tot«.

Unterschiede anzeigen:

bin/mozilla/is.pl
52 52
use SL::DB::Department;
53 53
use SL::DB::Invoice;
54 54
use SL::DB::PaymentTerm;
55
use SL::DB::ValidityToken;
55 56

  
56 57
require "bin/mozilla/common.pl";
57 58
require "bin/mozilla/io.pl";
......
105 106

  
106 107
  }
107 108

  
109
  if (!$form->{form_validity_token}) {
110
    $form->{form_validity_token} = SL::DB::ValidityToken->create(scope => SL::DB::ValidityToken::SCOPE_SALES_INVOICE_POST())->token;
111
  }
108 112

  
109 113
  $form->{callback} = "$form->{script}?action=add&type=$form->{type}" unless $form->{callback};
110 114

  
......
1008 1012
  $main::auth->assert('invoice_edit');
1009 1013
  $form->mtime_ischanged('ar');
1010 1014

  
1015
  my $validity_token;
1016
  if (!$form->{id}) {
1017
    $validity_token = SL::DB::Manager::ValidityToken->fetch_valid_token(
1018
      scope => SL::DB::ValidityToken::SCOPE_SALES_INVOICE_POST(),
1019
      token => $form->{form_validity_token},
1020
    );
1021

  
1022
    $form->error($::locale->text('The form is not valid anymore.')) if !$validity_token;
1023
  }
1024

  
1011 1025
  $form->{defaultcurrency} = $form->get_default_currency(\%myconfig);
1012 1026
  $form->isblank("invdate",  $locale->text('Invoice Date missing!'));
1013 1027
  $form->isblank("customer_id", $locale->text('Customer missing!'));
......
1136 1150
    }
1137 1151
  }
1138 1152

  
1153
  $validity_token->delete if $validity_token;
1154
  delete $form->{form_validity_token};
1155

  
1139 1156
  if(!exists $form->{addition}) {
1140 1157
    $form->{snumbers}  =  'invnumber' .'_'. $form->{invnumber}; # ($form->{type} eq 'credit_note' ? 'cnnumber' : 'invnumber') .'_'. $form->{invnumber};
1141 1158
    $form->{what_done} = 'invoice';

Auch abrufbar als: Unified diff