X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FController%2FCustomerVendor.pm;h=5404373f41049be43874e9536bc7c70205c6bc6a;hb=4d3be9c7cbf7d525181428a9b3697338aa066f0f;hp=d9732cb97dbd4a5f605972bf7ebf107b68b414a4;hpb=7bc44f0f59f35d7d3b555e98ff9bb61c8ffbea0b;p=kivitendo-erp.git diff --git a/SL/Controller/CustomerVendor.pm b/SL/Controller/CustomerVendor.pm index d9732cb97..5404373f4 100644 --- a/SL/Controller/CustomerVendor.pm +++ b/SL/Controller/CustomerVendor.pm @@ -3,6 +3,8 @@ package SL::Controller::CustomerVendor; use strict; use parent qw(SL::Controller::Base); +use List::MoreUtils qw(any); + use SL::JSON; use SL::DBUtils; use SL::Helper::Flash; @@ -61,6 +63,29 @@ __PACKAGE__->run_before( 'ajaj_get_contact', ] ); + +# make sure this comes after _load_customer_vendor +__PACKAGE__->run_before( + '_check_customer_vendor_all_edit', + only => [ + 'edit', + 'show', + 'update', + 'delete', + 'save', + 'save_and_ap_transaction', + 'save_and_ar_transaction', + 'save_and_close', + 'save_and_invoice', + 'save_and_order', + 'save_and_quotation', + 'save_and_rfq', + 'delete', + 'delete_contact', + 'delete_shipto', + ] +); + __PACKAGE__->run_before( '_create_customer_vendor', only => [ @@ -113,9 +138,21 @@ sub action_show { sub _save { my ($self) = @_; + my @errors = $self->{cv}->validate; + if (@errors) { + flash('error', @errors); + $self->_pre_render(); + $self->render( + 'customer_vendor/form', + title => ($self->is_vendor() ? t8('Edit Vendor') : t8('Edit Customer')), + %{$self->{template_args}} + ); + $::dispatcher->end_request; + } + my $db = $self->{cv}->db; - $db->do_transaction(sub { + $db->with_transaction(sub { my $cvs_by_nr; if ( $self->is_vendor() ) { if ( $self->{cv}->vendornumber ) { @@ -162,8 +199,8 @@ sub _save { } $self->{shipto}->trans_id($self->{cv}->id); - if( $self->{shipto}->shiptoname ne '' ) { - $self->{shipto}->save(); + if(any { $self->{shipto}->$_ ne '' } qw(shiptoname shiptodepartment_1 shiptodepartment_2 shiptostreet shiptozipcode shiptocity shiptocountry shiptogln shiptocontact shiptophone shiptofax shiptoemail)) { + $self->{shipto}->save(cascade => 1); } my $snumbers = $self->is_vendor() ? 'vendornumber_'. $self->{cv}->vendornumber : 'customernumber_'. $self->{cv}->customernumber; @@ -186,6 +223,8 @@ sub _save { $note->delete(cascade => 'delete'); } } + + 1; }) || die($db->error); } @@ -193,34 +232,23 @@ sub _save { sub action_save { my ($self) = @_; - if (!$self->{cv}->name) { - flash('error', t8('Customer missing!')); - $self->_pre_render(); - $self->render( - 'customer_vendor/form', - title => ($self->is_vendor() ? t8('Edit Vendor') : t8('Edit Customer')), - %{$self->{template_args}} - ); - } else { - - $self->_save(); - - my @redirect_params = ( - action => 'edit', - id => $self->{cv}->id, - db => ($self->is_vendor() ? 'vendor' : 'customer'), - ); + $self->_save(); - if ( $self->{contact}->cp_id ) { - push(@redirect_params, contact_id => $self->{contact}->cp_id); - } + my @redirect_params = ( + action => 'edit', + id => $self->{cv}->id, + db => ($self->is_vendor() ? 'vendor' : 'customer'), + ); - if ( $self->{shipto}->shipto_id ) { - push(@redirect_params, shipto_id => $self->{shipto}->shipto_id); - } + if ( $self->{contact}->cp_id ) { + push(@redirect_params, contact_id => $self->{contact}->cp_id); + } - $self->redirect_to(@redirect_params); + if ( $self->{shipto}->shipto_id ) { + push(@redirect_params, shipto_id => $self->{shipto}->shipto_id); } + + $self->redirect_to(@redirect_params); } sub action_save_and_close { @@ -235,12 +263,12 @@ sub action_save_and_close { sub _transaction { my ($self, $script) = @_; - $::auth->assert('general_ledger | invoice_edit | vendor_invoice_edit | ' . + $::auth->assert('gl_transactions | ap_transactions | ar_transactions'. + '| invoice_edit | vendor_invoice_edit | ' . ' request_quotation_edit | sales_quotation_edit | sales_order_edit | purchase_order_edit'); $self->_save(); - my $callback = $::form->escape($::form->{callback}, 1); my $name = $::form->escape($self->{cv}->name, 1); my $db = $self->is_vendor() ? 'vendor' : 'customer'; @@ -251,7 +279,7 @@ sub _transaction { $db .'_id' => $self->{cv}->id, $db => $name, type => $::form->{type}, - callback => $callback, + callback => $::form->{callback}, ); print $::form->redirect_header($url); @@ -260,7 +288,7 @@ sub _transaction { sub action_save_and_ar_transaction { my ($self) = @_; - $main::auth->assert('general_ledger'); + $main::auth->assert('ar_transactions'); $self->_transaction('ar.pl'); } @@ -268,7 +296,7 @@ sub action_save_and_ar_transaction { sub action_save_and_ap_transaction { my ($self) = @_; - $main::auth->assert('general_ledger'); + $main::auth->assert('ap_transactions'); $self->_transaction('ap.pl'); } @@ -326,7 +354,7 @@ sub action_delete { $self->action_edit(); } else { - $db->do_transaction(sub { + $db->with_transaction(sub { $self->{cv}->delete(cascade => 1); my $snumbers = $self->is_vendor() ? 'vendornumber_'. $self->{cv}->vendornumber : 'customernumber_'. $self->{cv}->customernumber; @@ -354,7 +382,7 @@ sub action_delete_contact { SL::Helper::Flash::flash('error', $::locale->text('No contact selected to delete')); } else { - $db->do_transaction(sub { + $db->with_transaction(sub { if ( $self->{contact}->used ) { $self->{contact}->detach(); $self->{contact}->save(); @@ -363,6 +391,8 @@ sub action_delete_contact { $self->{contact}->delete(cascade => 1); SL::Helper::Flash::flash('info', $::locale->text('Contact deleted.')); } + + 1; }) || die($db->error); $self->{contact} = $self->_new_contact_object; @@ -380,7 +410,7 @@ sub action_delete_shipto { SL::Helper::Flash::flash('error', $::locale->text('No shipto selected to delete')); } else { - $db->do_transaction(sub { + $db->with_transaction(sub { if ( $self->{shipto}->used ) { $self->{shipto}->detach(); $self->{shipto}->save(cascade => 1); @@ -389,6 +419,8 @@ sub action_delete_shipto { $self->{shipto}->delete(cascade => 1); SL::Helper::Flash::flash('info', $::locale->text('Shipto deleted.')); } + + 1; }) || die($db->error); $self->{shipto} = SL::DB::Shipto->new(); @@ -493,7 +525,7 @@ sub action_get_delivery { LEFT JOIN oe ON (oe.ordnumber = ${arap}.ordnumber AND NOT ${arap}.ordnumber = '' - AND ". ($arap eq 'ar' ? 'oe.customer_id IS NOT NULL' : 'oe_vendor_id IS NOT NULL') ." ) + AND ". ($arap eq 'ar' ? 'oe.customer_id IS NOT NULL' : 'oe.vendor_id IS NOT NULL') ." ) ${where} ORDER BY ${arap}.transdate DESC LIMIT 15"; @@ -506,16 +538,19 @@ sub action_get_delivery { sub action_ajaj_get_shipto { my ($self) = @_; - my $data = { + my $data = {}; + $data->{shipto} = { map( { my $name = 'shipto'. $_; $name => $self->{shipto}->$name; } - qw(_id name department_1 department_2 street zipcode city country contact phone fax email) + qw(_id name department_1 department_2 street zipcode city gln country contact phone fax email) ) }; + $data->{shipto_cvars} = $self->_prepare_cvar_configs_for_ajaj($self->{shipto}->cvars_by_config); + $self->render(\SL::JSON::to_json($data), { type => 'json', process => 0 }); } @@ -542,29 +577,7 @@ sub action_ajaj_get_contact { ) }; - $data->{contact_cvars} = { - 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; - } - - ( $cvar->config->name => $result ) - - } grep { $_->is_valid } @{ $self->{contact}->cvars_by_config } - }; + $data->{contact_cvars} = $self->_prepare_cvar_configs_for_ajaj($self->{contact}->cvars_by_config); $self->render(\SL::JSON::to_json($data), { type => 'json', process => 0 }); } @@ -596,6 +609,7 @@ sub action_ajaj_autocomplete { if (1 == scalar @{ $exact_matches = $manager->get_all( query => [ obsolete => 0, + (salesman_id => SL::DB::Manager::Employee->current->id) x !$::auth->assert('customer_vendor_all_edit', 1), or => [ name => { ilike => $::form->{filter}{'all:substr:multi::ilike'} }, $number => { ilike => $::form->{filter}{'all:substr:multi::ilike'} }, @@ -682,6 +696,17 @@ sub is_orphaned { return $self->{_is_orphaned} = !$dummy; } +sub _copy_form_to_cvars { + my ($self, %params) = @_; + + foreach my $cvar (@{ $params{target}->cvars_by_config }) { + my $value = $params{source}->{$cvar->config->name}; + $value = $::form->parse_amount(\%::myconfig, $value) if $cvar->config->type eq 'number'; + + $cvar->value($value); + } +} + sub _instantiate_args { my ($self) = @_; @@ -704,16 +729,6 @@ sub _instantiate_args { $self->{cv}->hourly_rate($::instance_conf->get_customer_hourly_rate) if $self->is_customer && !$self->{cv}->hourly_rate; - foreach my $cvar (@{$self->{cv}->cvars_by_config()}) { - my $value = $::form->{cv_cvars}->{$cvar->config->name}; - - if ( $cvar->config->type eq 'number' ) { - $value = $::form->parse_amount(\%::myconfig, $value); - } - - $cvar->value($value); - } - if ( $::form->{note}->{id} ) { $self->{note} = SL::DB::Note->new(id => $::form->{note}->{id})->load(); $self->{note_followup} = $self->{note}->follow_up; @@ -750,15 +765,9 @@ sub _instantiate_args { } $self->{contact}->assign_attributes(%{$::form->{contact}}); - foreach my $cvar (@{$self->{contact}->cvars_by_config()}) { - my $value = $::form->{contact_cvars}->{$cvar->config->name}; - - if ( $cvar->config->type eq 'number' ) { - $value = $::form->parse_amount(\%::myconfig, $value); - } - - $cvar->value($value); - } + $self->_copy_form_to_cvars(target => $self->{cv}, source => $::form->{cv_cvars}); + $self->_copy_form_to_cvars(target => $self->{contact}, source => $::form->{contact_cvars}); + $self->_copy_form_to_cvars(target => $self->{shipto}, source => $::form->{shipto_cvars}); } sub _load_customer_vendor { @@ -801,6 +810,16 @@ sub _load_customer_vendor { } } +sub _check_customer_vendor_all_edit { + my ($self) = @_; + + unless ($::auth->assert('customer_vendor_all_edit', 1)) { + die($::locale->text("You don't have the rights to edit this customer.") . "\n") + if $self->{cv}->is_customer and + SL::DB::Manager::Employee->current->id != $self->{cv}->salesman_id; + }; +}; + sub _create_customer_vendor { my ($self) = @_; @@ -882,11 +901,14 @@ sub _pre_render { $self->{all_salesmen} = SL::DB::Manager::Employee->get_all(query => [ or => [ id => $self->{cv}->salesman_id, deleted => 0 ] ]); } - $self->{all_payment_terms} = SL::DB::Manager::PaymentTerm->get_all(); + $self->{all_payment_terms} = SL::DB::Manager::PaymentTerm->get_all_sorted(where => [ or => [ id => $self->{cv}->payment_id, + obsolete => 0 ] ]); $self->{all_delivery_terms} = SL::DB::Manager::DeliveryTerm->get_all(); - $self->{all_pricegroups} = SL::DB::Manager::Pricegroup->get_all(); + if ($self->{cv}->is_customer) { + $self->{all_pricegroups} = SL::DB::Manager::Pricegroup->get_all_sorted(query => [ or => [ id => $self->{cv}->pricegroup_id, obsolete => 0 ] ]); + } $query = 'SELECT DISTINCT(cp_abteilung) AS department @@ -920,6 +942,37 @@ sub _pre_render { $::request->{layout}->add_javascripts('kivi.CustomerVendor.js'); } +sub _prepare_cvar_configs_for_ajaj { + my ($self, $cvars) = @_; + + return { + 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} eq 'date') { + $result->{value} = $cvar->value ? $cvar->value->to_kivitendo : undef; + + } 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; + } + + ( $cvar->config->name => $result ) + + } grep { $_->is_valid } @{ $cvars } + }; +} + sub normalize_name { my ($self) = @_; @@ -958,6 +1011,9 @@ sub init_customer_models { }, customernumber => t8('Customer Number'), }, + query => [ + ( salesman_id => SL::DB::Manager::Employee->current->id) x !$::auth->assert('customer_vendor_all_edit', 1), + ], ); }