Revision 9275429a
Von Jan Büren vor mehr als 6 Jahren hinzugefügt
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
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.