use Carp;
use DateTime;
use Exporter qw(import);
-use List::Util qw(min);
+use List::Util qw(min sum);
use List::UtilsBy qw(sort_by);
use List::MoreUtils qw(any);
use SL::MoreCommon qw(listify);
use SL::DBUtils qw(selectall_hashref_query selectrow_query);
use SL::DB::TransferType;
+use SL::Helper::Number qw(_round_qty _qty);
use SL::X;
our @EXPORT_OK = qw(get_stock get_onhand allocate allocate_for_assembly produce_assembly check_constraints);
}
if ($rest_qty > 0) {
die SL::X::Inventory::Allocation->new(
- error => t8('not enough to allocate'),
+ error => 'not enough to allocate',
msg => t8("can not allocate #1 units of #2, missing #3 units", $qty, $part->displayable_name, $rest_qty),
);
} else {
warehouse_id => t8('Warehouses'),
chargenumber => t8('Chargenumbers'),
);
- my @allocs = grep { !$whitelist{$_->$accessor} } @$allocations;
+ my @allocs = grep { $whitelist{$_->$accessor} } @$allocations;
+ my $needed = sum map { $_->qty } grep { !$whitelist{$_->$accessor} } @$allocations;
+ my $err = t8("Cannot allocate parts.");
+ $err .= ' '.t8('part \'#\'1 in bin \'#2\' only with qty #3 (need additional #4) and chargenumber \'#5\'.',
+ SL::DB::Part->load_cached($_->parts_id)->description,
+ SL::DB::Bin->load_cached($_->bin_id)->full_description,
+ _qty($_->qty), _qty($needed), $_->chargenumber ? $_->chargenumber : '--') for @allocs;
die SL::X::Inventory::Allocation->new(
- accessor => $accessor,
- allocations => \@allocs,
- error => 'allocation constraints failure',
- msg => t8("Allocations didn't pass constraints for #1",$error_constraints{$_}),
+ error => 'allocation constraints failure',
+ msg => $err,
);
}
}
'All units have either no or exactly one base unit of which they are multiples.' => 'Einheiten haben entweder keine oder genau eine Basiseinheit, von der sie ein Vielfaches sind.',
'All users' => 'Alle BenutzerInnen',
'Allocations didn\'t pass constraints' => 'Keine Verfügbarkeit wegen Lagereinschränkung',
- 'Allocations didn\'t pass constraints for #1' => 'Keine Verfügbarkeit wegen Lagereinschränkung auf \'#1\'',
'Allow access' => 'Zugriff erlauben',
'Allow conversion from sales orders to sales invoices' => 'Umwandlung von Verkaufsaufträgen in Verkaufsrechnungen zulassen',
'Allow conversion from sales quotations to sales invoices' => 'Umwandlung von Verkaufsangeboten in Verkaufsrechnungen zulassen',
'Cancel Accounts Payables Transaction' => 'Kreditorenbuchung stornieren',
'Cancel Accounts Receivables Transaction' => 'Debitorenbuchung stornieren',
'Cancelling is disallowed. Either undo or balance the current payments until the open amount matches the invoice amount' => 'Storno verboten, da Zahlungen zum Beleg vorhanden sind. Entweder die Zahlungen löschen oder mit umgekehrten Vorzeichen ausbuchen, sodass der offene Betrag dem Rechnungsbetrag entspricht.',
+ 'Cannot allocate parts.' => 'Es sind nicht genügend Artikel vorhanden',
'Cannot change transaction in a closed period!' => 'In einem bereits abgeschlossenen Zeitraum kann keine Buchung verändert werden!',
'Cannot check correct WebDAV folder' => 'Kann nicht den richtigen WebDAV Pfad überprüfen',
'Cannot delete account!' => 'Konto kann nicht gelöscht werden!',
'Charge' => 'Berechnen',
'Charge Number' => 'Chargennummer',
'Charge number' => 'Chargennummer',
- 'Chargenumbers' => '',
+ 'Chargenumbers' => 'Chargennummern',
'Charset' => 'Zeichensatz',
'Chart' => 'Buchungskonto',
'Chart Type' => 'Kontentyp',
'no tax_id in acc_trans' => 'Keine tax_id in acc_trans',
'not configured' => 'nicht konfiguriert',
'not delivered' => 'nicht geliefert',
- 'not enough to allocate' => 'Keine Verfügbarkeit',
'not executed' => 'nicht ausgeführt',
'not running' => 'läuft nicht',
'not set' => 'nicht gesetzt',
'our vendor number at customer' => 'Unsere Lieferanten-Nr. beim Kunden',
'parsing csv' => 'Parse CSV Daten',
'part' => 'Ware',
+ 'part \'#\'1 in bin \'#2\' only with qty #3 (need additional #4) and chargenumber \'#5\'.' => 'Artikel \'#1\' im \'#2\' nur mit der Menge #3 (noch #4 benötig) und Chargennummer \'#5\'.',
'part_list' => 'Warenliste',
'percental' => 'prozentual',
'periodic' => 'Aufwandsmethode',