Artikel-Klassifizierung: Neue Option "Preis separat ausweisen"
authorMartin Helmling mh@waldpark.octosoft.eu <martin.helmling@octosoft.eu>
Mon, 26 Oct 2015 16:24:18 +0000 (17:24 +0100)
committerMartin Helmling martin.helmling@octosoft.eu <martin.helmling@octosoft.eu>
Thu, 24 Nov 2016 08:08:37 +0000 (09:08 +0100)
- neuer boolcher Wert in der Tabelle parts_classification: "report_separate"
- editierbar unter Artikelklassifikation
- In Aufträgen und Rechnungen werden die Zwischensummen LaTeX zur Verfügung gestellt.
-  <%separate_XXX_subtotal%>  wobei XXX die Abkürzung der Klassifikation ist.
-  <%non_separate_subtotal%> der Rest der Positionen, z.B. reiner Warenwert.

Hintergrund:
   Preise von Artikeln wie "Verpackung" oder "Transport" müssen
   oftmals separat ausgewiesen werden, genau so wie der reine Warenwert.

SL/DB/Manager/PartsClassification.pm
SL/DB/MetaSetup/PartsClassification.pm
SL/IC.pm
SL/IS.pm
SL/OE.pm
SL/Presenter/Part.pm
doc/changelog
locale/de/all
sql/Pg-upgrade2/partsclassification_report_separate.sql [new file with mode: 0644]
templates/webpages/parts_classification/form.html
templates/webpages/parts_classification/list.html

index 23558dc..de11aa8 100644 (file)
@@ -19,4 +19,10 @@ sub get_abbreviation {
   return $obj->abbreviation?$obj->abbreviation:undef;
 }
 
+sub get_separate_abbreviation {
+  my ($class,$id) = @_;
+  my $obj = $class->get_first(query => [ id => $id ]);
+  return $obj->report_separate?$obj->abbreviation:'';
+}
+
 1;
index 18e1dff..108e291 100644 (file)
@@ -12,6 +12,7 @@ __PACKAGE__->meta->columns(
   abbreviation      => { type => 'text' },
   description       => { type => 'text' },
   id                => { type => 'serial', not_null => 1 },
+  report_separate   => { type => 'boolean', default => 'false' },
   used_for_purchase => { type => 'boolean', default => 'true' },
   used_for_sale     => { type => 'boolean', default => 'true' },
 );
index 2163bf8..ce5e31e 100644 (file)
--- a/SL/IC.pm
+++ b/SL/IC.pm
@@ -1757,6 +1757,7 @@ sub prepare_parts_for_printing {
     my $type_abbr = $::request->presenter->type_abbreviation($prt->part_type);
     push @{ $template_arrays{part_type} }, $type_abbr;
     push @{ $template_arrays{type_and_classific}},  $type_abbr.$::request->presenter->classification_abbreviation($prt->classification_id);
+    push @{ $template_arrays{separate}  },  $::request->presenter->separate_abbreviation($prt->classification_id);
   }
 
   $main::lxdebug->leave_sub();
