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.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',
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',
111 business => 'business',
113 contact_departments => 'contact_department',
114 contact_titles => 'contact_title',
115 contacts => 'contact',
116 customer => 'customer',
117 csv_import_profiles => 'csv_import_profile',
118 csv_import_profile_settings => 'csv_import_profile_setting',
119 csv_import_reports => 'csv_import_report',
120 csv_import_report_rows => 'csv_import_report_row',
121 csv_import_report_status => 'csv_import_report_status',
122 currencies => 'currency',
123 custom_data_export_queries => 'CustomDataExportQuery',
124 custom_data_export_query_parameters => 'CustomDataExportQueryParameter',
125 custom_variable_config_partsgroups => 'custom_variable_config_partsgroup',
126 custom_variable_configs => 'custom_variable_config',
127 custom_variables => 'custom_variable',
128 custom_variables_validity => 'custom_variable_validity',
130 defaults => 'default',
131 delivery_orders => 'delivery_order',
132 delivery_order_items => 'delivery_order_item',
133 delivery_order_items_stock => 'delivery_order_items_stock',
134 delivery_terms => 'delivery_term',
135 department => 'department',
137 dunning => 'dunning',
138 dunning_config => 'dunning_config',
139 email_journal => 'EmailJournal',
140 email_journal_attachments => 'EmailJournalAttachment',
141 employee => 'employee',
142 employee_project_invoices => 'EmployeeProjectInvoices',
143 exchangerate => 'exchangerate',
145 finanzamt => 'finanzamt',
146 follow_up_access => 'follow_up_access',
147 follow_up_links => 'follow_up_link',
148 follow_ups => 'follow_up',
149 generic_translations => 'generic_translation',
150 gl => 'GLTransaction',
151 greetings => 'greeting',
152 history_erp => 'history',
153 inventory => 'inventory',
154 invoice => 'invoice_item',
155 language => 'language',
157 letter_draft => 'letter_draft',
158 makemodel => 'make_model',
160 orderitems => 'order_item',
163 partsgroup => 'parts_group',
164 part_classifications => 'PartClassification',
165 part_customer_prices => 'PartCustomerPrice',
166 parts_price_history => 'PartsPriceHistory',
167 payment_terms => 'payment_term',
168 periodic_invoices => 'periodic_invoice',
169 periodic_invoices_configs => 'periodic_invoices_config',
171 price_factors => 'price_factor',
172 price_rules => 'price_rule',
173 price_rule_items => 'price_rule_item',
174 pricegroup => 'pricegroup',
175 printers => 'printer',
176 project => 'project',
177 project_participants => 'project_participant',
178 project_phase_participants => 'project_phase_participant',
179 project_phases => 'project_phase',
180 project_roles => 'project_role',
181 project_statuses => 'project_status',
182 project_types => 'project_type',
183 reconciliation_links => 'reconciliation_link',
184 record_links => 'record_link',
185 record_templates => 'record_template',
186 record_template_items => 'record_template_item',
187 requirement_spec_acceptance_statuses => 'RequirementSpecAcceptanceStatus',
188 requirement_spec_complexities => 'RequirementSpecComplexity',
189 requirement_spec_item_dependencies => 'RequirementSpecDependency',
190 requirement_spec_items => 'RequirementSpecItem',
191 requirement_spec_orders => 'RequirementSpecOrder',
192 requirement_spec_parts => 'RequirementSpecPart',
193 requirement_spec_pictures => 'RequirementSpecPicture',
194 requirement_spec_predefined_texts => 'RequirementSpecPredefinedText',
195 requirement_spec_risks => 'RequirementSpecRisk',
196 requirement_spec_statuses => 'RequirementSpecStatus',
197 requirement_spec_text_blocks => 'RequirementSpecTextBlock',
198 requirement_spec_types => 'RequirementSpecType',
199 requirement_spec_versions => 'RequirementSpecVersion',
200 requirement_specs => 'RequirementSpec',
201 sepa_export => 'sepa_export',
202 sepa_export_items => 'sepa_export_item',
203 sepa_export_message_ids => 'SepaExportMessageId',
204 schema_info => 'schema_info',
207 shop_images => 'shop_image',
208 shop_orders => 'shop_order',
209 shop_order_items => 'shop_order_item',
210 shop_parts => 'shop_part',
212 stocktakings => 'stocktaking',
214 taxkeys => 'tax_key',
215 tax_zones => 'tax_zone',
216 taxzone_charts => 'taxzone_chart',
217 time_recordings => 'time_recording',
218 todo_user_config => 'todo_user_config',
219 transfer_type => 'transfer_type',
220 translation => 'translation',
221 trigger_information => 'trigger_information',
223 units_language => 'units_language',
224 user_preferences => 'user_preference',
226 warehouse => 'warehouse',
229 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
232 return KIVITENDO => \@kivitendo_blacklist;
235 sub get_package_names {
236 return KIVITENDO => \%kivitendo_package_names;
239 sub get_name_for_table {
240 return $kivitendo_package_names{ $_[0] };
243 sub get_package_for_table {
244 %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
245 unless %kivitendo_tables_to_packages;
247 return $kivitendo_tables_to_packages{ $_[0] };
250 sub get_manager_package_for_table {
251 %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
252 unless %kivitendo_tables_to_manager_packages;
254 return $kivitendo_tables_to_manager_packages{ $_[0] };
257 sub get_table_for_package {
258 get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
259 %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
261 my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
262 return $kivitendo_packages_to_tables{ $package };
267 my $lookup = $kivitendo_package_names{$_[0]} ||
268 plurify($kivitendo_package_names{singlify($_[0])});
270 for my $thing ($string, $lookup) {
272 # best guess? its already the name. like part. camelize it first
273 my $class = "SL::DB::" . camelify($thing);
274 return $class if defined *{ $class. '::' };
276 # next, someone wants a manager and pluralized.
277 my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
278 return $manager if defined *{ $manager . '::' };
281 die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
304 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
308 use SL::DB::Helper::Mappings qw(@blacklist %table2model);
312 This modul stores table <-> model mappings used by the
313 L<scripts/rose_auto_create_model.pl> script. If you add a new table that has
314 custom mappings, add it here.
322 A special function provided here is C<db>. Without it you'd have to write:
324 my $part = SL::DB::Part->new(id => 1234);
325 my @all_parts = SL::DB::Manager::Part->get_all;
327 with them it becomes:
329 my $part = db('part')->new(id => 123);
330 my @all_parts = db('parts')->get_all;
332 You don't have to care about add that SL::DB:: incantation anymore. Also, a
333 simple s at the end will get you the associated Manager class.
335 db is written to try to make sense of what you give it, but if all fails, it
336 will die with an error.
338 =item C<get_package_for_table $table_name>
340 Returns the package name for a table name:
342 SL::DB::Helper::Mappings::get_package_for_table('oe')
345 =item C<get_manager_package_for_table $table_name>
347 Returns the manager package name for a table name:
349 SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
350 # SL::DB::Manager::Order
352 =item C<get_table_for_package $package_name>
354 Returns the table name for a package name:
356 SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
358 SL::DB::Helper::Mappings::get_table_for_package('Order')
369 L<scripts/rose_auto_create_model.pl>
373 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
374 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>