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