Anreden in eigene Tabelle: DB-Upgrade und Rose
[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.master_rights'           => 'auth_master_right',
93   'auth.schema_info'             => 'auth_schema_info',
94   'auth.session'                 => 'auth_session',
95   'auth.session_content'         => 'auth_session_content',
96   'auth.user'                    => 'auth_user',
97   'auth.user_config'             => 'auth_user_config',
98   'auth.user_group'              => 'auth_user_group',
99   ar                             => 'invoice',
100   ap                             => 'purchase_invoice',
101   assembly                       => 'assembly',
102   assortment_items               => 'assortment_item',
103   background_jobs                => 'background_job',
104   background_job_histories       => 'background_job_history',
105   ap                             => 'purchase_invoice',
106   bank_accounts                  => 'bank_account',
107   bank_transactions              => 'bank_transaction',
108   bank_transaction_acc_trans     => 'bank_transaction_acc_trans',
109   buchungsgruppen                => 'buchungsgruppe',
110   bin                            => 'bin',
111   business                       => 'business',
112   chart                          => 'chart',
113   contacts                       => 'contact',
114   customer                       => 'customer',
115   csv_import_profiles            => 'csv_import_profile',
116   csv_import_profile_settings    => 'csv_import_profile_setting',
117   csv_import_reports             => 'csv_import_report',
118   csv_import_report_rows         => 'csv_import_report_row',
119   csv_import_report_status       => 'csv_import_report_status',
120   currencies                     => 'currency',
121   custom_data_export_queries     => 'CustomDataExportQuery',
122   custom_data_export_query_parameters => 'CustomDataExportQueryParameter',
123   custom_variable_config_partsgroups => 'custom_variable_config_partsgroup',
124   custom_variable_configs        => 'custom_variable_config',
125   custom_variables               => 'custom_variable',
126   custom_variables_validity      => 'custom_variable_validity',
127   datev                          => 'datev',
128   defaults                       => 'default',
129   delivery_orders                => 'delivery_order',
130   delivery_order_items           => 'delivery_order_item',
131   delivery_order_items_stock     => 'delivery_order_items_stock',
132   delivery_terms                 => 'delivery_term',
133   department                     => 'department',
134   drafts                         => 'draft',
135   dunning                        => 'dunning',
136   dunning_config                 => 'dunning_config',
137   email_journal                  => 'EmailJournal',
138   email_journal_attachments      => 'EmailJournalAttachment',
139   employee                       => 'employee',
140   employee_project_invoices      => 'EmployeeProjectInvoices',
141   exchangerate                   => 'exchangerate',
142   files                          => 'file',
143   finanzamt                      => 'finanzamt',
144   follow_up_access               => 'follow_up_access',
145   follow_up_links                => 'follow_up_link',
146   follow_ups                     => 'follow_up',
147   generic_translations           => 'generic_translation',
148   gl                             => 'GLTransaction',
149   greetings                      => 'greeting',
150   history_erp                    => 'history',
151   inventory                      => 'inventory',
152   invoice                        => 'invoice_item',
153   language                       => 'language',
154   letter                         => 'letter',
155   letter_draft                   => 'letter_draft',
156   makemodel                      => 'make_model',
157   notes                          => 'note',
158   orderitems                     => 'order_item',
159   oe                             => 'order',
160   parts                          => 'part',
161   partsgroup                     => 'parts_group',
162   part_classifications           => 'PartClassification',
163   part_customer_prices           => 'PartCustomerPrice',
164   parts_price_history            => 'PartsPriceHistory',
165   payment_terms                  => 'payment_term',
166   periodic_invoices              => 'periodic_invoice',
167   periodic_invoices_configs      => 'periodic_invoices_config',
168   prices                         => 'price',
169   price_factors                  => 'price_factor',
170   price_rules                    => 'price_rule',
171   price_rule_items               => 'price_rule_item',
172   pricegroup                     => 'pricegroup',
173   printers                       => 'printer',
174   project                        => 'project',
175   project_participants           => 'project_participant',
176   project_phase_participants     => 'project_phase_participant',
177   project_phases                 => 'project_phase',
178   project_roles                  => 'project_role',
179   project_statuses               => 'project_status',
180   project_types                  => 'project_type',
181   reconciliation_links           => 'reconciliation_link',
182   record_links                   => 'record_link',
183   record_templates               => 'record_template',
184   record_template_items          => 'record_template_item',
185   requirement_spec_acceptance_statuses => 'RequirementSpecAcceptanceStatus',
186   requirement_spec_complexities        => 'RequirementSpecComplexity',
187   requirement_spec_item_dependencies   => 'RequirementSpecDependency',
188   requirement_spec_items               => 'RequirementSpecItem',
189   requirement_spec_orders              => 'RequirementSpecOrder',
190   requirement_spec_parts               => 'RequirementSpecPart',
191   requirement_spec_pictures            => 'RequirementSpecPicture',
192   requirement_spec_predefined_texts    => 'RequirementSpecPredefinedText',
193   requirement_spec_risks               => 'RequirementSpecRisk',
194   requirement_spec_statuses            => 'RequirementSpecStatus',
195   requirement_spec_text_blocks         => 'RequirementSpecTextBlock',
196   requirement_spec_types               => 'RequirementSpecType',
197   requirement_spec_versions            => 'RequirementSpecVersion',
198   requirement_specs                    => 'RequirementSpec',
199   sepa_export                    => 'sepa_export',
200   sepa_export_items              => 'sepa_export_item',
201   sepa_export_message_ids        => 'SepaExportMessageId',
202   schema_info                    => 'schema_info',
203   shipto                         => 'shipto',
204   shops                          => 'shop',
205   shop_images                    => 'shop_image',
206   shop_orders                    => 'shop_order',
207   shop_order_items               => 'shop_order_item',
208   shop_parts                     => 'shop_part',
209   status                         => 'status',
210   stocktakings                   => 'stocktaking',
211   tax                            => 'tax',
212   taxkeys                        => 'tax_key',
213   tax_zones                      => 'tax_zone',
214   taxzone_charts                 => 'taxzone_chart',
215   todo_user_config               => 'todo_user_config',
216   transfer_type                  => 'transfer_type',
217   translation                    => 'translation',
218   trigger_information            => 'trigger_information',
219   units                          => 'unit',
220   units_language                 => 'units_language',
221   user_preferences               => 'user_preference',
222   vendor                         => 'vendor',
223   warehouse                      => 'warehouse',
224 );
225
226 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
227
228 sub get_blacklist {
229   return KIVITENDO => \@kivitendo_blacklist;
230 }
231
232 sub get_package_names {
233   return KIVITENDO => \%kivitendo_package_names;
234 }
235
236 sub get_name_for_table {
237   return $kivitendo_package_names{ $_[0] };
238 }
239
240 sub get_package_for_table {
241   %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
242     unless %kivitendo_tables_to_packages;
243
244   return $kivitendo_tables_to_packages{ $_[0] };
245 }
246
247 sub get_manager_package_for_table {
248   %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
249     unless %kivitendo_tables_to_manager_packages;
250
251   return $kivitendo_tables_to_manager_packages{ $_[0] };
252 }
253
254 sub get_table_for_package {
255   get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
256   %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
257
258   my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
259   return $kivitendo_packages_to_tables{ $package };
260 }
261
262 sub db {
263   my $string = $_[0];
264   my $lookup = $kivitendo_package_names{$_[0]} ||
265       plurify($kivitendo_package_names{singlify($_[0])});
266
267   for my $thing ($string, $lookup) {
268
269     # best guess? its already the name. like part. camelize it first
270     my $class = "SL::DB::" . camelify($thing);
271     return $class if defined *{ $class. '::' };
272
273     # next, someone wants a manager and pluralized.
274     my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
275     return $manager if defined *{ $manager . '::' };
276   }
277
278   die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
279 }
280
281 sub plurify {
282   my ($str) = @_;
283   $str . 's';
284 }
285
286 sub singlify {
287   my ($str) = @_;
288   local $/ = 's';
289   chomp $str;
290   $str;
291 }
292
293 1;
294
295 __END__
296
297 =encoding utf8
298
299 =head1 NAME
300
301 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
302
303 =head1 SYNOPSIS
304
305   use SL::DB::Helper::Mappings qw(@blacklist %table2model);
306
307 =head1 DESCRIPTION
308
309 This modul stores table <-> model mappings used by the
310 L<scripts/rose_auto_create_model.pl> script.  If you add a new table that has
311 custom mappings, add it here.
312
313 =head1 FUNCTIONS
314
315 =over 4
316
317 =item C<db $name>
318
319 A special function provided here is C<db>. Without it you'd have to write:
320
321   my $part = SL::DB::Part->new(id => 1234);
322   my @all_parts = SL::DB::Manager::Part->get_all;
323
324 with them it becomes:
325
326   my $part = db('part')->new(id => 123);
327   my @all_parts = db('parts')->get_all;
328
329 You don't have to care about add that SL::DB:: incantation anymore. Also, a
330 simple s at the end will get you the associated Manager class.
331
332 db is written to try to make sense of what you give it, but if all fails, it
333 will die with an error.
334
335 =item C<get_package_for_table $table_name>
336
337 Returns the package name for a table name:
338
339   SL::DB::Helper::Mappings::get_package_for_table('oe')
340   # SL::DB::Order
341
342 =item C<get_manager_package_for_table $table_name>
343
344 Returns the manager package name for a table name:
345
346   SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
347   # SL::DB::Manager::Order
348
349 =item C<get_table_for_package $package_name>
350
351 Returns the table name for a package name:
352
353   SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
354   # oe
355   SL::DB::Helper::Mappings::get_table_for_package('Order')
356   # oe
357
358 =back
359
360 =head1 BUGS
361
362 nothing yet
363
364 =head1 SEE ALSO
365
366 L<scripts/rose_auto_create_model.pl>
367
368 =head1 AUTHOR
369
370 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
371 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
372
373 =cut