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 greetings => 'greeting',
150 history_erp => 'history',
151 inventory => 'inventory',
152 invoice => 'invoice_item',
153 language => 'language',
155 letter_draft => 'letter_draft',
156 makemodel => 'make_model',
158 orderitems => 'order_item',
161 partsgroup => 'parts_group',
162 part_classifications => 'PartClassification',
163 part_customer_prices => 'PartCustomerPrice',
164 parts_price_history => 'PartsPriceHistory',
165 payment_terms => 'payment_term',
166 periodic_invoices => 'periodic_invoice',
167 periodic_invoices_configs => 'periodic_invoices_config',
169 price_factors => 'price_factor',
170 price_rules => 'price_rule',
171 price_rule_items => 'price_rule_item',
172 pricegroup => 'pricegroup',
173 printers => 'printer',
174 project => 'project',
175 project_participants => 'project_participant',
176 project_phase_participants => 'project_phase_participant',
177 project_phases => 'project_phase',
178 project_roles => 'project_role',
179 project_statuses => 'project_status',
180 project_types => 'project_type',
181 reconciliation_links => 'reconciliation_link',
182 record_links => 'record_link',
183 record_templates => 'record_template',
184 record_template_items => 'record_template_item',
185 requirement_spec_acceptance_statuses => 'RequirementSpecAcceptanceStatus',
186 requirement_spec_complexities => 'RequirementSpecComplexity',
187 requirement_spec_item_dependencies => 'RequirementSpecDependency',
188 requirement_spec_items => 'RequirementSpecItem',
189 requirement_spec_orders => 'RequirementSpecOrder',
190 requirement_spec_parts => 'RequirementSpecPart',
191 requirement_spec_pictures => 'RequirementSpecPicture',
192 requirement_spec_predefined_texts => 'RequirementSpecPredefinedText',
193 requirement_spec_risks => 'RequirementSpecRisk',
194 requirement_spec_statuses => 'RequirementSpecStatus',
195 requirement_spec_text_blocks => 'RequirementSpecTextBlock',
196 requirement_spec_types => 'RequirementSpecType',
197 requirement_spec_versions => 'RequirementSpecVersion',
198 requirement_specs => 'RequirementSpec',
199 sepa_export => 'sepa_export',
200 sepa_export_items => 'sepa_export_item',
201 sepa_export_message_ids => 'SepaExportMessageId',
202 schema_info => 'schema_info',
205 shop_images => 'shop_image',
206 shop_orders => 'shop_order',
207 shop_order_items => 'shop_order_item',
208 shop_parts => 'shop_part',
210 stocktakings => 'stocktaking',
212 taxkeys => 'tax_key',
213 tax_zones => 'tax_zone',
214 taxzone_charts => 'taxzone_chart',
215 todo_user_config => 'todo_user_config',
216 transfer_type => 'transfer_type',
217 translation => 'translation',
218 trigger_information => 'trigger_information',
220 units_language => 'units_language',
221 user_preferences => 'user_preference',
223 warehouse => 'warehouse',
226 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
229 return KIVITENDO => \@kivitendo_blacklist;
232 sub get_package_names {
233 return KIVITENDO => \%kivitendo_package_names;
236 sub get_name_for_table {
237 return $kivitendo_package_names{ $_[0] };
240 sub get_package_for_table {
241 %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
242 unless %kivitendo_tables_to_packages;
244 return $kivitendo_tables_to_packages{ $_[0] };
247 sub get_manager_package_for_table {
248 %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
249 unless %kivitendo_tables_to_manager_packages;
251 return $kivitendo_tables_to_manager_packages{ $_[0] };
254 sub get_table_for_package {
255 get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
256 %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
258 my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
259 return $kivitendo_packages_to_tables{ $package };
264 my $lookup = $kivitendo_package_names{$_[0]} ||
265 plurify($kivitendo_package_names{singlify($_[0])});
267 for my $thing ($string, $lookup) {
269 # best guess? its already the name. like part. camelize it first
270 my $class = "SL::DB::" . camelify($thing);
271 return $class if defined *{ $class. '::' };
273 # next, someone wants a manager and pluralized.
274 my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
275 return $manager if defined *{ $manager . '::' };
278 die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
301 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
305 use SL::DB::Helper::Mappings qw(@blacklist %table2model);
309 This modul stores table <-> model mappings used by the
310 L<scripts/rose_auto_create_model.pl> script. If you add a new table that has
311 custom mappings, add it here.
319 A special function provided here is C<db>. Without it you'd have to write:
321 my $part = SL::DB::Part->new(id => 1234);
322 my @all_parts = SL::DB::Manager::Part->get_all;
324 with them it becomes:
326 my $part = db('part')->new(id => 123);
327 my @all_parts = db('parts')->get_all;
329 You don't have to care about add that SL::DB:: incantation anymore. Also, a
330 simple s at the end will get you the associated Manager class.
332 db is written to try to make sense of what you give it, but if all fails, it
333 will die with an error.
335 =item C<get_package_for_table $table_name>
337 Returns the package name for a table name:
339 SL::DB::Helper::Mappings::get_package_for_table('oe')
342 =item C<get_manager_package_for_table $table_name>
344 Returns the manager package name for a table name:
346 SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
347 # SL::DB::Manager::Order
349 =item C<get_table_for_package $package_name>
351 Returns the table name for a package name:
353 SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
355 SL::DB::Helper::Mappings::get_table_for_package('Order')
366 L<scripts/rose_auto_create_model.pl>
370 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
371 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>