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 finanzamt => 'finanzamt',
148 follow_up_access => 'follow_up_access',
149 follow_up_links => 'follow_up_link',
150 follow_ups => 'follow_up',
151 generic_translations => 'generic_translation',
152 gl => 'GLTransaction',
153 greetings => 'greeting',
154 history_erp => 'history',
155 inventory => 'inventory',
156 invoice => 'invoice_item',
157 language => 'language',
159 letter_draft => 'letter_draft',
160 makemodel => 'make_model',
162 orderitems => 'order_item',
165 partsgroup => 'parts_group',
166 part_classifications => 'PartClassification',
167 part_customer_prices => 'PartCustomerPrice',
168 parts_price_history => 'PartsPriceHistory',
169 payment_terms => 'payment_term',
170 periodic_invoices => 'periodic_invoice',
171 periodic_invoices_configs => 'periodic_invoices_config',
173 price_factors => 'price_factor',
174 price_rules => 'price_rule',
175 price_rule_items => 'price_rule_item',
176 pricegroup => 'pricegroup',
177 printers => 'printer',
178 project => 'project',
179 project_participants => 'project_participant',
180 project_phase_participants => 'project_phase_participant',
181 project_phases => 'project_phase',
182 project_roles => 'project_role',
183 project_statuses => 'project_status',
184 project_types => 'project_type',
185 reconciliation_links => 'reconciliation_link',
186 record_links => 'record_link',
187 record_templates => 'record_template',
188 record_template_items => 'record_template_item',
189 requirement_spec_acceptance_statuses => 'RequirementSpecAcceptanceStatus',
190 requirement_spec_complexities => 'RequirementSpecComplexity',
191 requirement_spec_item_dependencies => 'RequirementSpecDependency',
192 requirement_spec_items => 'RequirementSpecItem',
193 requirement_spec_orders => 'RequirementSpecOrder',
194 requirement_spec_parts => 'RequirementSpecPart',
195 requirement_spec_pictures => 'RequirementSpecPicture',
196 requirement_spec_predefined_texts => 'RequirementSpecPredefinedText',
197 requirement_spec_risks => 'RequirementSpecRisk',
198 requirement_spec_statuses => 'RequirementSpecStatus',
199 requirement_spec_text_blocks => 'RequirementSpecTextBlock',
200 requirement_spec_types => 'RequirementSpecType',
201 requirement_spec_versions => 'RequirementSpecVersion',
202 requirement_specs => 'RequirementSpec',
203 sepa_export => 'sepa_export',
204 sepa_export_items => 'sepa_export_item',
205 sepa_export_message_ids => 'SepaExportMessageId',
206 schema_info => 'schema_info',
209 shop_images => 'shop_image',
210 shop_orders => 'shop_order',
211 shop_order_items => 'shop_order_item',
212 shop_parts => 'shop_part',
214 stocktakings => 'stocktaking',
216 taxkeys => 'tax_key',
217 tax_zones => 'tax_zone',
218 taxzone_charts => 'taxzone_chart',
219 time_recording_articles => 'time_recording_article',
220 time_recordings => 'time_recording',
221 todo_user_config => 'todo_user_config',
222 transfer_type => 'transfer_type',
223 translation => 'translation',
224 trigger_information => 'trigger_information',
226 units_language => 'units_language',
227 user_preferences => 'user_preference',
229 warehouse => 'warehouse',
232 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
235 return KIVITENDO => \@kivitendo_blacklist;
238 sub get_package_names {
239 return KIVITENDO => \%kivitendo_package_names;
242 sub get_name_for_table {
243 return $kivitendo_package_names{ $_[0] };
246 sub get_package_for_table {
247 %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
248 unless %kivitendo_tables_to_packages;
250 return $kivitendo_tables_to_packages{ $_[0] };
253 sub get_manager_package_for_table {
254 %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
255 unless %kivitendo_tables_to_manager_packages;
257 return $kivitendo_tables_to_manager_packages{ $_[0] };
260 sub get_table_for_package {
261 get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
262 %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
264 my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
265 return $kivitendo_packages_to_tables{ $package };
270 my $lookup = $kivitendo_package_names{$_[0]} ||
271 plurify($kivitendo_package_names{singlify($_[0])});
273 for my $thing ($string, $lookup) {
275 # best guess? its already the name. like part. camelize it first
276 my $class = "SL::DB::" . camelify($thing);
277 return $class if defined *{ $class. '::' };
279 # next, someone wants a manager and pluralized.
280 my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
281 return $manager if defined *{ $manager . '::' };
284 die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
307 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
311 use SL::DB::Helper::Mappings qw(@blacklist %table2model);
315 This modul stores table <-> model mappings used by the
316 L<scripts/rose_auto_create_model.pl> script. If you add a new table that has
317 custom mappings, add it here.
325 A special function provided here is C<db>. Without it you'd have to write:
327 my $part = SL::DB::Part->new(id => 1234);
328 my @all_parts = SL::DB::Manager::Part->get_all;
330 with them it becomes:
332 my $part = db('part')->new(id => 123);
333 my @all_parts = db('parts')->get_all;
335 You don't have to care about add that SL::DB:: incantation anymore. Also, a
336 simple s at the end will get you the associated Manager class.
338 db is written to try to make sense of what you give it, but if all fails, it
339 will die with an error.
341 =item C<get_package_for_table $table_name>
343 Returns the package name for a table name:
345 SL::DB::Helper::Mappings::get_package_for_table('oe')
348 =item C<get_manager_package_for_table $table_name>
350 Returns the manager package name for a table name:
352 SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
353 # SL::DB::Manager::Order
355 =item C<get_table_for_package $package_name>
357 Returns the table name for a package name:
359 SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
361 SL::DB::Helper::Mappings::get_table_for_package('Order')
372 L<scripts/rose_auto_create_model.pl>
376 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
377 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>