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',
139 finanzamt => 'finanzamt',
140 follow_up_access => 'follow_up_access',
141 follow_up_links => 'follow_up_link',
142 follow_ups => 'follow_up',
143 generic_translations => 'generic_translation',
144 gl => 'GLTransaction',
145 history_erp => 'history',
146 inventory => 'inventory',
147 invoice => 'invoice_item',
148 language => 'language',
150 letter_draft => 'letter_draft',
151 makemodel => 'make_model',
153 orderitems => 'order_item',
156 partsgroup => 'parts_group',
157 part_classifications => 'PartClassification',
158 parts_price_history => 'PartsPriceHistory',
159 payment_terms => 'payment_term',
160 periodic_invoices => 'periodic_invoice',
161 periodic_invoices_configs => 'periodic_invoices_config',
163 price_factors => 'price_factor',
164 price_rules => 'price_rule',
165 price_rule_items => 'price_rule_item',
166 pricegroup => 'pricegroup',
167 printers => 'printer',
168 project => 'project',
169 project_participants => 'project_participant',
170 project_phase_participants => 'project_phase_participant',
171 project_phases => 'project_phase',
172 project_roles => 'project_role',
173 project_statuses => 'project_status',
174 project_types => 'project_type',
175 reconciliation_links => 'reconciliation_link',
176 record_links => 'record_link',
177 record_templates => 'record_template',
178 record_template_items => 'record_template_item',
179 requirement_spec_acceptance_statuses => 'RequirementSpecAcceptanceStatus',
180 requirement_spec_complexities => 'RequirementSpecComplexity',
181 requirement_spec_item_dependencies => 'RequirementSpecDependency',
182 requirement_spec_items => 'RequirementSpecItem',
183 requirement_spec_orders => 'RequirementSpecOrder',
184 requirement_spec_parts => 'RequirementSpecPart',
185 requirement_spec_pictures => 'RequirementSpecPicture',
186 requirement_spec_predefined_texts => 'RequirementSpecPredefinedText',
187 requirement_spec_risks => 'RequirementSpecRisk',
188 requirement_spec_statuses => 'RequirementSpecStatus',
189 requirement_spec_text_blocks => 'RequirementSpecTextBlock',
190 requirement_spec_types => 'RequirementSpecType',
191 requirement_spec_versions => 'RequirementSpecVersion',
192 requirement_specs => 'RequirementSpec',
193 sepa_export => 'sepa_export',
194 sepa_export_items => 'sepa_export_item',
195 sepa_export_message_ids => 'SepaExportMessageId',
196 schema_info => 'schema_info',
199 shop_orders => 'shop_order',
200 shop_order_items => 'shop_order_item',
201 shop_parts => 'shop_part',
204 taxkeys => 'tax_key',
205 tax_zones => 'tax_zone',
206 taxzone_charts => 'taxzone_chart',
207 todo_user_config => 'todo_user_config',
208 transfer_type => 'transfer_type',
209 translation => 'translation',
210 trigger_information => 'trigger_information',
212 units_language => 'units_language',
213 user_preferences => 'user_preference',
215 warehouse => 'warehouse',
218 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
221 return KIVITENDO => \@kivitendo_blacklist;
224 sub get_package_names {
225 return KIVITENDO => \%kivitendo_package_names;
228 sub get_name_for_table {
229 return $kivitendo_package_names{ $_[0] };
232 sub get_package_for_table {
233 %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
234 unless %kivitendo_tables_to_packages;
236 return $kivitendo_tables_to_packages{ $_[0] };
239 sub get_manager_package_for_table {
240 %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
241 unless %kivitendo_tables_to_manager_packages;
243 return $kivitendo_tables_to_manager_packages{ $_[0] };
246 sub get_table_for_package {
247 get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
248 %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
250 my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
251 return $kivitendo_packages_to_tables{ $package };
256 my $lookup = $kivitendo_package_names{$_[0]} ||
257 plurify($kivitendo_package_names{singlify($_[0])});
259 for my $thing ($string, $lookup) {
261 # best guess? its already the name. like part. camelize it first
262 my $class = "SL::DB::" . camelify($thing);
263 return $class if defined *{ $class. '::' };
265 # next, someone wants a manager and pluralized.
266 my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
267 return $manager if defined *{ $manager . '::' };
270 die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
293 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
297 use SL::DB::Helper::Mappings qw(@blacklist %table2model);
301 This modul stores table <-> model mappings used by the
302 L<scripts/rose_auto_create_model.pl> script. If you add a new table that has
303 custom mappings, add it here.
311 A special function provided here is C<db>. Without it you'd have to write:
313 my $part = SL::DB::Part->new(id => 1234);
314 my @all_parts = SL::DB::Manager::Part->get_all;
316 with them it becomes:
318 my $part = db('part')->new(id => 123);
319 my @all_parts = db('parts')->get_all;
321 You don't have to care about add that SL::DB:: incantation anymore. Also, a
322 simple s at the end will get you the associated Manager class.
324 db is written to try to make sense of what you give it, but if all fails, it
325 will die with an error.
327 =item C<get_package_for_table $table_name>
329 Returns the package name for a table name:
331 SL::DB::Helper::Mappings::get_package_for_table('oe')
334 =item C<get_manager_package_for_table $table_name>
336 Returns the manager package name for a table name:
338 SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
339 # SL::DB::Manager::Order
341 =item C<get_table_for_package $package_name>
343 Returns the table name for a package name:
345 SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
347 SL::DB::Helper::Mappings::get_table_for_package('Order')
358 L<scripts/rose_auto_create_model.pl>
362 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
363 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>