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