From 4ecb8321edcee5e012028a23db3c8d0f760c2178 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jan=20B=C3=BCren?= Date: Fri, 31 Oct 2014 15:46:20 +0100 Subject: [PATCH] Erweiterung Lieferplan Belege wirklich ausgelagert und Warenverkaufswert (default: aus) MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Erweiterung Mandantenkonfiguration im Bereich Lager zum Einschalten von a) Warenverkaufswert Falls aktiviert erscheint eine neue Spalte im Lieferplan, die den Wert der ausgeliefert Waren angibt. Berechnungen mit sellprice sind in der kivi immer hakelig. Hier die getesten Fälle: - Rabatt i.O. - Preisfaktor i.O. - Steuer im Preis inbegriffen (eine Warnung wird generiert). b) Lieferplan berücksichtigt die tatsächlich ausgelagerten Lieferscheine Falls der Firmenprozess zwei Rollen vorgibt (Lieferschein-Ersteller und Lieferschein-Auslagerer), konnte dies mit dem vorhanden Bericht nicht klar eingesehen werden. Entsprechend werden bei dieser Funktion nur die tatsächlich ausgelagerten Lieferscheine berücksichtigt. Achtung: Teilausgelagerte Belege werden nicht berücksichtigt (keine verknüpfung mit tabelle inventory) --- SL/Controller/DeliveryPlan.pm | 15 +++++++++++++-- SL/DB/MetaSetup/Default.pm | 2 ++ SL/DB/OrderItem.pm | 13 +++++++++++++ locale/de/all | 6 ++++++ .../defaults_add_delivery_plan_config.sql | 6 ++++++ .../webpages/client_config/_warehouse.html | 19 +++++++++++++++++++ 6 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 sql/Pg-upgrade2/defaults_add_delivery_plan_config.sql diff --git a/SL/Controller/DeliveryPlan.pm b/SL/Controller/DeliveryPlan.pm index 01c3d8bad..b740e26c4 100644 --- a/SL/Controller/DeliveryPlan.pm +++ b/SL/Controller/DeliveryPlan.pm @@ -26,6 +26,7 @@ my %sort_columns = ( not_shipped_qty => t8('not shipped'), ordnumber => t8('Order'), customer => t8('Customer'), + value_of_goods => t8('Value of goods'), ); sub action_list { @@ -47,7 +48,7 @@ sub prepare_report { my $report = SL::ReportGenerator->new(\%::myconfig, $::form); $self->{report} = $report; - my @columns = qw(reqdate customer ordnumber partnumber description qty shipped_qty not_shipped_qty delivered_qty); + my @columns = qw(reqdate customer ordnumber partnumber description qty shipped_qty not_shipped_qty delivered_qty value_of_goods); my @sortable = qw(reqdate customer ordnumber partnumber description); my %column_defs = ( @@ -66,6 +67,10 @@ sub prepare_report { obj_link => sub { $self->link_to($_[0]->order->customer) } }, ); + # add value of goods in report + if ($main::auth->assert('sales_order_edit') && $::instance_conf->get_delivery_plan_show_value_of_goods) { + $column_defs{value_of_goods} = { sub => sub { $::form->format_amount(\%::myconfig, $_[0]->value_of_goods, 2) . ' ' . $_[0]->taxincluded } }; + } $column_defs{$_}->{text} = $sort_columns{$_} for keys %column_defs; $report->set_options( @@ -127,6 +132,9 @@ sub make_filter_summary { sub delivery_plan_query { my $employee_id = SL::DB::Manager::Employee->current->id; my $oe_owner = $_[0]->all_edit_right ? '' : " oe.eployee_id = $employee_id AND"; + # check delivered state for delivery_orders (transferred out) if enabled + my $filter_delivered = $::instance_conf->get_delivery_plan_calculate_transferred_do ? + "AND (SELECT delivered from delivery_orders where id = doi.delivery_order_id)" : ''; [ 'order.customer_id' => { gt => 0 }, 'order.closed' => 0, @@ -155,6 +163,7 @@ sub delivery_plan_query { rl.to_table = 'delivery_orders' AND rl.to_id = doi.delivery_order_id AND oi.parts_id = doi.parts_id + $filter_delivered ) tuples GROUP BY parts_id, trans_id, qty ) partials LEFT JOIN orderitems oi ON partials.parts_id = oi.parts_id AND partials.trans_id = oi.trans_id @@ -162,7 +171,7 @@ sub delivery_plan_query { UNION ALL - -- 4. since the join over record_links fails for sales_orders wihtout any delivery order + -- 4. since the join over record_links fails for sales_orders without any delivery order -- retrieve those without record_links at all SELECT oi.id FROM orderitems oi, oe WHERE @@ -207,6 +216,8 @@ sub delivery_plan_query { (oe.quotation = 'f' OR oe.quotation IS NULL) AND NOT oe.closed ) rl LEFT JOIN delivery_order_items doi ON (rl.to_id = doi.delivery_order_id) + WHERE 1 = 1 + $filter_delivered GROUP BY rl.from_id, doi.parts_id ) agg ON (agg.oid = oi.trans_id AND agg.parts_id = oi.parts_id) LEFT JOIN oe ON oe.id = oi.trans_id diff --git a/SL/DB/MetaSetup/Default.pm b/SL/DB/MetaSetup/Default.pm index d615345bd..a5c1d330c 100644 --- a/SL/DB/MetaSetup/Default.pm +++ b/SL/DB/MetaSetup/Default.pm @@ -40,6 +40,8 @@ __PACKAGE__->meta->columns( datev_check_on_gl_transaction => { type => 'boolean', default => 'true' }, datev_check_on_purchase_invoice => { type => 'boolean', default => 'true' }, datev_check_on_sales_invoice => { type => 'boolean', default => 'true' }, + delivery_plan_calculate_transferred_do => { type => 'boolean', default => 'false', not_null => 1 }, + delivery_plan_show_value_of_goods => { type => 'boolean', default => 'false', not_null => 1 }, dunning_ar => { type => 'integer' }, dunning_ar_amount_fee => { type => 'integer' }, dunning_ar_amount_interest => { type => 'integer' }, diff --git a/SL/DB/OrderItem.pm b/SL/DB/OrderItem.pm index 75d5951d6..8e15d31b9 100644 --- a/SL/DB/OrderItem.pm +++ b/SL/DB/OrderItem.pm @@ -50,4 +50,17 @@ sub delivered_qty { return sum(map { AM->convert_unit($_->unit => $self->unit) * $_->qty } @doi_delivered); } +sub value_of_goods { + my ($self) = @_; + + my $price_factor = $self->price_factor ? $self->price_factor : 1; + + return ($self->qty * $self->sellprice * (1 - $self->discount ) / $price_factor); +} + +sub taxincluded { + my ($self) = @_; + + return SL::DB::Manager::Order->find_by(id => $self->trans_id)->taxincluded ? $::locale->text('WARN: Tax included value!') : ''; +} 1; diff --git a/locale/de/all b/locale/de/all index 8059c28ea..ec5b7138d 100755 --- a/locale/de/all +++ b/locale/de/all @@ -414,6 +414,7 @@ $self->{texts} = { 'CSV import: shipping addresses' => 'CSV-Import: Lieferadressen', 'CTI settings' => 'CTI-Einstellungen', 'Calculate' => 'Berechnen', + 'Calculate the value of goods for delivery plan (WARNING: Experimental (not taxincluded safe!)' => 'Warenverkaufswert anzeigen (Brutto / Netto), so wie im Auftrags-Beleg gespeichert. Benötigt das Recht: Verkaufs-Aufträge bearbeiten.', 'Calling #1 now' => 'Wähle jetzt #1', 'Can not create that quantity with current stock' => 'Diese Anzahl kann mit dem gegenwärtigen Lagerbestand nicht hergestellt werden.', 'Cancel' => 'Abbrechen', @@ -787,6 +788,7 @@ $self->{texts} = { 'Delivery Order(s) for full qty created' => 'Lieferschein(e) mit kompletter Menge erstellt', 'Delivery Orders' => 'Lieferscheine', 'Delivery Plan' => 'Lieferplan', + 'Delivery Plan check for transferred delivery orders' => 'Lieferplan berücksichtig den Status des Lieferscheins (ausgelagert / nicht ausgelagert)', 'Delivery Plan for currently outstanding sales orders' => 'Lieferplan für offene Verkaufsaufträge', 'Delivery Terms' => 'Lieferbedingungen', 'Delivery terms' => 'Lieferbedingungen', @@ -2170,6 +2172,7 @@ $self->{texts} = { 'Show Salesman' => 'Verkäufer anzeigen', 'Show TODO list' => 'Aufgabenliste anzeigen', 'Show Transfer via default' => 'Ein- / Auslagern über Standardlagerplatz anzeigen (zusätzlicher Knopf in Beleg Lieferschein)', + 'Show Value of Goods for Delivery Plan' => 'Warenverkaufswert im Lieferplan anzeigen.', 'Show administration link' => 'Link zur Administration anzeigen', 'Show all parts' => 'Alle Artikel anzeigen', 'Show by default' => 'Standardmäßig anzeigen', @@ -2420,6 +2423,7 @@ $self->{texts} = { 'The dataset #1 has been created.' => 'Die Datenbank #1 wurde angelegt.', 'The dataset #1 has been deleted.' => 'Die Datenbank #1 wurde gelöscht.', 'The deductible amount' => 'Der abziehbare Skontobetrag', + 'The default delivery plan only checks if all delivery orders have been created not if the goods are transferred. This feature will check if all the goods are transferred. Caveat: Only the state of the delivery orders are checked not partial transferred delivery orders (in technical terms: the table inventory is not checked' => 'Standardmässig wird beim Lieferplan überprüft, ob es eine vollständige Liefermenge über alle Lieferscheine gibt. Dies ist dann die Statusbedingung für geliefert oder nicht geliefert. Mit dieser Erweiterung wird geprüft ob die Lieferbelege auch wirklich ausgelagert sind oder nicht. Teilausgelagerte Lieferscheine werden allerdings nicht berücksichtigt (Technischer Hintergrund: Keine Überprüfung der Lagertabelle inventory).', 'The default value depends on the variable type:' => 'Die Bedeutung des Standardwertes hängt vom Variablentypen ab:', 'The delivery order has not been marked as delivered. The warehouse contents have not changed.' => 'Der Lieferschein wurde nicht als geliefert markiert. Der Lagerinhalt wurde nicht verändert.', 'The delivery term has been created.' => 'Die Lieferbedingungen wurden angelegt.', @@ -2793,6 +2797,7 @@ $self->{texts} = { 'Valid until' => 'gültig bis', 'Valid/Obsolete' => 'Gültig/ungültig', 'Value' => 'Wert', + 'Value of goods' => 'Warenverkaufswert', 'Variable' => 'Variable', 'Variable Description' => 'Datenfeldbezeichnung', 'Variable Name' => 'Datenfeldname (intern)', @@ -2825,6 +2830,7 @@ $self->{texts} = { 'View warehouse content' => 'Lagerbestand ansehen', 'View/edit all employees sales documents' => 'Bearbeiten/ansehen der Verkaufsdokumente aller Mitarbeiter', 'Von Konto: ' => 'von Konto: ', + 'WARN: Tax included value!' => 'ACHTUNG: Steuer im Preis inbegriffen!', 'WHJournal' => 'Lagerbuchungen', 'Warehouse' => 'Lager', 'Warehouse From' => 'Quelllager', diff --git a/sql/Pg-upgrade2/defaults_add_delivery_plan_config.sql b/sql/Pg-upgrade2/defaults_add_delivery_plan_config.sql new file mode 100644 index 000000000..efdb04f01 --- /dev/null +++ b/sql/Pg-upgrade2/defaults_add_delivery_plan_config.sql @@ -0,0 +1,6 @@ +-- @tag: defaults_add_delivery_plan_config +-- @description: Konfigurative Erweiterungen für den Lieferplan (od) +-- @depends: release_3_1_0 +ALTER TABLE defaults ADD COLUMN delivery_plan_show_value_of_goods boolean NOT NULL DEFAULT FALSE; +ALTER TABLE defaults ADD COLUMN delivery_plan_calculate_transferred_do boolean NOT NULL DEFAULT FALSE; + diff --git a/templates/webpages/client_config/_warehouse.html b/templates/webpages/client_config/_warehouse.html index 0f871ec90..9d2e0c30b 100644 --- a/templates/webpages/client_config/_warehouse.html +++ b/templates/webpages/client_config/_warehouse.html @@ -87,5 +87,24 @@ [% LxERP.t8('Any stock contents containing a best before date will be impossible to stock out otherwise.') %] +
+ + [% LxERP.t8('Show Value of Goods for Delivery Plan') %] + + [% L.yes_no_tag('defaults.delivery_plan_show_value_of_goods', SELF.defaults.delivery_plan_show_value_of_goods) %] + + + [% LxERP.t8('Calculate the value of goods for delivery plan (WARNING: Experimental (not taxincluded safe!)') %] + + + + [% LxERP.t8('Delivery Plan check for transferred delivery orders') %] + + [% L.yes_no_tag('defaults.delivery_plan_calculate_transferred_do', SELF.defaults.delivery_plan_calculate_transferred_do) %] + + + [% LxERP.t8('The default delivery plan only checks if all delivery orders have been created not if the goods are transferred. This feature will check if all the goods are transferred. Caveat: Only the state of the delivery orders are checked not partial transferred delivery orders (in technical terms: the table inventory is not checked') %] + + -- 2.20.1