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 employee_project_invoices => 'EmployeeProjectInvoices',
140 exchangerate => 'exchangerate',
142 finanzamt => 'finanzamt',
143 follow_up_access => 'follow_up_access',
144 follow_up_links => 'follow_up_link',
145 follow_ups => 'follow_up',
146 generic_translations => 'generic_translation',
147 gl => 'GLTransaction',
148 history_erp => 'history',
149 inventory => 'inventory',
150 invoice => 'invoice_item',
151 language => 'language',
153 letter_draft => 'letter_draft',
154 makemodel => 'make_model',
156 orderitems => 'order_item',
159 partsgroup => 'parts_group',
160 part_classifications => 'PartClassification',
161 part_customer_prices => 'PartCustomerPrice',
162 parts_price_history => 'PartsPriceHistory',
163 payment_terms => 'payment_term',
164 periodic_invoices => 'periodic_invoice',
165 periodic_invoices_configs => 'periodic_invoices_config',
167 price_factors => 'price_factor',
168 price_rules => 'price_rule',
169 price_rule_items => 'price_rule_item',
170 pricegroup => 'pricegroup',
171 printers => 'printer',
172 project => 'project',
173 project_participants => 'project_participant',
174 project_phase_participants => 'project_phase_participant',
175 project_phases => 'project_phase',
176 project_roles => 'project_role',
177 project_statuses => 'project_status',
178 project_types => 'project_type',
179 reconciliation_links => 'reconciliation_link',
180 record_links => 'record_link',
181 record_templates => 'record_template',
182 record_template_items => 'record_template_item',
183 requirement_spec_acceptance_statuses => 'RequirementSpecAcceptanceStatus',
184 requirement_spec_complexities => 'RequirementSpecComplexity',
185 requirement_spec_item_dependencies => 'RequirementSpecDependency',
186 requirement_spec_items => 'RequirementSpecItem',
187 requirement_spec_orders => 'RequirementSpecOrder',
188 requirement_spec_parts => 'RequirementSpecPart',
189 requirement_spec_pictures => 'RequirementSpecPicture',
190 requirement_spec_predefined_texts => 'RequirementSpecPredefinedText',
191 requirement_spec_risks => 'RequirementSpecRisk',
192 requirement_spec_statuses => 'RequirementSpecStatus',
193 requirement_spec_text_blocks => 'RequirementSpecTextBlock',
194 requirement_spec_types => 'RequirementSpecType',
195 requirement_spec_versions => 'RequirementSpecVersion',
196 requirement_specs => 'RequirementSpec',
197 sepa_export => 'sepa_export',
198 sepa_export_items => 'sepa_export_item',
199 sepa_export_message_ids => 'SepaExportMessageId',
200 schema_info => 'schema_info',
203 shop_images => 'shop_image',
204 shop_orders => 'shop_order',
205 shop_order_items => 'shop_order_item',
206 shop_parts => 'shop_part',
208 stocktakings => 'stocktaking',
210 taxkeys => 'tax_key',
211 tax_zones => 'tax_zone',
212 taxzone_charts => 'taxzone_chart',
213 todo_user_config => 'todo_user_config',
214 transfer_type => 'transfer_type',
215 translation => 'translation',
216 trigger_information => 'trigger_information',
218 units_language => 'units_language',
219 user_preferences => 'user_preference',
221 warehouse => 'warehouse',
224 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
227 return KIVITENDO => \@kivitendo_blacklist;
230 sub get_package_names {
231 return KIVITENDO => \%kivitendo_package_names;
234 sub get_name_for_table {
235 return $kivitendo_package_names{ $_[0] };
238 sub get_package_for_table {
239 %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
240 unless %kivitendo_tables_to_packages;
242 return $kivitendo_tables_to_packages{ $_[0] };
245 sub get_manager_package_for_table {
246 %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
247 unless %kivitendo_tables_to_manager_packages;
249 return $kivitendo_tables_to_manager_packages{ $_[0] };
252 sub get_table_for_package {
253 get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
254 %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
256 my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
257 return $kivitendo_packages_to_tables{ $package };
262 my $lookup = $kivitendo_package_names{$_[0]} ||
263 plurify($kivitendo_package_names{singlify($_[0])});
265 for my $thing ($string, $lookup) {
267 # best guess? its already the name. like part. camelize it first
268 my $class = "SL::DB::" . camelify($thing);
269 return $class if defined *{ $class. '::' };
271 # next, someone wants a manager and pluralized.
272 my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
273 return $manager if defined *{ $manager . '::' };
276 die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
299 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
303 use SL::DB::Helper::Mappings qw(@blacklist %table2model);
307 This modul stores table <-> model mappings used by the
308 L<scripts/rose_auto_create_model.pl> script. If you add a new table that has
309 custom mappings, add it here.
317 A special function provided here is C<db>. Without it you'd have to write:
319 my $part = SL::DB::Part->new(id => 1234);
320 my @all_parts = SL::DB::Manager::Part->get_all;
322 with them it becomes:
324 my $part = db('part')->new(id => 123);
325 my @all_parts = db('parts')->get_all;
327 You don't have to care about add that SL::DB:: incantation anymore. Also, a
328 simple s at the end will get you the associated Manager class.
330 db is written to try to make sense of what you give it, but if all fails, it
331 will die with an error.
333 =item C<get_package_for_table $table_name>
335 Returns the package name for a table name:
337 SL::DB::Helper::Mappings::get_package_for_table('oe')
340 =item C<get_manager_package_for_table $table_name>
342 Returns the manager package name for a table name:
344 SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
345 # SL::DB::Manager::Order
347 =item C<get_table_for_package $package_name>
349 Returns the table name for a package name:
351 SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
353 SL::DB::Helper::Mappings::get_table_for_package('Order')
364 L<scripts/rose_auto_create_model.pl>
368 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
369 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>