From: Jan Büren Date: Tue, 25 Nov 2014 17:10:17 +0000 (+0100) Subject: Merge branch 'master' of github.com:kivitendo/kivitendo-erp X-Git-Tag: release-3.2.0beta~226 X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/commitdiff_plain/e3810fbd565d14993f6b5a6fe89f0e4e27c95869?hp=a54fb4aaa1dfd04290aadf93f30641f9b91156b0 Merge branch 'master' of github.com:kivitendo/kivitendo-erp --- diff --git a/SL/Controller/CustomerVendor.pm b/SL/Controller/CustomerVendor.pm index 3e6ad8217..f57c4b8bd 100644 --- a/SL/Controller/CustomerVendor.pm +++ b/SL/Controller/CustomerVendor.pm @@ -365,7 +365,7 @@ sub action_delete_contact { } }) || die($db->error); - $self->{contact} = SL::DB::Contact->new(); + $self->{contact} = $self->_new_contact_object; } $self->action_edit(); @@ -543,19 +543,27 @@ sub action_ajaj_get_contact { }; $data->{contact_cvars} = { - map( - { - if ( $_->config->type eq 'number' ) { - $_->config->name => $::form->format_amount(\%::myconfig, $_->value, -2); - } else { - $_->config->name => $_->value; - } + map { + my $cvar = $_; + my $result = { type => $cvar->config->type }; + + if ($cvar->config->type eq 'number') { + $result->{value} = $::form->format_amount(\%::myconfig, $cvar->value, -2); + + } elsif ($result->{type} =~ m{customer|vendor|part}) { + my $object = $cvar->value; + my $method = $result->{type} eq 'part' ? 'description' : 'name'; + + $result->{id} = int($cvar->number_value) || undef; + $result->{value} = $object ? $object->$method // '' : ''; + + } else { + $result->{value} = $cvar->value; } - grep( - { $_->is_valid; } - @{$self->{contact}->cvars_by_config} - ) - ) + + ( $cvar->config->name => $result ) + + } grep { $_->is_valid } @{ $self->{contact}->cvars_by_config } }; $self->render(\SL::JSON::to_json($data), { type => 'json', process => 0 }); @@ -637,7 +645,7 @@ sub is_orphaned { } my $arap = $self->is_vendor ? 'ap' : 'ar'; - my $num_args = 2; + my $num_args = 3; my $cv = $self->is_vendor ? 'vendor' : 'customer'; @@ -652,6 +660,13 @@ sub is_orphaned { SELECT a.id FROM oe a JOIN '. $cv .' ct ON (a.'. $cv .'_id = ct.id) + WHERE ct.id = ? + + UNION + + SELECT a.id + FROM delivery_orders a + JOIN '. $cv .' ct ON (a.'. $cv .'_id = ct.id) WHERE ct.id = ?'; @@ -679,11 +694,7 @@ sub _instantiate_args { $self->{cv} = SL::DB::Customer->new(id => $::form->{cv}->{id})->load(); } } else { - if ( $self->is_vendor() ) { - $self->{cv} = SL::DB::Vendor->new(); - } else { - $self->{cv} = SL::DB::Customer->new(); - } + $self->{cv} = $self->_new_customer_vendor_object; } $self->{cv}->assign_attributes(%{$::form->{cv}}); @@ -735,7 +746,7 @@ sub _instantiate_args { if ( $::form->{contact}->{cp_id} ) { $self->{contact} = SL::DB::Contact->new(cp_id => $::form->{contact}->{cp_id})->load(); } else { - $self->{contact} = SL::DB::Contact->new(); + $self->{contact} = $self->_new_contact_object; } $self->{contact}->assign_attributes(%{$::form->{contact}}); @@ -786,18 +797,14 @@ sub _load_customer_vendor { die($::locale->text('Error')); } } else { - $self->{contact} = SL::DB::Contact->new(); + $self->{contact} = $self->_new_contact_object; } } sub _create_customer_vendor { my ($self) = @_; - if ( $self->is_vendor() ) { - $self->{cv} = SL::DB::Vendor->new(); - } else { - $self->{cv} = SL::DB::Customer->new(); - } + $self->{cv} = $self->_new_customer_vendor_object; $self->{cv}->currency_id($::instance_conf->get_currency_id()); $self->{note} = SL::DB::Note->new(); @@ -806,7 +813,7 @@ sub _create_customer_vendor { $self->{shipto} = SL::DB::Shipto->new(); - $self->{contact} = SL::DB::Contact->new(); + $self->{contact} = $self->_new_contact_object; } sub _pre_render { @@ -970,4 +977,21 @@ sub init_vendor_models { ); } +sub _new_customer_vendor_object { + my ($self) = @_; + + my $class = 'SL::DB::' . ($self->is_vendor ? 'Vendor' : 'Customer'); + return $class->new( + contacts => [], + shipto => [], + custom_variables => [], + ); +} + +sub _new_contact_object { + my ($self) = @_; + + return SL::DB::Contact->new(custom_variables => []); +} + 1; diff --git a/SL/DB/CustomVariable.pm b/SL/DB/CustomVariable.pm index 7e6b50080..4be4b6ef2 100644 --- a/SL/DB/CustomVariable.pm +++ b/SL/DB/CustomVariable.pm @@ -64,17 +64,17 @@ sub value { require SL::DB::Customer; my $id = int($self->number_value); - return $id ? SL::DB::Customer->new(id => $id)->load() : 0; + return $id ? SL::DB::Customer->new(id => $id)->load() : undef; } elsif ( $type eq 'vendor' ) { require SL::DB::Vendor; my $id = int($self->number_value); - return $id ? SL::DB::Vendor->new(id => $id)->load() : 0; + return $id ? SL::DB::Vendor->new(id => $id)->load() : undef; } elsif ( $type eq 'part' ) { require SL::DB::Part; my $id = int($self->number_value); - return $id ? SL::DB::Part->new(id => $id)->load() : 0; + return $id ? SL::DB::Part->new(id => $id)->load() : undef; } goto &text_value; # text, textfield, date and select diff --git a/SL/Presenter/CustomerVendor.pm b/SL/Presenter/CustomerVendor.pm index 2bf5ebc3c..4a3702970 100644 --- a/SL/Presenter/CustomerVendor.pm +++ b/SL/Presenter/CustomerVendor.pm @@ -39,7 +39,14 @@ sub _customer_vendor { sub customer_vendor_picker { my ($self, $name, $value, %params) = @_; - $value = SL::DB::Manager::Customer->find_by(id => $value) if $value && !ref $value; + croak 'Unknown "type" parameter' unless $params{type} =~ m{^(?:customer|vendor)$}; + croak 'Unknown value class' if $value && (ref($value) !~ m{^SL::DB::(?:Customer|Vendor)$}); + + if ($value && !ref $value) { + my $class = $params{type} eq 'customer' ? 'SL::DB::Manager::Customer' : 'SL::DB::Manager::Vendor'; + $value = $class->find_by(id => $value); + } + my $id = delete($params{id}) || $self->name_to_id($name); my $fat_set_item = delete $params{fat_set_item}; diff --git a/js/kivi.CustomerVendor.js b/js/kivi.CustomerVendor.js index 1cb08db49..67820bea5 100644 --- a/js/kivi.CustomerVendor.js +++ b/js/kivi.CustomerVendor.js @@ -41,6 +41,27 @@ namespace('kivi.CustomerVendor', function(ns) { } }; + this.setCustomVariablesFromAJAJ = function(cvars) { + for (var key in cvars) { + var cvar = cvars[key]; + var $ctrl = $('#contact_cvars_'+ key); + + console.log($ctrl, cvar); + + if (cvar.type == 'bool') + $ctrl.prop('checked', cvar.value == 1 ? 'checked' : ''); + + else if ((cvar.type == 'customer') || (cvar.type == 'vendor')) + kivi.CustomerVendorPicker($ctrl).set_item({ id: cvar.id, name: cvar.value }); + + else if (cvar.type == 'part') + kivi.PartPicker($ctrl).set_item({ id: cvar.id, name: cvar.value }); + + else + $ctrl.val(cvar.value); + } + }; + this.selectContact = function(params) { var contactId = $('#contact_cp_id').val(); @@ -51,9 +72,7 @@ namespace('kivi.CustomerVendor', function(ns) { for(var key in contact) $(document.getElementById('contact_'+ key)).val(contact[key]) - var cvars = data.contact_cvars; - for(var key in cvars) - $(document.getElementById('contact_cvars_'+ key)).val(cvars[key]); + kivi.CustomerVendor.setCustomVariablesFromAJAJ(data.contact_cvars); if ( contactId ) $('#action_delete_contact').show(); diff --git a/sql/Pg-upgrade2/custom_variables_delete_via_trigger.pl b/sql/Pg-upgrade2/custom_variables_delete_via_trigger.pl index f73a6808f..72327310e 100644 --- a/sql/Pg-upgrade2/custom_variables_delete_via_trigger.pl +++ b/sql/Pg-upgrade2/custom_variables_delete_via_trigger.pl @@ -10,62 +10,8 @@ use strict; use parent qw(SL::DBUpgrade2::Base); sub run { - my ($self) = @_; - - my @queries = ( - #Delete orphaned entries - q|DELETE FROM custom_variables WHERE sub_module = 'orderitems' - AND NOT EXISTS (SELECT id FROM orderitems WHERE orderitems.id = custom_variables.trans_id)|, - q|DELETE FROM custom_variables WHERE sub_module = 'delivery_order_items' - AND NOT EXISTS (SELECT id FROM delivery_order_items WHERE delivery_order_items.id = custom_variables.trans_id)|, - q|DELETE FROM custom_variables WHERE sub_module = 'invoice' - AND NOT EXISTS (SELECT id FROM invoice WHERE invoice.id = custom_variables.trans_id)|, - - #Create trigger - q|CREATE OR REPLACE FUNCTION orderitems_before_delete_trigger() RETURNS trigger AS $$ - BEGIN - DELETE FROM custom_variables WHERE sub_module = 'orderitems' AND trans_id = OLD.id; - - RETURN OLD; - END; - $$ LANGUAGE plpgsql|, - - q|DROP TRIGGER IF EXISTS delete_orderitems_dependencies ON orderitems|, - - q|CREATE TRIGGER delete_orderitems_dependencies - BEFORE DELETE ON orderitems - FOR EACH ROW EXECUTE PROCEDURE orderitems_before_delete_trigger()|, - - q|CREATE OR REPLACE FUNCTION delivery_order_items_before_delete_trigger() RETURNS trigger AS $$ - BEGIN - DELETE FROM custom_variables WHERE sub_module = 'delivery_order_items' AND trans_id = OLD.id; - - RETURN OLD; - END; - $$ LANGUAGE plpgsql|, - - q|DROP TRIGGER IF EXISTS delete_delivery_order_items_dependencies ON delivery_order_items|, - - q|CREATE TRIGGER delete_delivery_order_items_dependencies - BEFORE DELETE ON delivery_order_items - FOR EACH ROW EXECUTE PROCEDURE delivery_order_items_before_delete_trigger()|, - - q|CREATE OR REPLACE FUNCTION invoice_before_delete_trigger() RETURNS trigger AS $$ - BEGIN - DELETE FROM custom_variables WHERE sub_module = 'invoice' AND trans_id = OLD.id; - - RETURN OLD; - END; - $$ LANGUAGE plpgsql|, - - q|DROP TRIGGER IF EXISTS delete_invoice_dependencies ON invoice|, - - q|CREATE TRIGGER delete_invoice_dependencies - BEFORE DELETE ON invoice - FOR EACH ROW EXECUTE PROCEDURE invoice_before_delete_trigger()| - ); - - $self->db_query($_) for @queries; + # This script is intentionally empty, because there is another upgrade script + # which provides this functionality. return 1; } diff --git a/sql/Pg-upgrade2/custom_variables_delete_via_trigger_2.pl b/sql/Pg-upgrade2/custom_variables_delete_via_trigger_2.pl index e1e5bb5a4..7d441ed36 100644 --- a/sql/Pg-upgrade2/custom_variables_delete_via_trigger_2.pl +++ b/sql/Pg-upgrade2/custom_variables_delete_via_trigger_2.pl @@ -10,98 +10,8 @@ use strict; use parent qw(SL::DBUpgrade2::Base); sub run { - my ($self) = @_; - - my @queries = ( - #Delete orphaned entries - q|DELETE FROM custom_variables WHERE (sub_module = '' OR sub_module IS NULL) - AND NOT EXISTS (SELECT id FROM customer WHERE customer.id = custom_variables.trans_id UNION SELECT id FROM vendor WHERE vendor.id = custom_variables.trans_id) - AND (SELECT module FROM custom_variable_configs WHERE id = config_id) = 'CT'|, - q|DELETE FROM custom_variables WHERE (sub_module = '' OR sub_module IS NULL) - AND NOT EXISTS (SELECT id FROM contacts WHERE contacts.cp_id = custom_variables.trans_id) - AND (SELECT module FROM custom_variable_configs WHERE id = config_id) = 'Contacts'|, - q|DELETE FROM custom_variables WHERE (sub_module = '' OR sub_module IS NULL) - AND NOT EXISTS (SELECT id FROM parts WHERE parts.id = custom_variables.trans_id) - AND (SELECT module FROM custom_variable_configs WHERE id = config_id) = 'IC'|, - q|DELETE FROM custom_variables WHERE (sub_module = '' OR sub_module IS NULL) - AND NOT EXISTS (SELECT id FROM project WHERE project.id = custom_variables.trans_id) - AND (SELECT module FROM custom_variable_configs WHERE id = config_id) = 'Projects'|, - - #Create trigger - q|CREATE OR REPLACE FUNCTION delete_cv_custom_variables_trigger() RETURNS trigger AS $$ - BEGIN - DELETE FROM custom_variables WHERE (sub_module = '' OR sub_module IS NULL) - AND trans_id = OLD.id - AND (SELECT module FROM custom_variable_configs WHERE id = config_id) = 'CT'; - - RETURN OLD; - END; - $$ LANGUAGE plpgsql|, - - q|DROP TRIGGER IF EXISTS delete_cv_custom_variables ON customer|, - q|DROP TRIGGER IF EXISTS delete_cv_custom_variables ON vendor|, - - q|CREATE TRIGGER delete_cv_custom_variables - BEFORE DELETE ON customer - FOR EACH ROW EXECUTE PROCEDURE delete_cv_custom_variables_trigger()|, - q|CREATE TRIGGER delete_cv_custom_variables - BEFORE DELETE ON vendor - FOR EACH ROW EXECUTE PROCEDURE delete_cv_custom_variables_trigger()|, - - #Create trigger - q|CREATE OR REPLACE FUNCTION delete_contact_custom_variables_trigger() RETURNS trigger AS $$ - BEGIN - DELETE FROM custom_variables WHERE (sub_module = '' OR sub_module IS NULL) - AND trans_id = OLD.cp_id - AND (SELECT module FROM custom_variable_configs WHERE id = config_id) = 'Contacts'; - - RETURN OLD; - END; - $$ LANGUAGE plpgsql|, - - q|DROP TRIGGER IF EXISTS delete_contact_custom_variables ON contacts|, - - q|CREATE TRIGGER delete_contact_custom_variables - BEFORE DELETE ON contacts - FOR EACH ROW EXECUTE PROCEDURE delete_contact_custom_variables_trigger()|, - - #Create trigger - q|CREATE OR REPLACE FUNCTION delete_part_custom_variables_trigger() RETURNS trigger AS $$ - BEGIN - DELETE FROM custom_variables WHERE (sub_module = '' OR sub_module IS NULL) - AND trans_id = OLD.id - AND (SELECT module FROM custom_variable_configs WHERE id = config_id) = 'IC'; - - RETURN OLD; - END; - $$ LANGUAGE plpgsql|, - - q|DROP TRIGGER IF EXISTS delete_part_custom_variables ON parts|, - - q|CREATE TRIGGER delete_part_custom_variables - BEFORE DELETE ON parts - FOR EACH ROW EXECUTE PROCEDURE delete_part_custom_variables_trigger()|, - - #Create trigger - q|CREATE OR REPLACE FUNCTION delete_project_custom_variables_trigger() RETURNS trigger AS $$ - BEGIN - DELETE FROM custom_variables WHERE (sub_module = '' OR sub_module IS NULL) - AND trans_id = OLD.id - AND (SELECT module FROM custom_variable_configs WHERE id = config_id) = 'Projects'; - - RETURN OLD; - END; - $$ LANGUAGE plpgsql|, - - q|DROP TRIGGER IF EXISTS delete_project_custom_variables ON project|, - - q|CREATE TRIGGER delete_project_custom_variables - BEFORE DELETE ON project - FOR EACH ROW EXECUTE PROCEDURE delete_project_custom_variables_trigger()|, - - ); - - $self->db_query($_) for @queries; + # This script is intentionally empty, because there is another upgrade script + # which provides this functionality. return 1; } diff --git a/sql/Pg-upgrade2/remove_redundant_customer_vendor_delete_triggers.sql b/sql/Pg-upgrade2/remove_redundant_customer_vendor_delete_triggers.sql new file mode 100644 index 000000000..39c87dc90 --- /dev/null +++ b/sql/Pg-upgrade2/remove_redundant_customer_vendor_delete_triggers.sql @@ -0,0 +1,12 @@ +-- @tag: remove_redundant_customer_vendor_delete_triggers +-- @description: Entfernt doppelte/falsche Trigger zum Aufräumen nach dem Löschen von Kunden/Lieferanten +-- @depends: release_3_1_0 +-- @encoding: utf-8 + +-- drop triggers +DROP TRIGGER IF EXISTS del_customer ON customer; +DROP TRIGGER IF EXISTS del_vendor ON vendor; + +-- drop functions +DROP FUNCTION IF EXISTS del_customer(); +DROP FUNCTION IF EXISTS del_vendor(); diff --git a/sql/Pg-upgrade2/remove_redundant_cvar_delete_triggers.sql b/sql/Pg-upgrade2/remove_redundant_cvar_delete_triggers.sql new file mode 100644 index 000000000..dfefa1c7e --- /dev/null +++ b/sql/Pg-upgrade2/remove_redundant_cvar_delete_triggers.sql @@ -0,0 +1,23 @@ +-- @tag: remove_redundant_cvar_delete_triggers +-- @description: Entfernt doppelte Trigger zum Löschen von benutzerdefinierten Variablen +-- @depends: custom_variables_delete_via_trigger custom_variables_delete_via_trigger_2 delete_cvars_on_trans_deletion +-- @encoding: utf-8 + +-- drop triggers +DROP TRIGGER IF EXISTS delete_orderitems_dependencies ON orderitems; +DROP TRIGGER IF EXISTS delete_delivery_order_items_dependencies ON delivery_order_items; +DROP TRIGGER IF EXISTS delete_invoice_dependencies ON invoice; +DROP TRIGGER IF EXISTS delete_cv_custom_variables ON customer; +DROP TRIGGER IF EXISTS delete_cv_custom_variables ON vendor; +DROP TRIGGER IF EXISTS delete_contact_custom_variables ON contacts; +DROP TRIGGER IF EXISTS delete_part_custom_variables ON parts; +DROP TRIGGER IF EXISTS delete_project_custom_variables ON project; + +-- drop functions +DROP FUNCTION IF EXISTS orderitems_before_delete_trigger(); +DROP FUNCTION IF EXISTS delivery_order_items_before_delete_trigger(); +DROP FUNCTION IF EXISTS invoice_before_delete_trigger(); +DROP FUNCTION IF EXISTS delete_cv_custom_variables_trigger(); +DROP FUNCTION IF EXISTS delete_contact_custom_variables_trigger(); +DROP FUNCTION IF EXISTS delete_part_custom_variables_trigger(); +DROP FUNCTION IF EXISTS delete_project_custom_variables_trigger(); diff --git a/templates/webpages/common/render_cvar_input.html b/templates/webpages/common/render_cvar_input.html index 836db1df7..c7072d455 100644 --- a/templates/webpages/common/render_cvar_input.html +++ b/templates/webpages/common/render_cvar_input.html @@ -20,11 +20,11 @@ [%- ELSIF ( var.config.type == 'timestamp' ) %] [% L.input_tag(var_name, var.value) %] [%- ELSIF ( var.config.type == 'customer' ) %] - [% L.customer_picker(var_name, var.value) %] + [% L.customer_vendor_picker(var_name, var.value, type='customer') %] [%- ELSIF ( var.config.type == 'vendor' ) %] - [% L.vendor_selector(var_name, var.value) %] + [% L.customer_vendor_picker(var_name, var.value, type='vendor') %] [%- ELSIF ( var.config.type == 'part' ) %] - [% L.part_selector(var_name, var.value) %] + [% L.part_picker(var_name, var.value) %] [%- ELSIF ( var.config.type == 'select' ) %] [% L.select_tag(var_name, var.config.processed_options, default = var.value) %] [%- ELSIF ( var.config.type == 'number' ) %] diff --git a/templates/webpages/customer_vendor/tabs/custom_variables.html b/templates/webpages/customer_vendor/tabs/custom_variables.html index dcd62f091..7b9abf3ad 100644 --- a/templates/webpages/customer_vendor/tabs/custom_variables.html +++ b/templates/webpages/customer_vendor/tabs/custom_variables.html @@ -3,7 +3,7 @@

- [% FOREACH var = cv_cvars %] + [% FOREACH var = SELF.cv.cvars_by_config %]
[% var.config.description | html %]