1 package SL::DB::Helper::Mappings;
6 use SL::Util qw(camelify);
9 our @ISA = qw(Exporter);
10 our @EXPORT_OK = qw(get_table_for_package get_package_for_table get_package_names);
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(
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(
23 # tables created by crm module
24 my @crm_blacklist = qw(
74 # tables created by cash register
75 my @cash_register_blacklist = qw(
76 ekartikel ekbon ekkunde ektext erptasten
79 my @kivitendo_blacklist = (@kivitendo_blacklist_permanent, @kivitendo_blacklist_temp, @crm_blacklist, @cash_register_blacklist);
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',
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',
104 business => 'business',
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',
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',
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',
142 orderitems => 'order_item',
145 partsgroup => 'parts_group',
146 payment_terms => 'payment_term',
147 periodic_invoices => 'periodic_invoice',
148 periodic_invoices_configs => 'periodic_invoices_config',
150 price_factors => 'price_factor',
151 price_rules => 'price_rule',
152 price_rule_items => 'price_rule_item',
153 pricegroup => 'pricegroup',
154 printers => 'printer',
155 project => 'project',
156 project_participants => 'project_participant',
157 project_phase_participants => 'project_phase_participant',
158 project_phases => 'project_phase',
159 project_roles => 'project_role',
160 project_statuses => 'project_status',
161 project_types => 'project_type',
162 record_links => 'record_link',
163 requirement_spec_acceptance_statuses => 'RequirementSpecAcceptanceStatus',
164 requirement_spec_complexities => 'RequirementSpecComplexity',
165 requirement_spec_item_dependencies => 'RequirementSpecDependency',
166 requirement_spec_items => 'RequirementSpecItem',
167 requirement_spec_orders => 'RequirementSpecOrder',
168 requirement_spec_parts => 'RequirementSpecPart',
169 requirement_spec_pictures => 'RequirementSpecPicture',
170 requirement_spec_predefined_texts => 'RequirementSpecPredefinedText',
171 requirement_spec_risks => 'RequirementSpecRisk',
172 requirement_spec_statuses => 'RequirementSpecStatus',
173 requirement_spec_text_blocks => 'RequirementSpecTextBlock',
174 requirement_spec_types => 'RequirementSpecType',
175 requirement_spec_versions => 'RequirementSpecVersion',
176 requirement_specs => 'RequirementSpec',
177 sepa_export => 'sepa_export',
178 sepa_export_items => 'sepa_export_item',
179 schema_info => 'schema_info',
183 taxkeys => 'tax_key',
184 tax_zones => 'tax_zone',
185 taxzone_charts => 'taxzone_chart',
186 todo_user_config => 'todo_user_config',
187 transfer_type => 'transfer_type',
188 translation => 'translation',
189 trigger_information => 'trigger_information',
191 units_language => 'units_language',
193 warehouse => 'warehouse',
196 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
199 return KIVITENDO => \@kivitendo_blacklist;
202 sub get_package_names {
203 return KIVITENDO => \%kivitendo_package_names;
206 sub get_package_for_table {
207 %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
208 unless %kivitendo_tables_to_packages;
210 return $kivitendo_tables_to_packages{ $_[0] };
213 sub get_manager_package_for_table {
214 %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
215 unless %kivitendo_tables_to_manager_packages;
217 return $kivitendo_tables_to_manager_packages{ $_[0] };
220 sub get_table_for_package {
221 get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
222 %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
224 my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
225 return $kivitendo_packages_to_tables{ $package };
230 my $lookup = $kivitendo_package_names{$_[0]} ||
231 plurify($kivitendo_package_names{singlify($_[0])});
233 for my $thing ($string, $lookup) {
235 # best guess? its already the name. like part. camelize it first
236 my $class = "SL::DB::" . camelify($thing);
237 return $class if defined *{ $class. '::' };
239 # next, someone wants a manager and pluralized.
240 my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
241 return $manager if defined *{ $manager . '::' };
244 die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
267 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
271 use SL::DB::Helper::Mappings qw(@blacklist %table2model);
275 This modul stores table <-> model mappings used by the
276 L<scripts/rose_auto_create_model.pl> script. If you add a new table that has
277 custom mappings, add it here.
285 A special function provided here is C<db>. Without it you'd have to write:
287 my $part = SL::DB::Part->new(id => 1234);
288 my @all_parts = SL::DB::Manager::Part->get_all;
290 with them it becomes:
292 my $part = db('part')->new(id => 123);
293 my @all_parts = db('parts')->get_all;
295 You don't have to care about add that SL::DB:: incantation anymore. Also, a
296 simple s at the end will get you the associated Manager class.
298 db is written to try to make sense of what you give it, but if all fails, it
299 will die with an error.
301 =item C<get_package_for_table $table_name>
303 Returns the package name for a table name:
305 SL::DB::Helper::Mappings::get_package_for_table('oe')
308 =item C<get_manager_package_for_table $table_name>
310 Returns the manager package name for a table name:
312 SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
313 # SL::DB::Manager::Order
315 =item C<get_table_for_package $package_name>
317 Returns the table name for a package name:
319 SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
321 SL::DB::Helper::Mappings::get_table_for_package('Order')
332 L<scripts/rose_auto_create_model.pl>
336 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
337 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>