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