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