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