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