use Clone qw(clone);
use SL::DB::Part;
use SL::DB::PartsGroup;
+use SL::DB::Shop;
use SL::Controller::Helper::GetModels;
use SL::Locale::String qw(t8);
use SL::JSON;
use Rose::Object::MakeMethods::Generic (
'scalar --get_set_init' => [ qw(parts models part p warehouses multi_items_models
- makemodels
+ makemodels shops_not_assigned
orphaned
assortment assortment_items assembly assembly_items
all_pricegroups all_translations all_partsgroups all_units
all_buchungsgruppen all_payment_terms all_warehouses
+ parts_classification_filter
all_languages all_units all_price_factors) ],
'scalar' => [ qw(warehouse bin) ],
);
sub action_add_part {
my ($self, %params) = @_;
- $::form->{callback} = $self->url_for(action => 'add_part') unless $::form->{callback};
$self->part( SL::DB::Part->new_part );
$self->add;
};
sub action_add_service {
my ($self, %params) = @_;
- $::form->{callback} = $self->url_for(action => 'add_service') unless $::form->{callback};
$self->part( SL::DB::Part->new_service );
$self->add;
};
sub action_add_assembly {
my ($self, %params) = @_;
- $::form->{callback} = $self->url_for(action => 'add_assembly') unless $::form->{callback};
$self->part( SL::DB::Part->new_assembly );
$self->add;
};
sub action_add_assortment {
my ($self, %params) = @_;
- $::form->{callback} = $self->url_for(action => 'add_assortment') unless $::form->{callback};
$self->part( SL::DB::Part->new_assortment );
$self->add;
};
check_has_valid_part_type($::form->{part}{part_type});
+ die 'parts_classification_type must be "sales" or "purchases"'
+ unless $::form->{parts_classification_type} =~ m/^(sales|purchases)$/;
+
$self->parse_form;
$self->add;
}
if ( $::form->{callback} ) {
$self->redirect_to($::form->unescape($::form->{callback}));
} else {
- my @redirect_params = (
- controller => 'controller.pl',
- action => 'LoginScreen/user_login'
- );
- $self->redirect_to(@redirect_params);
+ $self->redirect_to(controller => 'ic.pl', action => 'search', searchitems => 'article');
}
}
sub _set_javascript {
my ($self) = @_;
- $::request->layout->use_javascript("${_}.js") for qw(kivi.Part kivi.File kivi.PriceRule ckeditor/ckeditor ckeditor/adapters/jquery);
+ $::request->layout->use_javascript("${_}.js") for qw(kivi.Part kivi.File kivi.PriceRule ckeditor/ckeditor ckeditor/adapters/jquery kivi.ShopPart);
$::request->layout->add_javascripts_inline("\$(function(){kivi.PriceRule.load_price_rules_for_part(@{[ $self->part->id ]})});") if $self->part->id;
}
# used by edit, save, delete and add
if ( $::form->{part}{id} ) {
- return SL::DB::Part->new(id => $::form->{part}{id})->load(with => [ qw(makemodels prices translations partsgroup) ]);
+ return SL::DB::Part->new(id => $::form->{part}{id})->load(with => [ qw(makemodels prices translations partsgroup shop_parts shop_parts.shop) ]);
} else {
die "part_type missing" unless $::form->{part}{part_type};
return SL::DB::Part->new(part_type => $::form->{part}{part_type});
}
}
+sub init_shops_not_assigned {
+ my ($self) = @_;
+
+ my @used_shop_ids = map { $_->shop->id } @{ $self->part->shop_parts };
+ if ( @used_shop_ids ) {
+ return SL::DB::Manager::Shop->get_all( query => [ obsolete => 0, '!id' => \@used_shop_ids ], sort_by => 'sortkey' );
+ }
+ else {
+ return SL::DB::Manager::Shop->get_all( query => [ obsolete => 0 ], sort_by => 'sortkey' );
+ }
+}
+
sub init_all_units {
my ($self) = @_;
if ( $self->part->orphaned ) {
);
}
+sub init_parts_classification_filter {
+ return [] unless $::form->{parts_classification_type};
+
+ return [ used_for_sale => 't' ] if $::form->{parts_classification_type} eq 'sales';
+ return [ used_for_purchase => 't' ] if $::form->{parts_classification_type} eq 'purchases';
+
+ die "no query rules for parts_classification_type " . $::form->{parts_classification_type};
+}
+
# simple checks to run on $::form before saving
sub form_check_part_description_exists {
controller.pl?action=Part/add&part_type=service
+=item C<action_add_from_record>
+
+When adding new items to records they can be created on the fly if the entered
+partnumber or description doesn't exist yet. After being asked what part type
+the new item should have the user is redirected to the correct edit page.
+
+Depending on whether the item was added from a sales or a purchase record, only
+the relevant part classifications should be selectable for new item, so this
+parameter is passed on via a hidden parts_classification_type in the new_item
+template.
+
=item C<action_save>
Saves the current part and then reloads the edit page for the part.