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_recording_articles => 'time_recording_article',
218 time_recordings => 'time_recording',
219 todo_user_config => 'todo_user_config',
220 transfer_type => 'transfer_type',
221 translation => 'translation',
222 trigger_information => 'trigger_information',
224 units_language => 'units_language',
225 user_preferences => 'user_preference',
227 warehouse => 'warehouse',
230 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
233 return KIVITENDO => \@kivitendo_blacklist;
236 sub get_package_names {
237 return KIVITENDO => \%kivitendo_package_names;
240 sub get_name_for_table {
241 return $kivitendo_package_names{ $_[0] };
244 sub get_package_for_table {
245 %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
246 unless %kivitendo_tables_to_packages;
248 return $kivitendo_tables_to_packages{ $_[0] };
251 sub get_manager_package_for_table {
252 %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
253 unless %kivitendo_tables_to_manager_packages;
255 return $kivitendo_tables_to_manager_packages{ $_[0] };
258 sub get_table_for_package {
259 get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
260 %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
262 my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
263 return $kivitendo_packages_to_tables{ $package };
268 my $lookup = $kivitendo_package_names{$_[0]} ||
269 plurify($kivitendo_package_names{singlify($_[0])});
271 for my $thing ($string, $lookup) {
273 # best guess? its already the name. like part. camelize it first
274 my $class = "SL::DB::" . camelify($thing);
275 return $class if defined *{ $class. '::' };
277 # next, someone wants a manager and pluralized.
278 my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
279 return $manager if defined *{ $manager . '::' };
282 die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
305 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
309 use SL::DB::Helper::Mappings qw(@blacklist %table2model);
313 This modul stores table <-> model mappings used by the
314 L<scripts/rose_auto_create_model.pl> script. If you add a new table that has
315 custom mappings, add it here.
323 A special function provided here is C<db>. Without it you'd have to write:
325 my $part = SL::DB::Part->new(id => 1234);
326 my @all_parts = SL::DB::Manager::Part->get_all;
328 with them it becomes:
330 my $part = db('part')->new(id => 123);
331 my @all_parts = db('parts')->get_all;
333 You don't have to care about add that SL::DB:: incantation anymore. Also, a
334 simple s at the end will get you the associated Manager class.
336 db is written to try to make sense of what you give it, but if all fails, it
337 will die with an error.
339 =item C<get_package_for_table $table_name>
341 Returns the package name for a table name:
343 SL::DB::Helper::Mappings::get_package_for_table('oe')
346 =item C<get_manager_package_for_table $table_name>
348 Returns the manager package name for a table name:
350 SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
351 # SL::DB::Manager::Order
353 =item C<get_table_for_package $package_name>
355 Returns the table name for a package name:
357 SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
359 SL::DB::Helper::Mappings::get_table_for_package('Order')
370 L<scripts/rose_auto_create_model.pl>
374 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
375 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>