index b55cd7f..8186986 100644 (file)
--- a/SL/IS.pm
+++ b/SL/IS.pm
@@ -149,6 +149,7 @@ sub invoice_details {
   # so that they can be sorted in later
   my %prepared_template_arrays = IC->prepare_parts_for_printing(myconfig => $myconfig, form => $form);
   my @prepared_arrays          = keys %prepared_template_arrays;
+  my @separate_totals          = qw(non_separate_subtotal);
 
   my $ic_cvar_configs = CVar->get_configs(module => 'IC');
   my $project_cvar_configs = CVar->get_configs(module => 'Projects');
@@ -332,6 +333,17 @@ sub invoice_details {
       push @{ $form->{TEMPLATE_ARRAYS}->{discount_nofmt} }, ($discount != 0) ? $discount * -1 : '';
       push @{ $form->{TEMPLATE_ARRAYS}->{p_discount} },     $form->{"discount_$i"};
 
+      if ( $prepared_template_arrays{separate}[$i - 1]  ) {
+        my $pabbr = $prepared_template_arrays{separate}[$i - 1];
+        if ( ! $form->{"separate_${pabbr}_subtotal"} ) {
+            push @separate_totals , "separate_${pabbr}_subtotal";
+            $form->{"separate_${pabbr}_subtotal"} = 0;
+        }
+        $form->{"separate_${pabbr}_subtotal"} += $linetotal;
+      } else {
+        $form->{non_separate_subtotal} += $linetotal;
+      }
+
       $form->{total}            += $linetotal;
       $form->{nodiscount_total} += $nodiscount_linetotal;
       $form->{discount_total}   += $discount;
@@ -539,6 +551,7 @@ sub invoice_details {
   $form->{delivery_term}->description_long($form->{delivery_term}->translated_attribute('description_long', $form->{language_id})) if $form->{delivery_term} && $form->{language_id};
 
   $form->{username} = $myconfig->{name};
+  $form->{$_} = $form->format_amount($myconfig, $form->{$_}, 2) for @separate_totals;
 
   $main::lxdebug->leave_sub();
 }
index 24e88f0..b4b7d7d 100644 (file)
--- a/SL/OE.pm
+++ b/SL/OE.pm
@@ -1331,6 +1331,7 @@ sub order_details {
   # so that they can be sorted in later
   my %prepared_template_arrays = IC->prepare_parts_for_printing(myconfig => $myconfig, form => $form);
   my @prepared_arrays          = keys %prepared_template_arrays;
+  my @separate_totals          = qw(non_separate_subtotal);
 
   $form->{TEMPLATE_ARRAYS} = { };
 
@@ -1437,6 +1438,17 @@ sub order_details {
       push @{ $form->{TEMPLATE_ARRAYS}->{discount_nofmt} }, ($discount != 0) ? $discount * -1 : '';
       push @{ $form->{TEMPLATE_ARRAYS}->{p_discount} },     $form->{"discount_$i"};
 
+      if ( $prepared_template_arrays{separate}[$i - 1]  ) {
+        my $pabbr = $prepared_template_arrays{separate}[$i - 1];
+        if ( ! $form->{"separate_${pabbr}_subtotal"} ) {
+            push @separate_totals , "separate_${pabbr}_subtotal";
+            $form->{"separate_${pabbr}_subtotal"} = 0;
+        }
+        $form->{"separate_${pabbr}_subtotal"} += $linetotal;
+      } else {
+        $form->{non_separate_subtotal} += $linetotal;
+      }
+
       $form->{ordtotal}         += $linetotal;
       $form->{nodiscount_total} += $nodiscount_linetotal;
       $form->{discount_total}   += $discount;
@@ -1610,6 +1622,7 @@ sub order_details {
   $form->{delivery_term}->description_long($form->{delivery_term}->translated_attribute('description_long', $form->{language_id})) if $form->{delivery_term} && $form->{language_id};
 
   $form->{order} = SL::DB::Manager::Order->find_by(id => $form->{id}) if $form->{id};
+  $form->{$_} = $form->format_amount($myconfig, $form->{$_}, 2) for @separate_totals;
 
   $main::lxdebug->leave_sub();
 }
index c3bbea2..08c425b 100644 (file)
@@ -6,7 +6,7 @@ use SL::DB::Part;
 use SL::DB::Manager::PartsClassification;
 
 use Exporter qw(import);
-our @EXPORT = qw(part_picker part select_classification classification_abbreviation type_abbreviation type_and_classification);
+our @EXPORT = qw(part_picker part select_classification classification_abbreviation type_abbreviation separate_abbreviation);
 
 use Carp;
 
@@ -80,6 +80,11 @@ sub classification_abbreviation {
   return $::locale->text(SL::DB::Manager::PartsClassification->get_abbreviation($id));
 }
 
+sub separate_abbreviation {
+  my ($self, $id) = @_;
+  return $::locale->text(SL::DB::Manager::PartsClassification->get_separate_abbreviation($id));
+}
+
 sub select_classification {
   my ($self, $name, %attributes) = @_;
   $attributes{value_key} = 'id';
index 12327db..fc1d9d0 100644 (file)
@@ -37,6 +37,18 @@ große Features:
     nun wird alternativ zur 'type'-Spalte die 'pclass'-Spalte mit zwei Buchstaben geparsed und entsprechend
     classification_id,assembly sowie inventory_accno_id gesetzt (oder type_id falls neue Implementierung eingebaut).
 
+- Option "Preis separat ausweisen" als neue Artikel-Klassifizierung
+    
+    - neuer boolcher Wert in parts_classification "report_separate"
+    - editierbar unter Artikelklassifikation
+    - In Aufträgen und Rechnungen werden die Zwischensummen LaTeX zur Verfügung gestellt.
+    -  <%partsclass_XXX_subtotal%>  wobei XXX die Abkürzung der Klassifikation ist.
+    -  <%merchandise_value_subtotal%> der Rest der Positionen.
+    
+    Hintergrund:
+       Preise von Artikeln wie "Verpackung" oder "Transport" müssen
+       oftmals separat ausgewiesen werden, genau so wie der reine Warenwert.
+
 kleinere neue Features und Detailverbesserungen:
 
   - SEPA Überweisungen zusätzlich Kunden- oder Lieferantennummer im Verwendungszweck vorbelegen
index 3f837bb..cd143fd 100755 (executable)
@@ -2356,6 +2356,7 @@ $self->{texts} = {
   'Report and misc. Preferences' => 'Sonstige Einstellungen',
   'Report date'                 => 'Berichtsdatum',
   'Report for'                  => 'Bericht für',
+  'Report seperately'           => 'Preis separat ausweisen',
   'Reports'                     => 'Berichte',
   'Representative'              => 'Vertreter',
   'Representative for Customer' => 'Vertreter für Kunden',
diff --git a/sql/Pg-upgrade2/partsclassification_report_separate.sql b/sql/Pg-upgrade2/partsclassification_report_separate.sql
new file mode 100644 (file)
index 0000000..3e98b51
--- /dev/null
@@ -0,0 +1,4 @@
+-- @tag: partsclassification_report_seperate
+-- @description: "Artikelklassifikation mit weiterer boolschen Variable für seperat ausweisen"
+-- @depends: parts_classifications
+ALTER TABLE parts_classifications ADD COLUMN report_separate BOOLEAN DEFAULT 'f';
index 26760b4..f6181ee 100755 (executable)
     <td>[% LxERP.t8('Used for Sale') %]</td>
     <td>[% L.checkbox_tag("parts_classification.used_for_sale", checked=(SELF.parts_classification.used_for_sale ? 1:'')) %]</td>
    </tr>
+   <tr>
+    <td>[% LxERP.t8('Report seperately') %]</td>
+    <td>[% L.checkbox_tag("parts_classification.report_separate", checked=(SELF.parts_classification.report_separate ? 1:'')) %]</td>
+   </tr>
   </table>
 
   <p>
index 9226dc2..e18b43b 100644 (file)
@@ -18,6 +18,7 @@
      <th>[%- LxERP.t8('TypeAbbreviation') %]</th>
      <th>[%- LxERP.t8('Used for Purchase') %]</th>
      <th>[%- LxERP.t8('Used for Sale') %]</th>
+     <th>[%- LxERP.t8('Report seperately') %]</th>
     </tr>
     </thead>
 
@@ -33,6 +34,7 @@
      <td>[%- HTML.escape(LxERP.t8(parts_classification.abbreviation)) %]</td>
      <td>[% IF parts_classification.used_for_purchase %][% LxERP.t8('Yes') %][% ELSE %][%  LxERP.t8('No') %][% END %]</td>
      <td>[% IF parts_classification.used_for_sale     %][% LxERP.t8('Yes') %][% ELSE %][%  LxERP.t8('No') %][% END %]</td>
+     <td>[% IF parts_classification.report_separate   %][% LxERP.t8('Yes') %][% ELSE %][%  LxERP.t8('No') %][% END %]</td>
     </tr>
     [%- END %]
     </tbody>