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',
163 orderitems => 'order_item',
166 partsgroup => 'parts_group',
167 part_classifications => 'PartClassification',
168 part_customer_prices => 'PartCustomerPrice',
169 parts_price_history => 'PartsPriceHistory',
170 payment_terms => 'payment_term',
171 periodic_invoices => 'periodic_invoice',
172 periodic_invoices_configs => 'periodic_invoices_config',
174 price_factors => 'price_factor',
175 price_rules => 'price_rule',
176 price_rule_items => 'price_rule_item',
177 pricegroup => 'pricegroup',
178 printers => 'printer',
179 project => 'project',
180 project_participants => 'project_participant',
181 project_phase_participants => 'project_phase_participant',
182 project_phases => 'project_phase',
183 project_roles => 'project_role',
184 project_statuses => 'project_status',
185 project_types => 'project_type',
186 reconciliation_links => 'reconciliation_link',
187 record_links => 'record_link',
188 record_templates => 'record_template',
189 record_template_items => 'record_template_item',
190 requirement_spec_acceptance_statuses => 'RequirementSpecAcceptanceStatus',
191 requirement_spec_complexities => 'RequirementSpecComplexity',
192 requirement_spec_item_dependencies => 'RequirementSpecDependency',
193 requirement_spec_items => 'RequirementSpecItem',
194 requirement_spec_orders => 'RequirementSpecOrder',
195 requirement_spec_parts => 'RequirementSpecPart',
196 requirement_spec_pictures => 'RequirementSpecPicture',
197 requirement_spec_predefined_texts => 'RequirementSpecPredefinedText',
198 requirement_spec_risks => 'RequirementSpecRisk',
199 requirement_spec_statuses => 'RequirementSpecStatus',
200 requirement_spec_text_blocks => 'RequirementSpecTextBlock',
201 requirement_spec_types => 'RequirementSpecType',
202 requirement_spec_versions => 'RequirementSpecVersion',
203 requirement_specs => 'RequirementSpec',
204 sepa_export => 'sepa_export',
205 sepa_export_items => 'sepa_export_item',
206 sepa_export_message_ids => 'SepaExportMessageId',
207 schema_info => 'schema_info',
210 shop_images => 'shop_image',
211 shop_orders => 'shop_order',
212 shop_order_items => 'shop_order_item',
213 shop_parts => 'shop_part',
215 stocktakings => 'stocktaking',
217 taxkeys => 'tax_key',
218 tax_zones => 'tax_zone',
219 taxzone_charts => 'taxzone_chart',
220 time_recording_articles => 'time_recording_article',
221 time_recordings => 'time_recording',
222 todo_user_config => 'todo_user_config',
223 transfer_type => 'transfer_type',
224 translation => 'translation',
225 trigger_information => 'trigger_information',
227 units_language => 'units_language',
228 user_preferences => 'user_preference',
230 warehouse => 'warehouse',
233 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
236 return KIVITENDO => \@kivitendo_blacklist;
239 sub get_package_names {
240 return KIVITENDO => \%kivitendo_package_names;
243 sub get_name_for_table {
244 return $kivitendo_package_names{ $_[0] };
247 sub get_package_for_table {
248 %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
249 unless %kivitendo_tables_to_packages;
251 return $kivitendo_tables_to_packages{ $_[0] };
254 sub get_manager_package_for_table {
255 %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
256 unless %kivitendo_tables_to_manager_packages;
258 return $kivitendo_tables_to_manager_packages{ $_[0] };
261 sub get_table_for_package {
262 get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
263 %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
265 my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
266 return $kivitendo_packages_to_tables{ $package };
271 my $lookup = $kivitendo_package_names{$_[0]} ||
272 plurify($kivitendo_package_names{singlify($_[0])});
274 for my $thing ($string, $lookup) {
276 # best guess? its already the name. like part. camelize it first
277 my $class = "SL::DB::" . camelify($thing);
278 return $class if defined *{ $class. '::' };
280 # next, someone wants a manager and pluralized.
281 my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
282 return $manager if defined *{ $manager . '::' };
285 die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
308 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
312 use SL::DB::Helper::Mappings qw(@blacklist %table2model);
316 This modul stores table <-> model mappings used by the
317 L<scripts/rose_auto_create_model.pl> script. If you add a new table that has
318 custom mappings, add it here.
326 A special function provided here is C<db>. Without it you'd have to write:
328 my $part = SL::DB::Part->new(id => 1234);
329 my @all_parts = SL::DB::Manager::Part->get_all;
331 with them it becomes:
333 my $part = db('part')->new(id => 123);
334 my @all_parts = db('parts')->get_all;
336 You don't have to care about add that SL::DB:: incantation anymore. Also, a
337 simple s at the end will get you the associated Manager class.
339 db is written to try to make sense of what you give it, but if all fails, it
340 will die with an error.
342 =item C<get_package_for_table $table_name>
344 Returns the package name for a table name:
346 SL::DB::Helper::Mappings::get_package_for_table('oe')
349 =item C<get_manager_package_for_table $table_name>
351 Returns the manager package name for a table name:
353 SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
354 # SL::DB::Manager::Order
356 =item C<get_table_for_package $package_name>
358 Returns the table name for a package name:
360 SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
362 SL::DB::Helper::Mappings::get_table_for_package('Order')
373 L<scripts/rose_auto_create_model.pl>
377 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
378 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>