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 bank_transaction_acc_trans => 'bank_transaction_acc_trans',
109 buchungsgruppen => 'buchungsgruppe',
111 business => 'business',
113 contacts => 'contact',
114 customer => 'customer',
115 csv_import_profiles => 'csv_import_profile',
116 csv_import_profile_settings => 'csv_import_profile_setting',
117 csv_import_reports => 'csv_import_report',
118 csv_import_report_rows => 'csv_import_report_row',
119 csv_import_report_status => 'csv_import_report_status',
120 currencies => 'currency',
121 custom_data_export_queries => 'CustomDataExportQuery',
122 custom_data_export_query_parameters => 'CustomDataExportQueryParameter',
123 custom_variable_config_partsgroups => 'custom_variable_config_partsgroup',
124 custom_variable_configs => 'custom_variable_config',
125 custom_variables => 'custom_variable',
126 custom_variables_validity => 'custom_variable_validity',
128 defaults => 'default',
129 delivery_orders => 'delivery_order',
130 delivery_order_items => 'delivery_order_item',
131 delivery_order_items_stock => 'delivery_order_items_stock',
132 delivery_terms => 'delivery_term',
133 department => 'department',
135 dunning => 'dunning',
136 dunning_config => 'dunning_config',
137 email_journal => 'EmailJournal',
138 email_journal_attachments => 'EmailJournalAttachment',
139 employee => 'employee',
140 employee_project_invoices => 'EmployeeProjectInvoices',
141 exchangerate => 'exchangerate',
143 finanzamt => 'finanzamt',
144 follow_up_access => 'follow_up_access',
145 follow_up_links => 'follow_up_link',
146 follow_ups => 'follow_up',
147 generic_translations => 'generic_translation',
148 gl => 'GLTransaction',
149 history_erp => 'history',
150 inventory => 'inventory',
151 invoice => 'invoice_item',
152 language => 'language',
154 letter_draft => 'letter_draft',
155 makemodel => 'make_model',
157 orderitems => 'order_item',
160 partsgroup => 'parts_group',
161 part_classifications => 'PartClassification',
162 part_customer_prices => 'PartCustomerPrice',
163 parts_price_history => 'PartsPriceHistory',
164 payment_terms => 'payment_term',
165 periodic_invoices => 'periodic_invoice',
166 periodic_invoices_configs => 'periodic_invoices_config',
168 price_factors => 'price_factor',
169 price_rules => 'price_rule',
170 price_rule_items => 'price_rule_item',
171 pricegroup => 'pricegroup',
172 printers => 'printer',
173 project => 'project',
174 project_participants => 'project_participant',
175 project_phase_participants => 'project_phase_participant',
176 project_phases => 'project_phase',
177 project_roles => 'project_role',
178 project_statuses => 'project_status',
179 project_types => 'project_type',
180 reconciliation_links => 'reconciliation_link',
181 record_links => 'record_link',
182 record_templates => 'record_template',
183 record_template_items => 'record_template_item',
184 requirement_spec_acceptance_statuses => 'RequirementSpecAcceptanceStatus',
185 requirement_spec_complexities => 'RequirementSpecComplexity',
186 requirement_spec_item_dependencies => 'RequirementSpecDependency',
187 requirement_spec_items => 'RequirementSpecItem',
188 requirement_spec_orders => 'RequirementSpecOrder',
189 requirement_spec_parts => 'RequirementSpecPart',
190 requirement_spec_pictures => 'RequirementSpecPicture',
191 requirement_spec_predefined_texts => 'RequirementSpecPredefinedText',
192 requirement_spec_risks => 'RequirementSpecRisk',
193 requirement_spec_statuses => 'RequirementSpecStatus',
194 requirement_spec_text_blocks => 'RequirementSpecTextBlock',
195 requirement_spec_types => 'RequirementSpecType',
196 requirement_spec_versions => 'RequirementSpecVersion',
197 requirement_specs => 'RequirementSpec',
198 sepa_export => 'sepa_export',
199 sepa_export_items => 'sepa_export_item',
200 sepa_export_message_ids => 'SepaExportMessageId',
201 schema_info => 'schema_info',
204 shop_images => 'shop_image',
205 shop_orders => 'shop_order',
206 shop_order_items => 'shop_order_item',
207 shop_parts => 'shop_part',
209 stocktakings => 'stocktaking',
211 taxkeys => 'tax_key',
212 tax_zones => 'tax_zone',
213 taxzone_charts => 'taxzone_chart',
214 todo_user_config => 'todo_user_config',
215 transfer_type => 'transfer_type',
216 translation => 'translation',
217 trigger_information => 'trigger_information',
219 units_language => 'units_language',
220 user_preferences => 'user_preference',
222 warehouse => 'warehouse',
225 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
228 return KIVITENDO => \@kivitendo_blacklist;
231 sub get_package_names {
232 return KIVITENDO => \%kivitendo_package_names;
235 sub get_name_for_table {
236 return $kivitendo_package_names{ $_[0] };
239 sub get_package_for_table {
240 %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
241 unless %kivitendo_tables_to_packages;
243 return $kivitendo_tables_to_packages{ $_[0] };
246 sub get_manager_package_for_table {
247 %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
248 unless %kivitendo_tables_to_manager_packages;
250 return $kivitendo_tables_to_manager_packages{ $_[0] };
253 sub get_table_for_package {
254 get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
255 %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
257 my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
258 return $kivitendo_packages_to_tables{ $package };
263 my $lookup = $kivitendo_package_names{$_[0]} ||
264 plurify($kivitendo_package_names{singlify($_[0])});
266 for my $thing ($string, $lookup) {
268 # best guess? its already the name. like part. camelize it first
269 my $class = "SL::DB::" . camelify($thing);
270 return $class if defined *{ $class. '::' };
272 # next, someone wants a manager and pluralized.
273 my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
274 return $manager if defined *{ $manager . '::' };
277 die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
300 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
304 use SL::DB::Helper::Mappings qw(@blacklist %table2model);
308 This modul stores table <-> model mappings used by the
309 L<scripts/rose_auto_create_model.pl> script. If you add a new table that has
310 custom mappings, add it here.
318 A special function provided here is C<db>. Without it you'd have to write:
320 my $part = SL::DB::Part->new(id => 1234);
321 my @all_parts = SL::DB::Manager::Part->get_all;
323 with them it becomes:
325 my $part = db('part')->new(id => 123);
326 my @all_parts = db('parts')->get_all;
328 You don't have to care about add that SL::DB:: incantation anymore. Also, a
329 simple s at the end will get you the associated Manager class.
331 db is written to try to make sense of what you give it, but if all fails, it
332 will die with an error.
334 =item C<get_package_for_table $table_name>
336 Returns the package name for a table name:
338 SL::DB::Helper::Mappings::get_package_for_table('oe')
341 =item C<get_manager_package_for_table $table_name>
343 Returns the manager package name for a table name:
345 SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
346 # SL::DB::Manager::Order
348 =item C<get_table_for_package $package_name>
350 Returns the table name for a package name:
352 SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
354 SL::DB::Helper::Mappings::get_table_for_package('Order')
365 L<scripts/rose_auto_create_model.pl>
369 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
370 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>