Mappings: Direktzugriff auf package names Methode
[kivitendo-erp.git] / SL / DB / Helper / Mappings.pm
1 package SL::DB::Helper::Mappings;
2
3 use utf8;
4 use strict;
5
6 use SL::Util qw(camelify);
7
8 require Exporter;
9 our @ISA       = qw(Exporter);
10 our @EXPORT_OK = qw(get_table_for_package get_package_for_table get_package_names);
11
12 # these will not be managed as Rose::DB models, because they are not normalized,
13 # significant changes are needed to get them done, or they were done by CRM.
14 my @kivitendo_blacklist_permanent = qw(
15   leads
16 );
17
18 # these are not managed _yet_, but will hopefully at some point.
19 # if you are confident that one of these works, remove it here.
20 my @kivitendo_blacklist_temp = qw(
21 );
22
23 # tables created by crm module
24 my @crm_blacklist = qw(
25   blz_data
26   bundesland
27   contmasch
28   contract
29   crm
30   crmdefaults
31   crmemployee
32   custmsg
33   docfelder
34   documents
35   documenttotc
36   docvorlage
37   extra_felder
38   geodb_changelog
39   geodb_coordinates
40   geodb_floatdata
41   geodb_hierarchies
42   geodb_intdata
43   geodb_locations
44   geodb_textdata
45   geodb_type_names
46   grpusr
47   gruppenname
48   history
49   labels
50   labeltxt
51   mailvorlage
52   maschine
53   maschmat
54   opport_status
55   opportunity
56   postit
57   repauftrag
58   telcall
59   telcallhistory
60   telnr
61   tempcsvdata
62   termdate
63   termincat
64   termine
65   terminmember
66   timetrack
67   tt_event
68   tt_parts
69   wiedervorlage
70   wissencategorie
71   wissencontent
72 );
73
74 # tables created by cash register
75 my @cash_register_blacklist = qw(
76 ekartikel ekbon ekkunde ektext erptasten
77 );
78
79 my @kivitendo_blacklist = (@kivitendo_blacklist_permanent, @kivitendo_blacklist_temp, @crm_blacklist, @cash_register_blacklist);
80
81 # map table names to their models.
82 # unlike rails we have no singular<->plural magic.
83 # remeber: tables should be named as the plural of the model name.
84 my %kivitendo_package_names = (
85   # TABLE                           # MODEL (given in C style)
86   acc_trans                      => 'acc_transaction',
87   'auth.clients'                 => 'auth_client',
88   'auth.clients_users'           => 'auth_client_user',
89   'auth.clients_groups'          => 'auth_client_group',
90   'auth.group'                   => 'auth_group',
91   'auth.group_rights'            => 'auth_group_right',
92   'auth.user'                    => 'auth_user',
93   'auth.user_config'             => 'auth_user_config',
94   'auth.user_group'              => 'auth_user_group',
95   ar                             => 'invoice',
96   ap                             => 'purchase_invoice',
97   assembly                       => 'assembly',
98   background_jobs                => 'background_job',
99   background_job_histories       => 'background_job_history',
100   ap                             => 'purchase_invoice',
101   bank_accounts                  => 'bank_account',
102   bank_transactions              => 'bank_transaction',
103   buchungsgruppen                => 'buchungsgruppe',
104   bin                            => 'bin',
105   business                       => 'business',
106   chart                          => 'chart',
107   contacts                       => 'contact',
108   customer                       => 'customer',
109   csv_import_profiles            => 'csv_import_profile',
110   csv_import_profile_settings    => 'csv_import_profile_setting',
111   csv_import_reports             => 'csv_import_report',
112   csv_import_report_rows         => 'csv_import_report_row',
113   csv_import_report_status       => 'csv_import_report_status',
114   currencies                     => 'currency',
115   custom_variable_config_partsgroups => 'custom_variable_config_partsgroup',
116   custom_variable_configs        => 'custom_variable_config',
117   custom_variables               => 'custom_variable',
118   custom_variables_validity      => 'custom_variable_validity',
119   datev                          => 'datev',
120   defaults                       => 'default',
121   delivery_orders                => 'delivery_order',
122   delivery_order_items           => 'delivery_order_item',
123   delivery_order_items_stock     => 'delivery_order_items_stock',
124   delivery_terms                 => 'delivery_term',
125   department                     => 'department',
126   drafts                         => 'draft',
127   dunning                        => 'dunning',
128   dunning_config                 => 'dunning_config',
129   employee                       => 'employee',
130   exchangerate                   => 'exchangerate',
131   finanzamt                      => 'finanzamt',
132   follow_up_access               => 'follow_up_access',
133   follow_up_links                => 'follow_up_link',
134   follow_ups                     => 'follow_up',
135   generic_translations           => 'generic_translation',
136   gl                             => 'GLTransaction',
137   history_erp                    => 'history',
138   inventory                      => 'inventory',
139   invoice                        => 'invoice_item',
140   language                       => 'language',
141   letter                         => 'letter',
142   letter_draft                   => 'letter_draft',
143   makemodel                      => 'make_model',
144   notes                          => 'note',
145   orderitems                     => 'order_item',
146   oe                             => 'order',
147   parts                          => 'part',
148   partsgroup                     => 'parts_group',
149   payment_terms                  => 'payment_term',
150   periodic_invoices              => 'periodic_invoice',
151   periodic_invoices_configs      => 'periodic_invoices_config',
152   prices                         => 'price',
153   price_factors                  => 'price_factor',
154   price_rules                    => 'price_rule',
155   price_rule_items               => 'price_rule_item',
156   pricegroup                     => 'pricegroup',
157   printers                       => 'printer',
158   project                        => 'project',
159   project_participants           => 'project_participant',
160   project_phase_participants     => 'project_phase_participant',
161   project_phases                 => 'project_phase',
162   project_roles                  => 'project_role',
163   project_statuses               => 'project_status',
164   project_types                  => 'project_type',
165   record_links                   => 'record_link',
166   reconciliation_links           => 'reconciliation_link',
167   requirement_spec_acceptance_statuses => 'RequirementSpecAcceptanceStatus',
168   requirement_spec_complexities        => 'RequirementSpecComplexity',
169   requirement_spec_item_dependencies   => 'RequirementSpecDependency',
170   requirement_spec_items               => 'RequirementSpecItem',
171   requirement_spec_orders              => 'RequirementSpecOrder',
172   requirement_spec_parts               => 'RequirementSpecPart',
173   requirement_spec_pictures            => 'RequirementSpecPicture',
174   requirement_spec_predefined_texts    => 'RequirementSpecPredefinedText',
175   requirement_spec_risks               => 'RequirementSpecRisk',
176   requirement_spec_statuses            => 'RequirementSpecStatus',
177   requirement_spec_text_blocks         => 'RequirementSpecTextBlock',
178   requirement_spec_types               => 'RequirementSpecType',
179   requirement_spec_versions            => 'RequirementSpecVersion',
180   requirement_specs                    => 'RequirementSpec',
181   sepa_export                    => 'sepa_export',
182   sepa_export_items              => 'sepa_export_item',
183   schema_info                    => 'schema_info',
184   shipto                         => 'shipto',
185   status                         => 'status',
186   tax                            => 'tax',
187   taxkeys                        => 'tax_key',
188   tax_zones                      => 'tax_zone',
189   taxzone_charts                 => 'taxzone_chart',
190   todo_user_config               => 'todo_user_config',
191   transfer_type                  => 'transfer_type',
192   translation                    => 'translation',
193   trigger_information            => 'trigger_information',
194   units                          => 'unit',
195   units_language                 => 'units_language',
196   vendor                         => 'vendor',
197   warehouse                      => 'warehouse',
198 );
199
200 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
201
202 sub get_blacklist {
203   return KIVITENDO => \@kivitendo_blacklist;
204 }
205
206 sub get_package_names {
207   return KIVITENDO => \%kivitendo_package_names;
208 }
209
210 sub get_name_for_table {
211   return $kivitendo_package_names{ $_[0] };
212 }
213
214 sub get_package_for_table {
215   %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
216     unless %kivitendo_tables_to_packages;
217
218   return $kivitendo_tables_to_packages{ $_[0] };
219 }
220
221 sub get_manager_package_for_table {
222   %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
223     unless %kivitendo_tables_to_manager_packages;
224
225   return $kivitendo_tables_to_manager_packages{ $_[0] };
226 }
227
228 sub get_table_for_package {
229   get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
230   %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
231
232   my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
233   return $kivitendo_packages_to_tables{ $package };
234 }
235
236 sub db {
237   my $string = $_[0];
238   my $lookup = $kivitendo_package_names{$_[0]} ||
239       plurify($kivitendo_package_names{singlify($_[0])});
240
241   for my $thing ($string, $lookup) {
242
243     # best guess? its already the name. like part. camelize it first
244     my $class = "SL::DB::" . camelify($thing);
245     return $class if defined *{ $class. '::' };
246
247     # next, someone wants a manager and pluralized.
248     my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
249     return $manager if defined *{ $manager . '::' };
250   }
251
252   die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
253 }
254
255 sub plurify {
256   my ($str) = @_;
257   $str . 's';
258 }
259
260 sub singlify {
261   my ($str) = @_;
262   local $/ = 's';
263   chomp $str;
264   $str;
265 }
266
267 1;
268
269 __END__
270
271 =encoding utf8
272
273 =head1 NAME
274
275 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
276
277 =head1 SYNOPSIS
278
279   use SL::DB::Helper::Mappings qw(@blacklist %table2model);
280
281 =head1 DESCRIPTION
282
283 This modul stores table <-> model mappings used by the
284 L<scripts/rose_auto_create_model.pl> script.  If you add a new table that has
285 custom mappings, add it here.
286
287 =head1 FUNCTIONS
288
289 =over 4
290
291 =item C<db $name>
292
293 A special function provided here is C<db>. Without it you'd have to write:
294
295   my $part = SL::DB::Part->new(id => 1234);
296   my @all_parts = SL::DB::Manager::Part->get_all;
297
298 with them it becomes:
299
300   my $part = db('part')->new(id => 123);
301   my @all_parts = db('parts')->get_all;
302
303 You don't have to care about add that SL::DB:: incantation anymore. Also, a
304 simple s at the end will get you the associated Manager class.
305
306 db is written to try to make sense of what you give it, but if all fails, it
307 will die with an error.
308
309 =item C<get_package_for_table $table_name>
310
311 Returns the package name for a table name:
312
313   SL::DB::Helper::Mappings::get_package_for_table('oe')
314   # SL::DB::Order
315
316 =item C<get_manager_package_for_table $table_name>
317
318 Returns the manager package name for a table name:
319
320   SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
321   # SL::DB::Manager::Order
322
323 =item C<get_table_for_package $package_name>
324
325 Returns the table name for a package name:
326
327   SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
328   # oe
329   SL::DB::Helper::Mappings::get_table_for_package('Order')
330   # oe
331
332 =back
333
334 =head1 BUGS
335
336 nothing yet
337
338 =head1 SEE ALSO
339
340 L<scripts/rose_auto_create_model.pl>
341
342 =head1 AUTHOR
343
344 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
345 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
346
347 =cut