} else {
$arap = "ar";
my $invoice = "a.invoice";
+ my $quonumber = "a.quonumber";
if ($form->{type} =~ /_(order|quotation)$/) {
$invnumber = "ordnumber";
$invoice = '0';
}
+ if ($form->{type} eq 'packing_list') {
+ $invnumber = "donumber";
+ $arap = "delivery_orders";
+ $invoice = '0';
+ $quonumber = '0';
+ }
+
$query =
- qq|SELECT a.id, a.$invnumber AS invnumber, a.ordnumber, a.quonumber, | .
+ qq|SELECT a.id, a.$invnumber AS invnumber, a.ordnumber, $quonumber, | .
qq| a.transdate, $invoice AS invoice, '$arap' AS module, vc.name, | .
qq| s.spoolfile | .
qq|FROM $arap a, ${vc} vc, status s | .
qq|WHERE s.trans_id = a.id | .
qq| AND s.spoolfile IS NOT NULL | .
- qq| AND s.formname = ? | .
+ ($form->{type} eq 'packing_list'
+ ? qq| AND s.formname IN (?, ?) |
+ : qq| AND s.formname = ? |) .
qq| AND a.${vc}_id = vc.id|;
@values = ($form->{type});
+
+ if ($form->{type} eq 'packing_list') {
+ @values = qw(sales_delivery_order purchase_delivery_order);
+ }
}
if ($form->{"${vc}_id"}) {
$query .= " AND vc.name ILIKE ?";
push(@values, $form->like($form->{ $vc }));
}
- foreach my $column (qw(invnumber ordnumber quonumber)) {
+ foreach my $column (qw(invnumber ordnumber quonumber donumber)) {
if ($form->{$column}) {
$query .= " AND a.$column ILIKE ?";
push(@values, $form->like($form->{$column}));
}
}
- if ($form->{type} =~ /(invoice|sales_order|sales_quotation|puchase_order|request_quotation)$/) {
+ if ($form->{type} =~ /(invoice|sales_order|sales_quotation|puchase_order|request_quotation|packing_list)$/) {
if ($form->{transdatefrom}) {
$query .= " AND a.transdate >= ?";
push(@values, $form->{transdatefrom});
my $sortorder = join ', ', $form->sort_columns(@a);
if (grep({ $_ eq $form->{sort} }
- qw(transdate invnumber ordnumber quonumber name))) {
+ qw(transdate invnumber ordnumber quonumber donumber name))) {
$sortorder = $form->{sort};
}
use SL::DO;
use SL::IC;
use SL::IS;
+use SL::Locale;
use SL::Mailer;
use SL::Menu;
use SL::MoreCommon qw(uri_encode uri_decode);
$formname ||= $self->{formname};
+ $self->{recipient_locale} ||= Locale->lang_to_locale($self->{language});
+ my $recipient_locale = Locale->new($self->{recipient_locale});
+
my %formname_translations = (
- bin_list => $main::locale->text('Bin List'),
- credit_note => $main::locale->text('Credit Note'),
- invoice => $main::locale->text('Invoice'),
- pick_list => $main::locale->text('Pick List'),
- proforma => $main::locale->text('Proforma Invoice'),
- purchase_order => $main::locale->text('Purchase Order'),
- request_quotation => $main::locale->text('RFQ'),
- sales_order => $main::locale->text('Confirmation'),
- sales_quotation => $main::locale->text('Quotation'),
- storno_invoice => $main::locale->text('Storno Invoice'),
- sales_delivery_order => $main::locale->text('Delivery Order'),
- purchase_delivery_order => $main::locale->text('Delivery Order'),
- dunning => $main::locale->text('Dunning'),
+ bin_list => $recipient_locale->text('Bin List'),
+ credit_note => $recipient_locale->text('Credit Note'),
+ invoice => $recipient_locale->text('Invoice'),
+ pick_list => $recipient_locale->text('Pick List'),
+ proforma => $recipient_locale->text('Proforma Invoice'),
+ purchase_order => $recipient_locale->text('Purchase Order'),
+ request_quotation => $recipient_locale->text('RFQ'),
+ sales_order => $recipient_locale->text('Confirmation'),
+ sales_quotation => $recipient_locale->text('Quotation'),
+ storno_invoice => $recipient_locale->text('Storno Invoice'),
+ sales_delivery_order => $recipient_locale->text('Delivery Order'),
+ purchase_delivery_order => $recipient_locale->text('Delivery Order'),
+ dunning => $recipient_locale->text('Dunning'),
);
$main::lxdebug->leave_sub();
- return $formname_translations{$formname}
+ return $formname_translations{$formname};
}
sub get_number_prefix_for_type {
$main::lxdebug->enter_sub();
my ($self) = @_;
+ $self->{recipient_locale} ||= Locale->lang_to_locale($self->{language});
+ my $recipient_locale = Locale->new($self->{recipient_locale});
+
my $attachment_filename = $main::locale->unquote_special_chars('HTML', $self->get_formname_translation());
my $prefix = $self->get_number_prefix_for_type();
if ($self->{preview} && (first { $self->{type} eq $_ } qw(invoice credit_note))) {
- $attachment_filename .= ' (' . $main::locale->text('Preview') . ')' . $self->get_extension_for_format();
+ $attachment_filename .= ' (' . $recipient_locale->text('Preview') . ')' . $self->get_extension_for_format();
} elsif ($attachment_filename && $self->{"${prefix}number"}) {
$attachment_filename .= "_" . $self->{"${prefix}number"} . $self->get_extension_for_format();
return $text;
}
+sub lang_to_locale {
+ my ($self, $requested_lang) = @_;
+
+ my $requested_locale;
+ $requested_locale = 'de' if $requested_lang =~ m/^_(de|deu|ger)/i;
+ $requested_locale = 'fr' if $requested_lang =~ m/^_(en|uk|us|gr)/i;
+ $requested_locale = 'en' if $requested_lang =~ m/^_fr/i;
+ $requested_locale ||= 'de';
+
+ return $requested_locale;
+}
+
sub findsub {
$main::lxdebug->enter_sub();
'sales_order' => 'sales_order_edit',
'sales_quotation' => 'sales_quotation_edit',
'purchase_order' => 'purchase_order_edit',
+ 'packing_list' => 'sales_delivery_order_edit|purchase_delivery_order_edit',
'request_quotation' => 'request_quotation_edit',
'check' => 'cash',
'receipt' => 'cash',
purchase_order => { title => $::locale->text('Purchase Orders'), ordnumber => 1, },
sales_quotation => { title => $::locale->text('Quotations'), quonumber => 1, },
request_quotation => { title => $::locale->text('RFQs'), quonumber => 1, },
+ packing_list => { title => $::locale->text('Delivery Orders'), donumber => 1, ordnumber => 1 },
check => { title => $::locale->text('Checks'), chknumber => 1, },
receipt => { title => $::locale->text('Receipts'), rctnumber => 1, },
);
invnumber => sub { $::locale->text('Invoice Number') . " : $::form->{invnumber}" },
ordnumber => sub { $::locale->text('Order Number') . " : $::form->{ordnumber}" },
quonumber => sub { $::locale->text('Quotation Number') . " : $::form->{quonumber}" },
+ donumber => sub { $::locale->text('Delivery Order Number') . " : $::form->{donumber}" },
transdatefrom => sub { $::locale->text('From') . " " . $::locale->date(\%::myconfig, $::form->{transdatefrom}, 1) },
transdateto => sub { $::locale->text('To') . " " . $::locale->date(\%::myconfig, $::form->{transdateto}, 1) },
);
my @options;
- for my $key ($::form->{vc}, qw(account invnumber ordnumber quonumber transdatefrom transdateto)) {
+ for my $key ($::form->{vc}, qw(account invnumber ordnumber quonumber donumber transdatefrom transdateto)) {
next unless $::form->{$key};
push @href_options, $key;
push @options, $option_texts{$key} ? $option_texts{$key}->() : '';
sub back_to_record {
_check_io_auth();
+
+ delete @{$::form}{qw(action action_add action_back_to_record back_sub description item notes partnumber sellprice taxaccount2 unit vc)};
+
$::auth->restore_form_from_session($::form->{previousform}, clobber => 1);
$::form->{rowcount}--;
$::form->{action} = 'display_form';
+++ /dev/null
-Table of Contents
------------------
-
-Inhalt der Anleitung
-1 Zusammenfassung
-2 Bisheriger Mechanismus und Motivation zur Änderung
-3 Änderungen
-4 Migration
-
-Zusammenfassung
----------------
-
-Dieses Dokument beschreibt die Änderungen, die 2010 am Templatesystem von
-Lx-Office vorgenommen wurden, sowie Möglichkeiten zur Migration aus alten
-Systemen.
-
-Die betroffenen Templates sind alle lokalisierten Templates im Verzeichnis
-templates/. Die Druckvoragen sind nicht betroffen.
-
-
-Bisheriger Mechanismus und Motivation zur Änderung
---------------------------------------------------
-
-SQL Ledger benutzt für Darstellung garkein Templatesytem. HTML wird im Perlcode
-zusammengebaut, und dabei über das Locale Modul lokalisiert. Gleichzeitig
-werden Druckvorlagen in einer lokalisierten Version mitgeliefert und
-vorgehalten, und werden beim anlegen eines Benutzers in sein lokales
-Templateverzeichnis kopiert. Mit einem mitgelieferten Editor konnten diese HTML
-Dateien dann editiert werden.
-
-Das Lx-Office Templatesystem ist zuerst in Anlehnung daran entstanden.
-Templates wurden in einer _master Version vorgehalten und mit den lokalisierten
-Strings aus dem Programm statisch übersetzt, und dann zur Laufzeit mit
-Variablen gefüllt. Das Template System war zuerst HTML::Template, wurde später
-aber durch Template Toolkit ersetzt, was flexiblere Syntax bietet und eine
-Größenordnung schneller ist.
-
-Das System hat diverse Probleme. Templates sind im Programm in einem Coding
-hinterlegt, das maßgeblich durch die einkompilierte Sprache bestimmt wird. Wenn
-die Sprachtexte Latin-1 sind, sind die übersetzten Templates auch Latin-1.
-Wenn die angeforderte Sprache aber UTF-8 ist, müssen die Templates zur Laufzeit
-umcodiert werden. Das kostet Zeit, und erschwert caching.
-
-Das nächste Problem sind Untertemplates. In ein kompiliertes Template ein
-anderes Template einzubinden ist möglich, hat aber diverse Probleme mit Coding
-und Lokalisierung, weil gewisse Kontextinformationen nicht weitergegeben
-werden. Die Modularisierung von Templates ist ein langfristiges Ziel, deshalb
-ist es gewünscht, dass das funktioniert.
-
-
-Änderungen
-----------
-
-Bisher wurden alle html Templates in allen Sprachversionen separat
-vorgehalten. Diese sind jetzt entfernt, es wird nur noch die _master.html
-weitergepflegt, die jetzt ohne diese Endung behandelt wird. So wird aus
-
- template/webpages/oe/search_master.html und
- template/webpages/oe/search_de.html
- template/webpages/oe/search_en.html
-
-jetzt nur noch
-
- templates/webpages/oe/search.html
-
-die alle Rollen übernimmt.
-
-Gleichzeitig wurde der an HTML angelehnte <translate></translate> Operator
-überall ersetzt durch das Template Modul T8, dass zur Templateverarbeitungszeit
-auf die Lokalisierung von Lx-Office zugreift. Der <translate> Operator war für
-statische Kompilierung gedacht, und ist dynamisch nicht ohne massive
-Geschwindigkeitseinbusse umzusetzen.
-
-Folgende Konstrukte sollten ab jetzt verwendet werden:
-
- <translate>Originaltext</translate>
- LxERP.format_text('<translate>Text with var #1</translate>', value)
-
-werden zu:
-
- [%- USE T8 %]
- [%- USE LxERP %]
-
- [% 'Originaltext' | $T8 %]
- [% LxERP.t8('Text with var #1', value) | html %]
-
-Beide Module sind in Perl geschrieben und sind Instanzen der Module
-
- SL::Template::Plugin::T8 und
- SL::Template::Plugin::LxERP
-
-Migration
---------
-
-Installationen, die Änderungen an den Templates vorgenommen haben, müssen
-diese Änderungen manuell in die neuen Templates einpflegen.
-
-Um die <translate> Operatoren umzuwandeln steht ein Hilfsscript bereit:
-
- scripts/migrate_template_to_t8.pl <file>
-
-Bitte vorher die Dokumentation von dem Script lesen.
-
-Es gibt einige Fälle die nicht abgedeckt sind davon, aber die sollte mit einem
-Diff danach zu finden sein. Vor allem kann es keine LxERP.format_text Aufrufe
-umwandeln, und es hat keinen Schutz gegen nicht escapte Anführungszeichen in
-den zu übersetzenden Strings.
-find t | grep "\.t$" | grep -v '^t/old' | HARNESS_OPTIONS=j:c xargs perl -MTest::Harness -e 'runtests(@ARGV)'
+find t | grep "\.t$" | grep -v '^t/old' | HARNESS_OPTIONS=j:c xargs perl -Imodules/fallback -MTest::Harness -e 'BEGIN { unshift @INC, "modules/override" } runtests(@ARGV)'
<td colspan=3>[% L.input_tag('quonumber', '', size=20) %]</td>
</tr>
[%- END %]
+[%- IF label.$type.donumber %]
+ <tr>
+ <th align=right nowrap>[% 'Delivery Order Number' | $T8 %]</th>
+ <td colspan=3>[% L.input_tag('donumber', '', size=20) %]</td>
+ </tr>
+[%- END %]
[%- IF label.$type.chknumber %]
<tr>
<th align=right nowrap>[% 'Reference' | $T8 %]</th>