Revision 1758316c
Von Bernd Bleßmann vor 4 Monaten hinzugefügt
SL/Controller/StockCounting.pm | ||
---|---|---|
1 |
package SL::Controller::StockCounting; |
|
2 |
|
|
3 |
use strict; |
|
4 |
use parent qw(SL::Controller::Base); |
|
5 |
|
|
6 |
use SL::DB::Employee; |
|
7 |
use SL::DB::StockCounting; |
|
8 |
use SL::DB::StockCountingItem; |
|
9 |
|
|
10 |
use SL::Locale::String qw(t8); |
|
11 |
|
|
12 |
use Rose::Object::MakeMethods::Generic( |
|
13 |
#scalar => [ qw() ], |
|
14 |
'scalar --get_set_init' => [ qw(is_developer countings stock_counting_item) ], |
|
15 |
); |
|
16 |
|
|
17 |
# check permissions |
|
18 |
__PACKAGE__->run_before(sub { $::auth->assert('warehouse_management'); }); |
|
19 |
|
|
20 |
# load js |
|
21 |
__PACKAGE__->run_before(sub { $::request->layout->add_javascripts('kivi.Validator.js', 'kivi.StockCounting.js'); }); |
|
22 |
|
|
23 |
################ actions ################# |
|
24 |
|
|
25 |
sub action_select_counting { |
|
26 |
my ($self) = @_; |
|
27 |
|
|
28 |
$self->render('stock_counting/select_counting'); |
|
29 |
} |
|
30 |
|
|
31 |
sub action_start_counting { |
|
32 |
my ($self) = @_; |
|
33 |
|
|
34 |
$self->render('stock_counting/count'); |
|
35 |
} |
|
36 |
|
|
37 |
sub action_count { |
|
38 |
my ($self) = @_; |
|
39 |
|
|
40 |
my @errors; |
|
41 |
push @errors, t8('EAN is missing') if !$::form->{ean}; |
|
42 |
|
|
43 |
return $self->render('stock_counting/count', errors => \@errors) if @errors; |
|
44 |
|
|
45 |
my $parts = SL::DB::Manager::Part->get_all(where => [ean => $::form->{ean}, |
|
46 |
or => [obsolete => 0, obsolete => undef]]); |
|
47 |
push @errors, t8 ('Part not found') if scalar(@$parts) == 0; |
|
48 |
push @errors, t8 ('Part is ambiguous') if scalar(@$parts) > 1; |
|
49 |
|
|
50 |
$self->stock_counting_item->part($parts->[0]) if !@errors; |
|
51 |
|
|
52 |
my @validation_errors = $self->stock_counting_item->validate; |
|
53 |
push @errors, @validation_errors if @validation_errors; |
|
54 |
|
|
55 |
$::form->error(join "\n", @errors) if @errors; |
|
56 |
|
|
57 |
$self->stock_counting_item->qty(1); |
|
58 |
$self->stock_counting_item->save; |
|
59 |
|
|
60 |
$self->render('stock_counting/count',); |
|
61 |
} |
|
62 |
|
|
63 |
sub init_is_developer { |
|
64 |
!!$::auth->assert('developer', 'may_fail') |
|
65 |
} |
|
66 |
|
|
67 |
sub init_countings { |
|
68 |
SL::DB::Manager::StockCounting->get_all_sorted; |
|
69 |
} |
|
70 |
|
|
71 |
sub init_stock_counting_item { |
|
72 |
SL::DB::StockCountingItem->new(%{$::form->{stock_counting_item}}, |
|
73 |
employee => SL::DB::Manager::Employee->current); |
|
74 |
} |
|
75 |
|
|
76 |
1; |
js/kivi.StockCounting.js | ||
---|---|---|
1 |
namespace('kivi.StockCounting', function(ns) { |
|
2 |
|
|
3 |
}); |
menus/mobile/00-erp.yaml | ||
---|---|---|
16 | 16 |
access: ap_transactions |
17 | 17 |
params: |
18 | 18 |
action: ScanQRBill/scan_view |
19 |
- id: stock_counting |
|
20 |
name: Stock Counting |
|
21 |
order: 250 |
|
22 |
access: warehouse_management |
|
23 |
params: |
|
24 |
action: StockCounting/select_counting |
|
19 | 25 |
- id: component_test |
20 | 26 |
name: Component Test |
21 | 27 |
order: 300 |
templates/mobile_webpages/stock_counting/count.html | ||
---|---|---|
1 |
[%- USE T8 %] |
|
2 |
[%- USE LxERP %] |
|
3 |
[%- USE P %] |
|
4 |
|
|
5 |
|
|
6 |
<div class="section"> |
|
7 |
<div class="container"> |
|
8 |
<div class="z-depth-1 grey lighten-4 row" style="padding: 32px 48px 0px 48px; border: 1px solid #EEE;"> |
|
9 |
<div class="row">[% SELF.stock_counting_item.counting.name %]</div> |
|
10 |
<div class="row">[% SELF.stock_counting_item.counting.description %]</div> |
|
11 |
<div class="row">[% SELF.stock_counting_item.counting.part.displayable_name %]</div> |
|
12 |
<div class="row">[% SELF.stock_counting_item.counting.partsgroup.displayable_name %]</div> |
|
13 |
<div class="row">[% SELF.stock_counting_item.counting.vendor.displayable_name %]</div> |
|
14 |
<form method="post" name="count_form" id="count_form" action="controller.pl" target="_top" class="col s12"> |
|
15 |
[% P.hidden_tag('stock_counting_item.counting_id', SELF.stock_counting_item.counting_id) %] |
|
16 |
[% IF SELF.stock_counting_item.counting.bin_id %] |
|
17 |
<div class="row">[% SELF.stock_counting_item.counting.bin.full_description %]</div> |
|
18 |
[% P.hidden_tag('stock_counting_item.bin_id', SELF.stock_counting_item.counting.bin_id) %] |
|
19 |
[% ELSE %] |
|
20 |
<div class="row"> |
|
21 |
[% P.M.wh_bin_select('dummy_wh', bin_name='stock_counting_item.bin_id', with_empty=1, 'data-validate'='required', label=LxERP.t8('Bin'), class='col s12') %] |
|
22 |
</div> |
|
23 |
[% END %] |
|
24 |
<div class="row"> |
|
25 |
[% P.M.input_tag('ean', '', placeholder=last_ean || LxERP.t8('EAN'), 'data-validate'='required', label=LxERP.t8('Part to count'), class='col s12') %] |
|
26 |
</div> |
|
27 |
<div class="row"> |
|
28 |
[% P.hidden_tag("action", "StockCounting/count") %] |
|
29 |
[% P.M.submit_tag("btn_count", LxERP.t8("Do count"), class="col s12", large=1) %] |
|
30 |
</div> |
|
31 |
</form> |
|
32 |
</div> |
|
33 |
</div> |
|
34 |
</div> |
templates/mobile_webpages/stock_counting/select_counting.html | ||
---|---|---|
1 |
[%- USE T8 %] |
|
2 |
[%- USE LxERP %] |
|
3 |
[%- USE P %] |
|
4 |
|
|
5 |
<div class="section"> |
|
6 |
<div class="container"> |
|
7 |
<div class="z-depth-1 grey lighten-4 row" style="padding: 32px 48px 0px 48px; border: 1px solid #EEE;"> |
|
8 |
<form method="post" name="count_form" action="controller.pl" target="_top" class="col s12"> |
|
9 |
<div class="row"> |
|
10 |
[% P.M.select_tag('stock_counting_item.counting_id', SELF.countings, |
|
11 |
class='col s12', |
|
12 |
title_key='name', |
|
13 |
label=LxERP.t8('Select a Stock Counting')) |
|
14 |
%] |
|
15 |
</div> |
|
16 |
<div class="row"> |
|
17 |
[% P.hidden_tag("action", "StockCounting/start_counting") %] |
|
18 |
[% P.M.submit_tag("btn_start", LxERP.t8("Start"), class="col s12", large=1) %] |
|
19 |
</div> |
|
20 |
</form> |
|
21 |
</div> |
|
22 |
</div> |
|
23 |
</div> |
Auch abrufbar als: Unified diff
Zwischeninventur: Mobil-Menüeintrag und -Controller