Nicht mehr benötigte MetaSetups löschen: DptTrans, TranslationPaymentTerm
[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 );
26
27 # tables created by cash register
28 my @cash_register_blacklist = qw(
29 ekartikel ekbon ekkunde ektext erptasten
30 );
31
32 my @kivitendo_blacklist = (@kivitendo_blacklist_permanent, @kivitendo_blacklist_temp, @crm_blacklist, @cash_register_blacklist);
33
34 # map table names to their models.
35 # unlike rails we have no singular<->plural magic.
36 # remeber: tables should be named as the plural of the model name.
37 my %kivitendo_package_names = (
38   # TABLE                           # MODEL (given in C style)
39   acc_trans                      => 'acc_transaction',
40   audittrail                     => 'audit_trail',
41   'auth.clients'                 => 'auth_client',
42   'auth.clients_users'           => 'auth_client_user',
43   'auth.clients_groups'          => 'auth_client_group',
44   'auth.group'                   => 'auth_group',
45   'auth.group_rights'            => 'auth_group_right',
46   'auth.user'                    => 'auth_user',
47   'auth.user_config'             => 'auth_user_config',
48   'auth.user_group'              => 'auth_user_group',
49   ar                             => 'invoice',
50   ap                             => 'purchase_invoice',
51   background_jobs                => 'background_job',
52   background_job_histories       => 'background_job_history',
53   ap                             => 'purchase_invoice',
54   bank_accounts                  => 'bank_account',
55   buchungsgruppen                => 'buchungsgruppe',
56   contacts                       => 'contact',
57   csv_import_profiles            => 'csv_import_profile',
58   csv_import_profile_settings    => 'csv_import_profile_setting',
59   csv_import_reports             => 'csv_import_report',
60   csv_import_report_rows         => 'csv_import_report_row',
61   csv_import_report_status       => 'csv_import_report_status',
62   currencies                     => 'currency',
63   custom_variable_configs        => 'custom_variable_config',
64   custom_variables               => 'custom_variable',
65   custom_variables_validity      => 'custom_variable_validity',
66   datev                          => 'datev',
67   defaults                       => 'default',
68   delivery_orders                => 'delivery_order',
69   delivery_order_items           => 'delivery_order_item',
70   department                     => 'department',
71   drafts                         => 'draft',
72   dunning                        => 'dunning',
73   dunning_config                 => 'dunning_config',
74   employee                       => 'employee',
75   exchangerate                   => 'exchangerate',
76   finanzamt                      => 'finanzamt',
77   follow_up_access               => 'follow_up_access',
78   follow_up_links                => 'follow_up_link',
79   follow_ups                     => 'follow_up',
80   generic_translations           => 'generic_translation',
81   gl                             => 'GLTransaction',
82   history_erp                    => 'history',
83   inventory                      => 'inventory',
84   invoice                        => 'invoice_item',
85   language                       => 'language',
86   makemodel                      => 'make_model',
87   notes                          => 'note',
88   orderitems                     => 'order_item',
89   oe                             => 'order',
90   parts                          => 'part',
91   partsgroup                     => 'parts_group',
92   payment_terms                  => 'payment_term',
93   periodic_invoices              => 'periodic_invoice',
94   periodic_invoices_configs      => 'periodic_invoices_config',
95   prices                         => 'price',
96   price_factors                  => 'price_factor',
97   pricegroup                     => 'pricegroup',
98   printers                       => 'Printer',
99   record_links                   => 'record_link',
100   sepa_export                    => 'sepa_export',
101   sepa_export_items              => 'sepa_export_item',
102   schema_info                    => 'schema_info',
103   status                         => 'status',
104   tax                            => 'tax',
105   taxkeys                        => 'tax_key',
106   tax_zones                      => 'tax_zone',
107   todo_user_config               => 'todo_user_config',
108   translation                    => 'translation',
109   units                          => 'unit',
110   units_language                 => 'units_language',
111   vendor                         => 'vendor',
112 );
113
114 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
115
116 sub get_blacklist {
117   return KIVITENDO => \@kivitendo_blacklist;
118 }
119
120 sub get_package_names {
121   return KIVITENDO => \%kivitendo_package_names;
122 }
123
124 sub get_package_for_table {
125   %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
126     unless %kivitendo_tables_to_packages;
127
128   return $kivitendo_tables_to_packages{ $_[0] };
129 }
130
131 sub get_manager_package_for_table {
132   %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
133     unless %kivitendo_tables_to_manager_packages;
134
135   return $kivitendo_tables_to_manager_packages{ $_[0] };
136 }
137
138 sub get_table_for_package {
139   get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
140   %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
141
142   my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
143   return $kivitendo_packages_to_tables{ $package };
144 }
145
146 sub db {
147   my $string = $_[0];
148   my $lookup = $kivitendo_package_names{$_[0]} ||
149       plurify($kivitendo_package_names{singlify($_[0])});
150
151   for my $thing ($string, $lookup) {
152
153     # best guess? its already the name. like part. camelize it first
154     my $class = "SL::DB::" . camelify($thing);
155     return $class if defined *{ $class. '::' };
156
157     # next, someone wants a manager and pluralized.
158     my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
159     return $manager if defined *{ $manager . '::' };
160   }
161
162   die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
163 }
164
165 sub plurify {
166   my ($str) = @_;
167   $str . 's';
168 }
169
170 sub singlify {
171   my ($str) = @_;
172   local $/ = 's';
173   chomp $str;
174   $str;
175 }
176
177 1;
178
179 __END__
180
181 =encoding utf8
182
183 =head1 NAME
184
185 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
186
187 =head1 SYNOPSIS
188
189   use SL::DB::Helper::Mappings qw(@blacklist %table2model);
190
191 =head1 DESCRIPTION
192
193 This modul stores table <-> model mappings used by the
194 L<scripts/rose_auto_create_model.pl> script.  If you add a new table that has
195 custom mappings, add it here.
196
197 =head1 FUNCTIONS
198
199 =over 4
200
201 =item C<db $name>
202
203 A special function provided here is C<db>. Without it you'd have to write:
204
205   my $part = SL::DB::Part->new(id => 1234);
206   my @all_parts = SL::DB::Manager::Part->get_all;
207
208 with them it becomes:
209
210   my $part = db('part')->new(id => 123);
211   my @all_parts = db('parts')->get_all;
212
213 You don't have to care about add that SL::DB:: incantation anymore. Also, a
214 simple s at the end will get you the associated Manager class.
215
216 db is written to try to make sense of what you give it, but if all fails, it
217 will die with an error.
218
219 =item C<get_package_for_table $table_name>
220
221 Returns the package name for a table name:
222
223   SL::DB::Helper::Mappings::get_package_for_table('oe')
224   # SL::DB::Order
225
226 =item C<get_manager_package_for_table $table_name>
227
228 Returns the manager package name for a table name:
229
230   SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
231   # SL::DB::Manager::Order
232
233 =item C<get_table_for_package $package_name>
234
235 Returns the table name for a package name:
236
237   SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
238   # oe
239   SL::DB::Helper::Mappings::get_table_for_package('Order')
240   # oe
241
242 =back
243
244 =head1 BUGS
245
246 nothing yet
247
248 =head1 SEE ALSO
249
250 L<scripts/rose_auto_create_model.pl>
251
252 =head1 AUTHOR
253
254 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
255 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
256
257 =cut