Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 9275429a

Von Jan Büren vor etwa 6 Jahren hinzugefügt

  • ID 9275429ac6a1959c95c7f77e27bf6ae48f5ac4ea
  • Vorgänger 0bfb9ec3
  • Nachfolger 141b46df

Kreditorenbuchungen: Warnung bei vorhandener Rechnungsnummer für diesen Kreditor

Vorbedingung:
AP.js erweitert, sodass der Prüfcode entsprechende Inputs von IR oder AP prüft.

Erweiterungen:
Einkaufsrechnung (IR) mit derselben Prüfung wie Kreditorenbeleg beim Speichern versehen
Prüffunktion auf schon vorhandene Belegnummer zu diesem Kreditor bei
Einkaufs- oder Kreditorenbeleg implementiert.
Generischen Controller für JS-Prüfung (SalesPurchase.pm) mit einer
Funktion hinzugefügt, sowie entsprechend Changelog und locales.

Unterschiede anzeigen:

SL/Controller/SalesPurchase.pm
1
package SL::Controller::SalesPurchase;
2

  
3
use strict;
4
use parent qw(SL::Controller::Base);
5

  
6
use SL::DB::PurchaseInvoice;
7
use Carp;
8

  
9

  
10
sub action_check_duplicate_invnumber {
11
  my ($self) = @_;
12

  
13
  croak("no invnumber") unless $::form->{invnumber};
14
  croak("no vendor")    unless $::form->{vendor_id};
15

  
16
  my $exists_ap = SL::DB::Manager::PurchaseInvoice->find_by(
17
                   invnumber => $::form->{invnumber},
18
                   vendor_id => $::form->{vendor_id},
19
                 );
20

  
21
  $_[0]->render(\ !!$exists_ap, { type => 'text' });
22
}
23

  
24
1;
25

  
26
=pod
27

  
28
=encoding utf8
29

  
30
=head1 NAME
31

  
32
SL::Controller::SalesPurchase - Controller for JS driven actions
33

  
34
=head2 OVERVIEW
35

  
36
Generic Controller Class for validation function
37

  
38
=head1 FUNCTIONS
39

  
40
=over 2
41

  
42
=item C<action_check_duplicate_invnumber>
43

  
44
Needs C<form.invnumber> and C<form.vendor_id>
45

  
46
Returns true if a credit record with this invnumber for this vendor
47
already exists.
48

  
49
Example usage (js):
50

  
51
 $.ajax({
52
      url: 'controller.pl',
53
      data: { action: 'SalesPurchase/check_duplicate_invnumber',
54
              vendor_id    : $('#vendor_id').val(),
55
              invnumber    : $('#invnumber').val()
56
      },
57
      method: "GET",
58
      async: false,
59
      dataType: 'text',
60
      success: function(val) {
61
        exists_invnumber = val;
62
      }
63
    });
64

  
65
=back
bin/mozilla/ap.pl
1221 1221
        action => [
1222 1222
          t8('Post'),
1223 1223
          submit   => [ '#form', { action => "post" } ],
1224
          checks   => [ 'kivi.validate_form', 'kivi.AP.check_fields_before_posting' ],
1224
          checks   => [ 'kivi.validate_form', 'kivi.AP.check_fields_before_posting', 'kivi.AP.check_duplicate_invnumber' ],
1225 1225
          disabled => $is_closed                                  ? t8('The billing period has already been locked.')
1226 1226
                    : $is_storno                                  ? t8('A canceled invoice cannot be posted.')
1227 1227
                    : ($::form->{id} && $change_never)            ? t8('Changing invoices has been disabled in the configuration.')
bin/mozilla/ir.pl
245 245
          t8('Post'),
246 246
          submit   => [ '#form', { action => "post" } ],
247 247
          checks   => [ 'kivi.validate_form' ],
248
          checks   => [ 'kivi.validate_form', 'kivi.AP.check_fields_before_posting', 'kivi.AP.check_duplicate_invnumber' ],
249

  
248 250
          disabled => $form->{locked}                           ? t8('The billing period has already been locked.')
249 251
                    : $form->{storno}                           ? t8('A canceled invoice cannot be posted.')
250 252
                    : ($form->{id} && $change_never)            ? t8('Changing invoices has been disabled in the configuration.')
......
325 327
      ], # end of combobox "more"
326 328
    );
327 329
  }
328
  $::request->layout->add_javascripts('kivi.Validator.js');
330
  $::request->layout->add_javascripts('kivi.Validator.js', 'kivi.AP.js');
331

  
329 332
}
330 333

  
331 334
sub form_header {
......
392 395
    $form->{"select$item"} =~ s/option>\Q$form->{$item}\E/option selected>$form->{$item}/;
393 396
  }
394 397

  
398
  # TODO There is no credit_note for vendor invoices (remove template code)
395 399
  $TMPL_VAR{is_type_credit_note} = $form->{type}   eq "credit_note";
396 400
  $TMPL_VAR{is_format_html}      = $form->{format} eq 'html';
397 401
  $TMPL_VAR{dateformat}          = $myconfig{dateformat};
doc/changelog
29 29
Kleinere neue Features und Detailverbesserungen:
30 30
  - Verknüpfte Belege um die Verknüpfung von Beleg nach E-Mail-Journal erweitert.
