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_data_export_queries => 'CustomDataExportQuery',
121 custom_data_export_query_parameters => 'CustomDataExportQueryParameter',
122 custom_variable_config_partsgroups => 'custom_variable_config_partsgroup',
123 custom_variable_configs => 'custom_variable_config',
124 custom_variables => 'custom_variable',
125 custom_variables_validity => 'custom_variable_validity',
127 defaults => 'default',
128 delivery_orders => 'delivery_order',
129 delivery_order_items => 'delivery_order_item',
130 delivery_order_items_stock => 'delivery_order_items_stock',
131 delivery_terms => 'delivery_term',
132 department => 'department',
134 dunning => 'dunning',
135 dunning_config => 'dunning_config',
136 email_journal => 'EmailJournal',
137 email_journal_attachments => 'EmailJournalAttachment',
138 employee => 'employee',
139 exchangerate => 'exchangerate',
141 finanzamt => 'finanzamt',
142 follow_up_access => 'follow_up_access',
143 follow_up_links => 'follow_up_link',
144 follow_ups => 'follow_up',
145 generic_translations => 'generic_translation',
146 gl => 'GLTransaction',
147 history_erp => 'history',
148 inventory => 'inventory',
149 invoice => 'invoice_item',
150 language => 'language',
152 letter_draft => 'letter_draft',
153 makemodel => 'make_model',
155 orderitems => 'order_item',
158 partsgroup => 'parts_group',
159 part_classifications => 'PartClassification',
160 part_customer_prices => 'PartCustomerPrice',
161 parts_price_history => 'PartsPriceHistory',
162 payment_terms => 'payment_term',
163 periodic_invoices => 'periodic_invoice',
164 periodic_invoices_configs => 'periodic_invoices_config',
166 price_factors => 'price_factor',
167 price_rules => 'price_rule',
168 price_rule_items => 'price_rule_item',
169 pricegroup => 'pricegroup',
170 printers => 'printer',
171 project => 'project',
172 project_participants => 'project_participant',
173 project_phase_participants => 'project_phase_participant',
174 project_phases => 'project_phase',
175 project_roles => 'project_role',
176 project_statuses => 'project_status',
177 project_types => 'project_type',
178 reconciliation_links => 'reconciliation_link',
179 record_links => 'record_link',
180 record_templates => 'record_template',
181 record_template_items => 'record_template_item',
182 requirement_spec_acceptance_statuses => 'RequirementSpecAcceptanceStatus',
183 requirement_spec_complexities => 'RequirementSpecComplexity',
184 requirement_spec_item_dependencies => 'RequirementSpecDependency',
185 requirement_spec_items => 'RequirementSpecItem',
186 requirement_spec_orders => 'RequirementSpecOrder',
187 requirement_spec_parts => 'RequirementSpecPart',
188 requirement_spec_pictures => 'RequirementSpecPicture',
189 requirement_spec_predefined_texts => 'RequirementSpecPredefinedText',
190 requirement_spec_risks => 'RequirementSpecRisk',
191 requirement_spec_statuses => 'RequirementSpecStatus',
192 requirement_spec_text_blocks => 'RequirementSpecTextBlock',
193 requirement_spec_types => 'RequirementSpecType',
194 requirement_spec_versions => 'RequirementSpecVersion',
195 requirement_specs => 'RequirementSpec',
196 sepa_export => 'sepa_export',
197 sepa_export_items => 'sepa_export_item',
198 sepa_export_message_ids => 'SepaExportMessageId',
199 schema_info => 'schema_info',
202 shop_images => 'shop_image',
203 shop_orders => 'shop_order',
204 shop_order_items => 'shop_order_item',
205 shop_parts => 'shop_part',
207 stocktakings => 'stocktaking',
209 taxkeys => 'tax_key',
210 tax_zones => 'tax_zone',
211 taxzone_charts => 'taxzone_chart',
212 todo_user_config => 'todo_user_config',
213 transfer_type => 'transfer_type',
214 translation => 'translation',
215 trigger_information => 'trigger_information',
217 units_language => 'units_language',
218 user_preferences => 'user_preference',
220 warehouse => 'warehouse',
223 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
226 return KIVITENDO => \@kivitendo_blacklist;
229 sub get_package_names {
230 return KIVITENDO => \%kivitendo_package_names;
233 sub get_name_for_table {
234 return $kivitendo_package_names{ $_[0] };
237 sub get_package_for_table {
238 %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
239 unless %kivitendo_tables_to_packages;
241 return $kivitendo_tables_to_packages{ $_[0] };
244 sub get_manager_package_for_table {
245 %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
246 unless %kivitendo_tables_to_manager_packages;
248 return $kivitendo_tables_to_manager_packages{ $_[0] };
251 sub get_table_for_package {
252 get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
253 %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
255 my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
256 return $kivitendo_packages_to_tables{ $package };
261 my $lookup = $kivitendo_package_names{$_[0]} ||
262 plurify($kivitendo_package_names{singlify($_[0])});
264 for my $thing ($string, $lookup) {
266 # best guess? its already the name. like part. camelize it first
267 my $class = "SL::DB::" . camelify($thing);
268 return $class if defined *{ $class. '::' };
270 # next, someone wants a manager and pluralized.
271 my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
272 return $manager if defined *{ $manager . '::' };
275 die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
298 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
302 use SL::DB::Helper::Mappings qw(@blacklist %table2model);
306 This modul stores table <-> model mappings used by the
307 L<scripts/rose_auto_create_model.pl> script. If you add a new table that has
308 custom mappings, add it here.
316 A special function provided here is C<db>. Without it you'd have to write:
318 my $part = SL::DB::Part->new(id => 1234);
319 my @all_parts = SL::DB::Manager::Part->get_all;
321 with them it becomes:
323 my $part = db('part')->new(id => 123);
324 my @all_parts = db('parts')->get_all;
326 You don't have to care about add that SL::DB:: incantation anymore. Also, a
327 simple s at the end will get you the associated Manager class.
329 db is written to try to make sense of what you give it, but if all fails, it
330 will die with an error.
332 =item C<get_package_for_table $table_name>
334 Returns the package name for a table name:
336 SL::DB::Helper::Mappings::get_package_for_table('oe')
339 =item C<get_manager_package_for_table $table_name>
341 Returns the manager package name for a table name:
343 SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
344 # SL::DB::Manager::Order
346 =item C<get_table_for_package $package_name>
348 Returns the table name for a package name:
350 SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
352 SL::DB::Helper::Mappings::get_table_for_package('Order')
363 L<scripts/rose_auto_create_model.pl>
367 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
368 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>