SL::Dev::Part - create_assembly und create_assortment überarbeitet
[kivitendo-erp.git] / SL / Dev / Part.pm
1 package SL::Dev::Part;
2
3 use strict;
4 use base qw(Exporter);
5 our @EXPORT = qw(create_part create_service create_assembly create_assortment);
6
7 use SL::DB::Part;
8 use SL::DB::Unit;
9 use SL::DB::Buchungsgruppe;
10
11 sub create_part {
12   my (%params) = @_;
13
14   my $part = SL::DB::Part->new_part(
15     description        => 'Test part',
16     sellprice          => '10',
17     lastcost           => '5',
18     buchungsgruppen_id => _default_buchungsgruppe()->id,
19     unit               => _default_unit()->name
20   );
21   $part->assign_attributes( %params );
22   return $part;
23 }
24
25 sub create_service {
26   my (%params) = @_;
27
28   my $part = SL::DB::Part->new_service(
29     description        => 'Test service',
30     sellprice          => '10',
31     lastcost           => '5',
32     buchungsgruppen_id => _default_buchungsgruppe()->id,
33     unit               => _default_unit()->name
34   );
35   $part->assign_attributes( %params );
36   return $part;
37 }
38
39 sub create_assembly {
40   my (%params) = @_;
41
42   my $assnumber       = delete $params{assnumber};
43   my $base_partnumber = delete $params{partnumber} || 'ap';
44
45   my $assembly_items = [];
46
47   if ( $params{assembly_items} ) {
48     $assembly_items = delete $params{assembly_items};
49   } else {
50     for my $i ( 1 .. delete $params{number_of_parts} || 3) {
51       my $part = SL::Dev::Part::create_part(partnumber  => "$base_partnumber $i",
52                                             description => "Testpart $i",
53                                            )->save;
54       push( @{$assembly_items}, SL::DB::Assembly->new(parts_id => $part->id,
55                                                       qty      => 1,
56                                                       position => $i,
57                                                      ));
58     }
59   }
60
61   my $assembly = SL::DB::Part->new_assembly(
62     partnumber         => $assnumber,
63     description        => 'Test Assembly',
64     sellprice          => '10',
65     lastcost           => '5',
66     assemblies         => $assembly_items,
67     buchungsgruppen_id => _default_buchungsgruppe()->id,
68     unit               => _default_unit()->name
69   );
70   $assembly->assign_attributes( %params );
71   return $assembly;
72 }
73
74 sub create_assortment {
75   my (%params) = @_;
76
77   my $assnumber       = delete $params{assnumber};
78   my $base_partnumber = delete $params{partnumber} || 'ap';
79
80   my $assortment_items = [];
81
82   if ( $params{assortment_items} ) {
83     $assortment_items = delete $params{assortment_items};
84   } else {
85     for my $i ( 1 .. delete $params{number_of_parts} || 3) {
86       my $part = SL::Dev::Part::create_part(partnumber  => "$base_partnumber $i",
87                                             description => "Testpart $i",
88                                            )->save;
89       push( @{$assortment_items}, SL::DB::AssortmentItem->new(parts_id => $part->id,
90                                                               qty      => 1,
91                                                               position => $i,
92                                                               unit     => $part->unit,
93                                                              ));
94     }
95   }
96
97   my $assortment = SL::DB::Part->new_assortment(
98     partnumber         => $assnumber,
99     description        => 'Test Assortment',
100     sellprice          => '10',
101     lastcost           => '5',
102     assortment_items   => $assortment_items,
103     buchungsgruppen_id => _default_buchungsgruppe()->id,
104     unit               => _default_unit()->name
105   );
106
107   $assortment->assign_attributes( %params );
108   return $assortment;
109 }
110
111
112 sub _default_buchungsgruppe {
113   return SL::DB::Manager::Buchungsgruppe->find_by(description => 'Standard 19%') || die "No accounting group";
114 }
115
116 sub _default_unit {
117   return SL::DB::Manager::Unit->find_by(name => 'Stck') || die "No unit";
118 }
119
120
121 1;
122
123 __END__
124
125 =head1 NAME
126
127 SL::Dev::Part - create part objects for testing, with minimal defaults
128
129 =head1 FUNCTIONS
130
131 =head2 C<create_part %PARAMS>
132
133 Creates a new part (part_type = part).
134
135 Minimal usage, default values, without saving to database:
136
137   my $part = SL::Dev::Part::create_part();
138
139 Create a test part with a default warehouse and bin and save it:
140
141   my $wh    = SL::Dev::Inventory::create_warehouse_and_bins()->save;
142   my $part1 = SL::Dev::Part::create_part(partnumber   => 'a123',
143                                          description  => 'Testpart 1',
144                                          warehouse_id => $wh->id,
145                                          bin_id       => $wh->bins->[0]->id,
146                                         )->save;
147
148 =head2 C<create_service %PARAMS>
149
150 Creates a new service (part_type = service).
151
152 Minimal usage, default values, without saving to database:
153
154   my $part = SL::Dev::Part::create_service();
155
156 =head2 C<create_assembly %PARAMS>
157
158 Create a new assembly (part_type = assembly).
159
160 Params: assnumber:  the partnumber of the assembly
161         partnumber: the partnumber of the first assembly part to be created
162
163 By default 3 parts (p1, p2, p3) are created and saved as an assembly (as1).
164
165   my $assembly = SL::Dev::Part::create_assembly->save;
166
167 Create a new assembly with 10 parts, the assembly gets partnumber 'Ass1' and the
168 parts get partnumbers 'Testpart 1' to 'Testpart 10':
169
170   my $assembly = SL::Dev::Part::create_assembly(number_of_parts => 10,
171                                                 partnumber      => 'Testpart',
172                                                 assnumber       => 'Ass1'
173                                                )->save;
174
175 Create an assembly with specific parts:
176   my $assembly_item_1 = SL::DB::Assembly->new( parts_id => $part1->id, qty => 3, position => 1);
177   my $assembly_item_2 = SL::DB::Assembly->new( parts_id => $part2->id, qty => 3, position => 2);
178   my $assembly_part   = SL::Dev::Part::create_assembly( assnumber      => 'Assembly 1',
179                                                         description    => 'Assembly test',
180                                                         sellprice      => $part1->sellprice + $part2->sellprice,
181                                                         assembly_items => [ $assembly_item_1, $assembly_item_2 ],
182                                                       )->save;
183
184 =head2 C<create_assortment %PARAMS>
185
186 Create a new assortment (part_type = assortment).
187
188 By default 3 parts (p1, p2, p3) are created and saved as an assortment.
189
190   my $assortment = SL::Dev::Part::create_assortment->save;
191
192 Create a new assortment with 10 automatically created parts using the
193 number_of_parts param:
194
195   my $assortment = SL::Dev::Part::create_assortment(number_of_parts => 10)->save;
196
197 Create an assortment with a certain name and pass some assortment_item Objects
198 from newly created parts:
199
200   my $part1             = SL::Dev::Part::create_part( sellprice => '7.77')->save;
201   my $part2             = SL::Dev::Part::create_part( sellprice => '6.66')->save;
202   my $assortment_item_1 = SL::DB::AssortmentItem->new( parts_id => $part1->id, qty => 3, unit => $part1->unit, position => 1);
203   my $assortment_item_2 = SL::DB::AssortmentItem->new( parts_id => $part2->id, qty => 3, unit => $part2->unit, position => 2);
204   my $assortment_part   = SL::Dev::Part::create_assortment( assnumber        => 'Assortment 1',
205                                                             description      => 'assortment test',
206                                                             sellprice        => (3*$part1->sellprice + 3*$part2->sellprice),
207                                                             lastcost         => (3*$part1->lastcost  + 3*$part2->lastcost),
208                                                             assortment_items => [ $assortment_item_1, $assortment_item_2 ],
209                                                           )->save;
210
211 =head1 TODO
212
213 Nothing here yet.
214
215 =head1 BUGS
216
217 Nothing here yet.
218
219 =head1 AUTHOR
220
221 G. Richardson E<lt>grichardson@kivitendo-premium.deE<gt>
222
223 =cut