Reverts 01f650056
[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_recording_articles        => 'time_recording_article',
218   time_recordings                => 'time_recording',
219   todo_user_config               => 'todo_user_config',
220   transfer_type                  => 'transfer_type',
221   translation                    => 'translation',
222   trigger_information            => 'trigger_information',
223   units                          => 'unit',
224   units_language                 => 'units_language',
225   user_preferences               => 'user_preference',
226   vendor                         => 'vendor',
227   warehouse                      => 'warehouse',
228 );
229
230 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
231
232 sub get_blacklist {
233   return KIVITENDO => \@kivitendo_blacklist;
234 }
235
236 sub get_package_names {
237   return KIVITENDO => \%kivitendo_package_names;
238 }
239
240 sub get_name_for_table {
241   return $kivitendo_package_names{ $_[0] };
242 }
243
244 sub get_package_for_table {
245   %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
246     unless %kivitendo_tables_to_packages;
247
248   return $kivitendo_tables_to_packages{ $_[0] };
249 }
250
251 sub get_manager_package_for_table {
252   %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
253     unless %kivitendo_tables_to_manager_packages;
254
255   return $kivitendo_tables_to_manager_packages{ $_[0] };
256 }
257
258 sub get_table_for_package {
259   get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
260   %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
261
262   my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
263   return $kivitendo_packages_to_tables{ $package };
264 }
265
266 sub db {
267   my $string = $_[0];
268   my $lookup = $kivitendo_package_names{$_[0]} ||
269       plurify($kivitendo_package_names{singlify($_[0])});
270
271   for my $thing ($string, $lookup) {
272
273     # best guess? its already the name. like part. camelize it first
274     my $class = "SL::DB::" . camelify($thing);
275     return $class if defined *{ $class. '::' };
276
277     # next, someone wants a manager and pluralized.
278     my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
279     return $manager if defined *{ $manager . '::' };
280   }
281
282   die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
283 }
284
285 sub plurify {
286   my ($str) = @_;
287   $str . 's';
288 }
289
290 sub singlify {
291   my ($str) = @_;
292   local $/ = 's';
293   chomp $str;
294   $str;
295 }
296
297 1;
298
299 __END__
300
301 =encoding utf8
302
303 =head1 NAME
304
305 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
306
307 =head1 SYNOPSIS
308
309   use SL::DB::Helper::Mappings qw(@blacklist %table2model);
310
311 =head1 DESCRIPTION
312
313 This modul stores table <-> model mappings used by the
314 L<scripts/rose_auto_create_model.pl> script.  If you add a new table that has
315 custom mappings, add it here.
316
317 =head1 FUNCTIONS
318
319 =over 4
320
321 =item C<db $name>
322
323 A special function provided here is C<db>. Without it you'd have to write:
324
325   my $part = SL::DB::Part->new(id => 1234);
326   my @all_parts = SL::DB::Manager::Part->get_all;
327
328 with them it becomes:
329
330   my $part = db('part')->new(id => 123);
331   my @all_parts = db('parts')->get_all;
332
333 You don't have to care about add that SL::DB:: incantation anymore. Also, a
334 simple s at the end will get you the associated Manager class.
335
336 db is written to try to make sense of what you give it, but if all fails, it
337 will die with an error.
338
339 =item C<get_package_for_table $table_name>
340
341 Returns the package name for a table name:
342
343   SL::DB::Helper::Mappings::get_package_for_table('oe')
344   # SL::DB::Order
345
346 =item C<get_manager_package_for_table $table_name>
347
348 Returns the manager package name for a table name:
349
350   SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
351   # SL::DB::Manager::Order
352
353 =item C<get_table_for_package $package_name>
354
355 Returns the table name for a package name:
356
357   SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
358   # oe
359   SL::DB::Helper::Mappings::get_table_for_package('Order')
360   # oe
361
362 =back
363
364 =head1 BUGS
365
366 nothing yet
367
368 =head1 SEE ALSO
369
370 L<scripts/rose_auto_create_model.pl>
371
372 =head1 AUTHOR
373
374 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
375 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
376
377 =cut