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