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