31 31
  - Filter nach Abteilungen für Lieferplan
32
  - Eindeutigkeit bei Rechnungsnummern von Kreditoren. (Es erfolgt eine  Warnung bei Duplikaten (Überprüfung auf Lieferant mit Rechnungsnummer))
32 33

  
33 34
Bugfixes:
34 35
- Bugfix #336 Beim Drucken mehrerer Rechnung aus dem Bericht heraus mit aktiviertem DMS bricht mit Fehlermeldung ab
js/kivi.AP.js
4 4
  ns.check_fields_before_posting = function() {
5 5
    var errors = [];
6 6

  
7
    if ($('#transdate').val() === '')
7
    // if the element transdate exists, we have a AP form otherwise we have to check the invoice form
8
    var invoice_date = ($('#transdate').length === 0) ? $('#transdate').val() : $('#invdate').val();
9
    if (invoice_date === '')
8 10
      errors.push(kivi.t8('Invoice Date missing!'));
9 11

  
10 12
    if ($('#duedate').val() === '')
......
13 15
    if ($('#invnumber').val() === '')
14 16
      errors.push(kivi.t8('Invoice Number missing!'));
15 17

  
16
    if ($('#vendor').val() === '')
18
    if ($('#vendor_id').val() ===  '')
17 19
      errors.push(kivi.t8('Vendor missing!'));
18 20

  
19 21
    if (errors.length === 0)
......
23 25

  
24 26
    return false;
25 27
  };
28

  
29
  ns.check_duplicate_invnumber = function() {
30
    var exists_invnumber = false;
31

  
32
    $.ajax({
33
      url: 'controller.pl',
34
      data: { action: 'SalesPurchase/check_duplicate_invnumber',
35
              vendor_id    : $('#vendor_id').val(),
36
              invnumber    : $('#invnumber').val()
37
      },
38
      method: "GET",
39
      async: false,
40
      dataType: 'text',
41
      success: function(val) {
42
        exists_invnumber = val;
43
      }
44
    });
45

  
46
    if (exists_invnumber == 1) {
47
      return confirm(kivi.t8('This vendor has already a booking with this invoice number, do you really want to add the same invoice number again?'));
48
    }
49

  
50
    return true;
51
  };
52

  
26 53
});
js/locale/de.js
127 127
"There is one or more sections for which no part has been assigned yet; therefore creating the new record is not possible yet.":"Es gibt einen oder mehrere Abschnitte ohne Artikelzuweisung; daher kann der neue Beleg noch nicht erstellt werden.",
128 128
"This field must not be empty.":"Dieses Feld darf nicht leer sein.",
129 129
"This sales order has an active configuration for periodic invoices. If you save then all subsequently created invoices will contain those changes as well, but not those that have already been created. Do you want to continue?":"Dieser Auftrag besitzt eine aktive Konfiguration für wiederkehrende Rechnungen. Wenn Sie jetzt speichern, so werden alle zukünftig hieraus erzeugten Rechnungen die Änderungen enthalten, nicht aber die bereits erzeugten Rechnungen. Möchten Sie speichern?",
130
"This vendor has already a booking with this invoice number, do you really want to add the same invoice number again?":"Es gibt für diesen Lieferant schon einen Beleg mit dieser Rechnungsnummer. Möchten Sie wirklich eine weitere Buchung mit derselben Rechnungsnummer hinzufügen?",
130 131
"Time/cost estimate actions":"Aktionen für Kosten-/Zeitabschätzung",
131 132
"Title":"Titel",
132 133
"Toggle marker":"Markierung umschalten",
locale/de/all
3503 3503
  'This update will change the nature the onhand of goods is tracked.' => 'Dieses update ändert die Art und Weise wie Lagermengen gezält werden.',
3504 3504
  'This user is a member in the following groups' => 'Dieser Benutzer ist Mitglied in den folgenden Gruppen',
3505 3505
  'This user will have access to the following clients' => 'Dieser Benutzer wird Zugriff auf die folgenden Mandanten haben',
3506
  'This vendor has already a booking with this invoice number, do you really want to add the same invoice number again?' => 'Es gibt für diesen Lieferant schon einen Beleg mit dieser Rechnungsnummer. Möchten Sie wirklich eine weitere Buchung mit derselben Rechnungsnummer hinzufügen?',
3506 3507
  'This vendor has already been added.' => 'Der Lieferant wurde bereits hinzugefügt.',
3507 3508
  'This vendor number is already in use.' => 'Diese Lieferantennummer wird bereits verwendet.',
3508 3509
  'This will apply a 3% reduction to the master data price before entering it into the record item.' => 'Diese Zeile zieht vom Stammdatenpreis 3% ab, und schlägt den resultierenden Preis vor.',
templates/webpages/ir/form_header.html
152 152
[%- ELSE %]
153 153
        <tr>
154 154
          <th align="right" nowrap>[% 'Invoice Number' | $T8 %]</th>
155
          <td colspan="3"><input size='11' name="invnumber" value="[% HTML.escape(invnumber) %]"></td>
155
          <td colspan="3">[% L.input_tag("invnumber", invnumber, size="11") %]</td>
156 156
        </tr>
157 157
        <tr>
158 158
          <th align="right">[% 'Invoice Date' | $T8 %]</th>

Auch abrufbar als: Unified diff