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