Revision 9c194331
Von Moritz Bunkus vor fast 8 Jahren hinzugefügt
SL/Controller/PartsGroup.pm | ||
---|---|---|
1 |
package SL::Controller::PartsGroup; |
|
2 |
|
|
3 |
use strict; |
|
4 |
|
|
5 |
use parent qw(SL::Controller::Base); |
|
6 |
|
|
7 |
use SL::Helper::Flash; |
|
8 |
use SL::Locale::String; |
|
9 |
use SL::DB::Default; |
|
10 |
use SL::DB::Manager::PartsGroup; |
|
11 |
|
|
12 |
use Rose::Object::MakeMethods::Generic ( |
|
13 |
scalar => [ qw(partsgroup) ], |
|
14 |
'scalar --get_set_init' => [ qw(all_partsgroups) ], |
|
15 |
); |
|
16 |
|
|
17 |
__PACKAGE__->run_before('check_auth'); |
|
18 |
__PACKAGE__->run_before('load_partsgroup', only => [ qw(edit update delete) ]); |
|
19 |
|
|
20 |
# |
|
21 |
# actions |
|
22 |
# |
|
23 |
|
|
24 |
sub action_list { |
|
25 |
my ($self) = @_; |
|
26 |
|
|
27 |
$self->render('partsgroup/list', |
|
28 |
title => t8('Partsgroups'), |
|
29 |
); |
|
30 |
} |
|
31 |
|
|
32 |
sub action_new { |
|
33 |
my ($self) = @_; |
|
34 |
|
|
35 |
$self->partsgroup( SL::DB::PartsGroup->new ); |
|
36 |
$self->render('partsgroup/form', |
|
37 |
title => t8('Add partsgroup'), |
|
38 |
); |
|
39 |
} |
|
40 |
|
|
41 |
sub action_edit { |
|
42 |
my ($self) = @_; |
|
43 |
|
|
44 |
$self->render('partsgroup/form', |
|
45 |
title => t8('Edit partsgroup'), |
|
46 |
); |
|
47 |
} |
|
48 |
|
|
49 |
sub action_create { |
|
50 |
my ($self) = @_; |
|
51 |
|
|
52 |
$self->partsgroup( SL::DB::PartsGroup->new ); |
|
53 |
$self->create_or_update; |
|
54 |
} |
|
55 |
|
|
56 |
sub action_update { |
|
57 |
my ($self) = @_; |
|
58 |
$self->create_or_update; |
|
59 |
} |
|
60 |
|
|
61 |
sub action_delete { |
|
62 |
my ($self) = @_; |
|
63 |
|
|
64 |
if ( !$self->partsgroup->orphaned ) { |
|
65 |
flash_later('error', $::locale->text('The partsgroup has been used and cannot be deleted.')); |
|
66 |
} elsif ( eval { $self->partsgroup->delete; 1; } ) { |
|
67 |
flash_later('info', $::locale->text('The partsgroup has been deleted.')); |
|
68 |
} else { |
|
69 |
flash_later('error', $::locale->text('The partsgroup has been used and cannot be deleted.')); |
|
70 |
}; |
|
71 |
$self->redirect_to(action => 'list'); |
|
72 |
} |
|
73 |
|
|
74 |
sub action_reorder { |
|
75 |
my ($self) = @_; |
|
76 |
|
|
77 |
SL::DB::PartsGroup->reorder_list(@{ $::form->{partsgroup_id} || [] }); |
|
78 |
$self->render(\'', { type => 'json' }); |
|
79 |
} |
|
80 |
|
|
81 |
# |
|
82 |
# filters |
|
83 |
# |
|
84 |
|
|
85 |
sub check_auth { |
|
86 |
$::auth->assert('config'); |
|
87 |
} |
|
88 |
|
|
89 |
sub load_partsgroup { |
|
90 |
my ($self) = @_; |
|
91 |
|
|
92 |
$self->partsgroup( SL::DB::PartsGroup->new(id => $::form->{id})->load ); |
|
93 |
} |
|
94 |
|
|
95 |
sub init_all_partsgroups { SL::DB::Manager::PartsGroup->get_all_sorted } |
|
96 |
|
|
97 |
# |
|
98 |
# helpers |
|
99 |
# |
|
100 |
|
|
101 |
sub create_or_update { |
|
102 |
my ($self) = @_; |
|
103 |
my $is_new = !$self->partsgroup->id; |
|
104 |
|
|
105 |
my $params = delete($::form->{partsgroup}) || { }; |
|
106 |
|
|
107 |
$self->partsgroup->assign_attributes(%{ $params }); |
|
108 |
|
|
109 |
my @errors = $self->partsgroup->validate; |
|
110 |
|
|
111 |
if (@errors) { |
|
112 |
flash('error', @errors); |
|
113 |
$self->render('partsgroup/form', |
|
114 |
title => $is_new ? t8('Add partsgroup') : t8('Edit partsgroup'), |
|
115 |
); |
|
116 |
return; |
|
117 |
} |
|
118 |
|
|
119 |
$self->partsgroup->save; |
|
120 |
|
|
121 |
flash_later('info', $is_new ? t8('The partsgroup has been created.') : t8('The partsgroup has been saved.')); |
|
122 |
$self->redirect_to(action => 'list'); |
|
123 |
} |
|
124 |
|
|
125 |
1; |
|
126 |
|
|
127 |
__END__ |
|
128 |
|
|
129 |
=encoding utf-8 |
|
130 |
|
|
131 |
=head1 NAME |
|
132 |
|
|
133 |
SL::Controller::PartsGroup - CRUD controller for partsgroups |
|
134 |
|
|
135 |
=head1 SYNOPSIS |
|
136 |
|
|
137 |
A new controller to create / edit / delete partsgroups. |
|
138 |
|
|
139 |
Partsgroups can only be deleted if they haven't been used anywhere. |
|
140 |
|
|
141 |
=head1 OBSOLETE PARTSGROUPS |
|
142 |
|
|
143 |
A partsgroup can be deleted if it hasn't been used anywhere / is orphaned. |
|
144 |
|
|
145 |
A partsgroup can be set to obsolete, which means new items can't be assigned |
|
146 |
that partsgroup, but old items with that partsgroup can keep it. And you can |
|
147 |
also still filter for these obsolete partsgroups in reports. |
|
148 |
|
|
149 |
=head1 ISSUES |
|
150 |
|
|
151 |
Unlike the old version (pe.pl/PE.pm), there is no way to filter/search the |
|
152 |
partsgroups in the overview page, it always shows the complete (ordered) list, |
|
153 |
ordered by sortkey. |
|
154 |
|
|
155 |
=head1 AUTHOR |
|
156 |
|
|
157 |
G. Richardson E<lt>grichardson@kivitendo-premium.deE<gt> |
|
158 |
|
|
159 |
=cut |
SL/Controller/SimpleSystemSetting.pm | ||
---|---|---|
40 | 40 |
], |
41 | 41 |
}, |
42 | 42 |
|
43 |
parts_group => { |
|
44 |
# Make locales.pl happy: $self->render("simple_system_setting/_parts_group_form") |
|
45 |
class => 'PartsGroup', |
|
46 |
titles => { |
|
47 |
list => t8('Partsgroups'), |
|
48 |
add => t8('Add partsgroup'), |
|
49 |
edit => t8('Edit partsgroup'), |
|
50 |
}, |
|
51 |
list_attributes => [ |
|
52 |
{ method => 'partsgroup', title => t8('Description') }, |
|
53 |
{ method => 'obsolete', title => t8('Obsolete'), formatter => sub { $_[0]->obsolete ? t8('yes') : t8('no') } }, |
|
54 |
], |
|
55 |
}, |
|
56 |
|
|
43 | 57 |
pricegroup => { |
44 | 58 |
# Make locales.pl happy: $self->render("simple_system_setting/_pricegroup_form") |
45 | 59 |
class => 'Pricegroup', |
locale/de/all | ||
---|---|---|
3074 | 3074 |
'The parts for this delivery order have already been transferred out.' => 'Die Artikel dieses Lieferscheins wurden bereits ausgelagert.', |
3075 | 3075 |
'The parts have been removed.' => 'Die Waren wurden aus dem Lager entnommen.', |
3076 | 3076 |
'The parts have been transferred.' => 'Die Waren wurden umgelagert.', |
3077 |
'The partsgroup has been created.' => 'Die Warengruppe wurde erstellt.', |
|
3078 |
'The partsgroup has been deleted.' => 'Die Warengruppe wurde gelöscht.', |
|
3079 |
'The partsgroup has been saved.' => 'Die Warengruppe wurde gespeichert.', |
|
3080 |
'The partsgroup has been used and cannot be deleted.' => 'Die Warengruppe wurde bereits verwendet und kann nicht gelöscht werden.', |
|
3081 | 3077 |
'The password is too long (maximum length: #1).' => 'Das Passwort ist zu lang (maximale Länge: #1).', |
3082 | 3078 |
'The password is too short (minimum length: #1).' => 'Das Password ist zu kurz (minimale Länge: #1).', |
3083 | 3079 |
'The password is weak (e.g. it can be found in a dictionary).' => 'Das Passwort ist schwach (z.B. wenn es in einem Wörterbuch steht).', |
menus/user/00-erp.yaml | ||
---|---|---|
1072 | 1072 |
name: Partsgroups |
1073 | 1073 |
order: 900 |
1074 | 1074 |
params: |
1075 |
action: PartsGroup/list |
|
1075 |
action: SimpleSystemSetting/list |
|
1076 |
type: parts_group |
|
1076 | 1077 |
- parent: system |
1077 | 1078 |
id: system_part_classification |
1078 | 1079 |
name: Parts Classification |
templates/webpages/partsgroup/form.html | ||
---|---|---|
1 |
[%- USE HTML -%][%- USE LxERP -%][%- USE L -%][%- USE T8 -%] |
|
2 |
|
|
3 |
[% SET style="width: 400px" %] |
|
4 |
[% SET size=15 %] |
|
5 |
|
|
6 |
<h1>[% HTML.escape(title) %]</h1> |
|
7 |
|
|
8 |
<form action="controller.pl" method="post"> |
|
9 |
|
|
10 |
[%- INCLUDE 'common/flash.html' %] |
|
11 |
|
|
12 |
[%- L.hidden_tag("id", SELF.partsgroup.id) %] |
|
13 |
|
|
14 |
<table> |
|
15 |
<tr> |
|
16 |
<th align="right">[% 'Description' | $T8 %]</th> |
|
17 |
<td> |
|
18 |
[%- L.input_tag("partsgroup.partsgroup", SELF.partsgroup.partsgroup) %] |
|
19 |
</td> |
|
20 |
[% IF SELF.partsgroup.id %] |
|
21 |
<tr> |
|
22 |
<th align="right">[% 'Obsolete' | $T8 %]</th> |
|
23 |
<td>[% L.checkbox_tag('partsgroup.obsolete', checked = SELF.partsgroup.obsolete, for_submit=1) %]</td> |
|
24 |
</tr> |
|
25 |
</tr> |
|
26 |
[% END %] |
|
27 |
</table> |
|
28 |
|
|
29 |
<p> |
|
30 |
[% L.hidden_tag("action", "PartsGroup/dispatch") %] |
|
31 |
[% L.submit_tag("action_" _ (SELF.partsgroup.id ? "update" : "create"), LxERP.t8('Save'), onclick="return check_prerequisites();") %] |
|
32 |
[%- IF SELF.partsgroup.id AND SELF.partsgroup.orphaned -%] |
|
33 |
[% L.submit_tag("action_delete", LxERP.t8('Delete')) %] |
|
34 |
[%- END %] |
|
35 |
<a href="[% SELF.url_for(action='list') %]">[%- LxERP.t8("Cancel") %]</a> |
|
36 |
</p> |
|
37 |
|
|
38 |
<hr> |
|
39 |
|
|
40 |
<script type="text/javascript"> |
|
41 |
<!-- |
|
42 |
function check_prerequisites() { |
|
43 |
if ($('#partsgroup_partsgroup').val() === "") { |
|
44 |
alert(kivi.t8('The description is missing.')); |
|
45 |
return false; |
|
46 |
} |
|
47 |
return true; |
|
48 |
} |
|
49 |
--> |
|
50 |
</script> |
templates/webpages/partsgroup/list.html | ||
---|---|---|
1 |
[%- USE HTML -%][%- USE LxERP -%][%- USE L -%][%- USE T8 -%][%- INCLUDE 'common/flash.html' %] |
|
2 |
|
|
3 |
<h1>[% title %]</h1> |
|
4 |
|
|
5 |
<p> |
|
6 |
<table width="100%" id="partsgroup_list"> |
|
7 |
<thead> |
|
8 |
<tr class="listheading"> |
|
9 |
<th align="center" width="1%"><img src="image/updown.png" alt="[ LxERP.t8('reorder item') %]"></th> |
|
10 |
<th>[% 'Description' | $T8 %]</th> |
|
11 |
<th>[% 'Obsolete' | $T8 %]</th> |
|
12 |
</tr> |
|
13 |
</thead> |
|
14 |
|
|
15 |
<tbody> |
|
16 |
[%- FOREACH partsgroup = SELF.all_partsgroups %] |
|
17 |
<tr class="listrow" id="partsgroup_id_[% partsgroup.id %]"> |
|
18 |
<td align="center" class="dragdrop"><img src="image/updown.png" alt="[ LxERP.t8('reorder item') %]"></td> |
|
19 |
<td><a href="[% SELF.url_for(action='edit', id=partsgroup.id) %]">[% HTML.escape(partsgroup.partsgroup) %]</a></td> |
|
20 |
<td>[% HTML.escape(partsgroup.obsolete) %]</a></td> |
|
21 |
</tr> |
|
22 |
[%- END %] |
|
23 |
</tbody> |
|
24 |
</table> |
|
25 |
</p> |
|
26 |
|
|
27 |
<hr height="3"> |
|
28 |
|
|
29 |
[% L.sortable_element('#partsgroup_list tbody', url=SELF.url_for(action='reorder'), with='partsgroup_id') %] |
|
30 |
|
|
31 |
<p> |
|
32 |
<a href="[% SELF.url_for(action='new') %]">[%- 'Add' | $T8 %]</a> |
|
33 |
</p> |
templates/webpages/simple_system_setting/_parts_group_form.html | ||
---|---|---|
1 |
[%- USE LxERP -%][%- USE L -%] |
|
2 |
<table> |
|
3 |
<tr> |
|
4 |
<th align="right">[% LxERP.t8("Description") %]</th> |
|
5 |
<td> |
|
6 |
[%- L.input_tag("object.partsgroup", SELF.object.partsgroup, "data-validate"="required", "data-title"=LxERP.t8("Description")) %] |
|
7 |
</td> |
|
8 |
</tr> |
|
9 |
<tr> |
|
10 |
<th align="right">[% LxERP.t8("Obsolete") %]</th> |
|
11 |
<td>[% L.checkbox_tag("object.obsolete", checked=SELF.object.obsolete, for_submit=1) %]</td> |
|
12 |
</tr> |
|
13 |
</table> |
Auch abrufbar als: Unified diff
SimpleSystemSetting: Umstellung von »Warengruppen«