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 additional_billing_addresses => 'additional_billing_address',
88 'auth.clients' => 'auth_client',
89 'auth.clients_users' => 'auth_client_user',
90 'auth.clients_groups' => 'auth_client_group',
91 'auth.group' => 'auth_group',
92 'auth.group_rights' => 'auth_group_right',
93 'auth.master_rights' => 'auth_master_right',
94 'auth.schema_info' => 'auth_schema_info',
95 'auth.session' => 'auth_session',
96 'auth.session_content' => 'auth_session_content',
97 'auth.user' => 'auth_user',
98 'auth.user_config' => 'auth_user_config',
99 'auth.user_group' => 'auth_user_group',
101 ap => 'purchase_invoice',
102 assembly => 'assembly',
103 assortment_items => 'assortment_item',
104 background_jobs => 'background_job',
105 background_job_histories => 'background_job_history',
106 ap => 'purchase_invoice',
107 bank_accounts => 'bank_account',
108 bank_transactions => 'bank_transaction',
109 bank_transaction_acc_trans => 'bank_transaction_acc_trans',
110 buchungsgruppen => 'buchungsgruppe',
112 business => 'business',
114 contact_departments => 'contact_department',
115 contact_titles => 'contact_title',
116 contacts => 'contact',
117 customer => 'customer',
118 csv_import_profiles => 'csv_import_profile',
119 csv_import_profile_settings => 'csv_import_profile_setting',
120 csv_import_reports => 'csv_import_report',
121 csv_import_report_rows => 'csv_import_report_row',
122 csv_import_report_status => 'csv_import_report_status',
123 currencies => 'currency',
124 custom_data_export_queries => 'CustomDataExportQuery',
125 custom_data_export_query_parameters => 'CustomDataExportQueryParameter',
126 custom_variable_config_partsgroups => 'custom_variable_config_partsgroup',
127 custom_variable_configs => 'custom_variable_config',
128 custom_variables => 'custom_variable',
129 custom_variables_validity => 'custom_variable_validity',
131 defaults => 'default',
132 delivery_orders => 'delivery_order',
133 delivery_order_items => 'delivery_order_item',
134 delivery_order_items_stock => 'delivery_order_items_stock',
135 delivery_terms => 'delivery_term',
136 department => 'department',
138 dunning => 'dunning',
139 dunning_config => 'dunning_config',
140 email_journal => 'EmailJournal',
141 email_journal_attachments => 'EmailJournalAttachment',
142 employee => 'employee',
143 employee_project_invoices => 'EmployeeProjectInvoices',
144 exchangerate => 'exchangerate',
146 finanzamt => 'finanzamt',
147 follow_up_access => 'follow_up_access',
148 follow_up_links => 'follow_up_link',
149 follow_ups => 'follow_up',
150 generic_translations => 'generic_translation',
151 gl => 'GLTransaction',
152 greetings => 'greeting',
153 history_erp => 'history',
154 inventory => 'inventory',
155 invoice => 'invoice_item',
156 language => 'language',
158 letter_draft => 'letter_draft',
159 makemodel => 'make_model',
161 orderitems => 'order_item',
164 partsgroup => 'parts_group',
165 part_classifications => 'PartClassification',
166 part_customer_prices => 'PartCustomerPrice',
167 parts_price_history => 'PartsPriceHistory',
168 payment_terms => 'payment_term',
169 periodic_invoices => 'periodic_invoice',
170 periodic_invoices_configs => 'periodic_invoices_config',
172 price_factors => 'price_factor',
173 price_rules => 'price_rule',
174 price_rule_items => 'price_rule_item',
175 pricegroup => 'pricegroup',
176 printers => 'printer',
177 project => 'project',
178 project_participants => 'project_participant',
179 project_phase_participants => 'project_phase_participant',
180 project_phases => 'project_phase',
181 project_roles => 'project_role',
182 project_statuses => 'project_status',
183 project_types => 'project_type',
184 reconciliation_links => 'reconciliation_link',
185 record_links => 'record_link',
186 record_templates => 'record_template',
187 record_template_items => 'record_template_item',
188 requirement_spec_acceptance_statuses => 'RequirementSpecAcceptanceStatus',
189 requirement_spec_complexities => 'RequirementSpecComplexity',
190 requirement_spec_item_dependencies => 'RequirementSpecDependency',
191 requirement_spec_items => 'RequirementSpecItem',
192 requirement_spec_orders => 'RequirementSpecOrder',
193 requirement_spec_parts => 'RequirementSpecPart',
194 requirement_spec_pictures => 'RequirementSpecPicture',
195 requirement_spec_predefined_texts => 'RequirementSpecPredefinedText',
196 requirement_spec_risks => 'RequirementSpecRisk',
197 requirement_spec_statuses => 'RequirementSpecStatus',
198 requirement_spec_text_blocks => 'RequirementSpecTextBlock',
199 requirement_spec_types => 'RequirementSpecType',
200 requirement_spec_versions => 'RequirementSpecVersion',
201 requirement_specs => 'RequirementSpec',
202 sepa_export => 'sepa_export',
203 sepa_export_items => 'sepa_export_item',
204 sepa_export_message_ids => 'SepaExportMessageId',
205 schema_info => 'schema_info',
208 shop_images => 'shop_image',
209 shop_orders => 'shop_order',
210 shop_order_items => 'shop_order_item',
211 shop_parts => 'shop_part',
213 stocktakings => 'stocktaking',
215 taxkeys => 'tax_key',
216 tax_zones => 'tax_zone',
217 taxzone_charts => 'taxzone_chart',
218 time_recording_articles => 'time_recording_article',
219 time_recordings => 'time_recording',
220 todo_user_config => 'todo_user_config',
221 transfer_type => 'transfer_type',
222 translation => 'translation',
223 trigger_information => 'trigger_information',
225 units_language => 'units_language',
226 user_preferences => 'user_preference',
228 warehouse => 'warehouse',
231 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
234 return KIVITENDO => \@kivitendo_blacklist;
237 sub get_package_names {
238 return KIVITENDO => \%kivitendo_package_names;
241 sub get_name_for_table {
242 return $kivitendo_package_names{ $_[0] };
245 sub get_package_for_table {
246 %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
247 unless %kivitendo_tables_to_packages;
249 return $kivitendo_tables_to_packages{ $_[0] };
252 sub get_manager_package_for_table {
253 %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
254 unless %kivitendo_tables_to_manager_packages;
256 return $kivitendo_tables_to_manager_packages{ $_[0] };
259 sub get_table_for_package {
260 get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
261 %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
263 my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
264 return $kivitendo_packages_to_tables{ $package };
269 my $lookup = $kivitendo_package_names{$_[0]} ||
270 plurify($kivitendo_package_names{singlify($_[0])});
272 for my $thing ($string, $lookup) {
274 # best guess? its already the name. like part. camelize it first
275 my $class = "SL::DB::" . camelify($thing);
276 return $class if defined *{ $class. '::' };
278 # next, someone wants a manager and pluralized.
279 my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
280 return $manager if defined *{ $manager . '::' };
283 die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
306 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
310 use SL::DB::Helper::Mappings qw(@blacklist %table2model);
314 This modul stores table <-> model mappings used by the
315 L<scripts/rose_auto_create_model.pl> script. If you add a new table that has
316 custom mappings, add it here.
324 A special function provided here is C<db>. Without it you'd have to write:
326 my $part = SL::DB::Part->new(id => 1234);
327 my @all_parts = SL::DB::Manager::Part->get_all;
329 with them it becomes:
331 my $part = db('part')->new(id => 123);
332 my @all_parts = db('parts')->get_all;
334 You don't have to care about add that SL::DB:: incantation anymore. Also, a
335 simple s at the end will get you the associated Manager class.
337 db is written to try to make sense of what you give it, but if all fails, it
338 will die with an error.
340 =item C<get_package_for_table $table_name>
342 Returns the package name for a table name:
344 SL::DB::Helper::Mappings::get_package_for_table('oe')
347 =item C<get_manager_package_for_table $table_name>
349 Returns the manager package name for a table name:
351 SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
352 # SL::DB::Manager::Order
354 =item C<get_table_for_package $package_name>
356 Returns the table name for a package name:
358 SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
360 SL::DB::Helper::Mappings::get_table_for_package('Order')
371 L<scripts/rose_auto_create_model.pl>
375 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
376 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>