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 buchungsgruppen => 'buchungsgruppe',
110 business => 'business',
112 contacts => 'contact',
113 customer => 'customer',
114 csv_import_profiles => 'csv_import_profile',
115 csv_import_profile_settings => 'csv_import_profile_setting',
116 csv_import_reports => 'csv_import_report',
117 csv_import_report_rows => 'csv_import_report_row',
118 csv_import_report_status => 'csv_import_report_status',
119 currencies => 'currency',
120 custom_variable_config_partsgroups => 'custom_variable_config_partsgroup',
121 custom_variable_configs => 'custom_variable_config',
122 custom_variables => 'custom_variable',
123 custom_variables_validity => 'custom_variable_validity',
125 defaults => 'default',
126 delivery_orders => 'delivery_order',
127 delivery_order_items => 'delivery_order_item',
128 delivery_order_items_stock => 'delivery_order_items_stock',
129 delivery_terms => 'delivery_term',
130 department => 'department',
132 dunning => 'dunning',
133 dunning_config => 'dunning_config',
134 email_journal => 'EmailJournal',
135 email_journal_attachments => 'EmailJournalAttachment',
136 employee => 'employee',
137 exchangerate => 'exchangerate',
138 finanzamt => 'finanzamt',
139 follow_up_access => 'follow_up_access',
140 follow_up_links => 'follow_up_link',
141 follow_ups => 'follow_up',
142 generic_translations => 'generic_translation',
143 gl => 'GLTransaction',
144 history_erp => 'history',
145 inventory => 'inventory',
146 invoice => 'invoice_item',
147 language => 'language',
149 letter_draft => 'letter_draft',
150 makemodel => 'make_model',
152 orderitems => 'order_item',
155 partsgroup => 'parts_group',
156 part_classifications => 'PartClassification',
157 parts_price_history => 'PartsPriceHistory',
158 payment_terms => 'payment_term',
159 periodic_invoices => 'periodic_invoice',
160 periodic_invoices_configs => 'periodic_invoices_config',
162 price_factors => 'price_factor',
163 price_rules => 'price_rule',
164 price_rule_items => 'price_rule_item',
165 pricegroup => 'pricegroup',
166 printers => 'printer',
167 project => 'project',
168 project_participants => 'project_participant',
169 project_phase_participants => 'project_phase_participant',
170 project_phases => 'project_phase',
171 project_roles => 'project_role',
172 project_statuses => 'project_status',
173 project_types => 'project_type',
174 record_links => 'record_link',
175 reconciliation_links => 'reconciliation_link',
176 requirement_spec_acceptance_statuses => 'RequirementSpecAcceptanceStatus',
177 requirement_spec_complexities => 'RequirementSpecComplexity',
178 requirement_spec_item_dependencies => 'RequirementSpecDependency',
179 requirement_spec_items => 'RequirementSpecItem',
180 requirement_spec_orders => 'RequirementSpecOrder',
181 requirement_spec_parts => 'RequirementSpecPart',
182 requirement_spec_pictures => 'RequirementSpecPicture',
183 requirement_spec_predefined_texts => 'RequirementSpecPredefinedText',
184 requirement_spec_risks => 'RequirementSpecRisk',
185 requirement_spec_statuses => 'RequirementSpecStatus',
186 requirement_spec_text_blocks => 'RequirementSpecTextBlock',
187 requirement_spec_types => 'RequirementSpecType',
188 requirement_spec_versions => 'RequirementSpecVersion',
189 requirement_specs => 'RequirementSpec',
190 sepa_export => 'sepa_export',
191 sepa_export_items => 'sepa_export_item',
192 sepa_export_message_ids => 'SepaExportMessageId',
193 schema_info => 'schema_info',
197 taxkeys => 'tax_key',
198 tax_zones => 'tax_zone',
199 taxzone_charts => 'taxzone_chart',
200 todo_user_config => 'todo_user_config',
201 transfer_type => 'transfer_type',
202 translation => 'translation',
203 trigger_information => 'trigger_information',
205 units_language => 'units_language',
206 user_preferences => 'user_preference',
208 warehouse => 'warehouse',
211 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
214 return KIVITENDO => \@kivitendo_blacklist;
217 sub get_package_names {
218 return KIVITENDO => \%kivitendo_package_names;
221 sub get_name_for_table {
222 return $kivitendo_package_names{ $_[0] };
225 sub get_package_for_table {
226 %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
227 unless %kivitendo_tables_to_packages;
229 return $kivitendo_tables_to_packages{ $_[0] };
232 sub get_manager_package_for_table {
233 %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
234 unless %kivitendo_tables_to_manager_packages;
236 return $kivitendo_tables_to_manager_packages{ $_[0] };
239 sub get_table_for_package {
240 get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
241 %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
243 my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
244 return $kivitendo_packages_to_tables{ $package };
249 my $lookup = $kivitendo_package_names{$_[0]} ||
250 plurify($kivitendo_package_names{singlify($_[0])});
252 for my $thing ($string, $lookup) {
254 # best guess? its already the name. like part. camelize it first
255 my $class = "SL::DB::" . camelify($thing);
256 return $class if defined *{ $class. '::' };
258 # next, someone wants a manager and pluralized.
259 my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
260 return $manager if defined *{ $manager . '::' };
263 die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
286 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
290 use SL::DB::Helper::Mappings qw(@blacklist %table2model);
294 This modul stores table <-> model mappings used by the
295 L<scripts/rose_auto_create_model.pl> script. If you add a new table that has
296 custom mappings, add it here.
304 A special function provided here is C<db>. Without it you'd have to write:
306 my $part = SL::DB::Part->new(id => 1234);
307 my @all_parts = SL::DB::Manager::Part->get_all;
309 with them it becomes:
311 my $part = db('part')->new(id => 123);
312 my @all_parts = db('parts')->get_all;
314 You don't have to care about add that SL::DB:: incantation anymore. Also, a
315 simple s at the end will get you the associated Manager class.
317 db is written to try to make sense of what you give it, but if all fails, it
318 will die with an error.
320 =item C<get_package_for_table $table_name>
322 Returns the package name for a table name:
324 SL::DB::Helper::Mappings::get_package_for_table('oe')
327 =item C<get_manager_package_for_table $table_name>
329 Returns the manager package name for a table name:
331 SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
332 # SL::DB::Manager::Order
334 =item C<get_table_for_package $package_name>
336 Returns the table name for a package name:
338 SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
340 SL::DB::Helper::Mappings::get_table_for_package('Order')
351 L<scripts/rose_auto_create_model.pl>
355 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
356 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>