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.user' => 'auth_user',
93 'auth.user_config' => 'auth_user_config',
94 'auth.user_group' => 'auth_user_group',
96 ap => 'purchase_invoice',
97 assembly => 'assembly',
98 background_jobs => 'background_job',
99 background_job_histories => 'background_job_history',
100 ap => 'purchase_invoice',
101 bank_accounts => 'bank_account',
102 buchungsgruppen => 'buchungsgruppe',
104 business => 'business',
106 contacts => 'contact',
107 customer => 'customer',
108 csv_import_profiles => 'csv_import_profile',
109 csv_import_profile_settings => 'csv_import_profile_setting',
110 csv_import_reports => 'csv_import_report',
111 csv_import_report_rows => 'csv_import_report_row',
112 csv_import_report_status => 'csv_import_report_status',
113 currencies => 'currency',
114 custom_variable_config_partsgroups => 'custom_variable_config_partsgroup',
115 custom_variable_configs => 'custom_variable_config',
116 custom_variables => 'custom_variable',
117 custom_variables_validity => 'custom_variable_validity',
119 defaults => 'default',
120 delivery_orders => 'delivery_order',
121 delivery_order_items => 'delivery_order_item',
122 delivery_order_items_stock => 'delivery_order_items_stock',
123 delivery_terms => 'delivery_term',
124 department => 'department',
126 dunning => 'dunning',
127 dunning_config => 'dunning_config',
128 employee => 'employee',
129 exchangerate => 'exchangerate',
130 finanzamt => 'finanzamt',
131 follow_up_access => 'follow_up_access',
132 follow_up_links => 'follow_up_link',
133 follow_ups => 'follow_up',
134 generic_translations => 'generic_translation',
135 gl => 'GLTransaction',
136 history_erp => 'history',
137 inventory => 'inventory',
138 invoice => 'invoice_item',
139 language => 'language',
140 makemodel => 'make_model',
142 orderitems => 'order_item',
145 partsgroup => 'parts_group',
146 payment_terms => 'payment_term',
147 periodic_invoices => 'periodic_invoice',
148 periodic_invoices_configs => 'periodic_invoices_config',
150 price_factors => 'price_factor',
151 pricegroup => 'pricegroup',
152 printers => 'printer',
153 project => 'project',
154 project_participants => 'project_participant',
155 project_phase_participants => 'project_phase_participant',
156 project_phases => 'project_phase',
157 project_roles => 'project_role',
158 project_statuses => 'project_status',
159 project_types => 'project_type',
160 record_links => 'record_link',
161 requirement_spec_acceptance_statuses => 'RequirementSpecAcceptanceStatus',
162 requirement_spec_complexities => 'RequirementSpecComplexity',
163 requirement_spec_item_dependencies => 'RequirementSpecDependency',
164 requirement_spec_items => 'RequirementSpecItem',
165 requirement_spec_orders => 'RequirementSpecOrder',
166 requirement_spec_parts => 'RequirementSpecPart',
167 requirement_spec_pictures => 'RequirementSpecPicture',
168 requirement_spec_predefined_texts => 'RequirementSpecPredefinedText',
169 requirement_spec_risks => 'RequirementSpecRisk',
170 requirement_spec_statuses => 'RequirementSpecStatus',
171 requirement_spec_text_blocks => 'RequirementSpecTextBlock',
172 requirement_spec_types => 'RequirementSpecType',
173 requirement_spec_versions => 'RequirementSpecVersion',
174 requirement_specs => 'RequirementSpec',
175 sepa_export => 'sepa_export',
176 sepa_export_items => 'sepa_export_item',
177 schema_info => 'schema_info',
181 taxkeys => 'tax_key',
182 tax_zones => 'tax_zone',
183 taxzone_charts => 'taxzone_chart',
184 todo_user_config => 'todo_user_config',
185 transfer_type => 'transfer_type',
186 translation => 'translation',
187 trigger_information => 'trigger_information',
189 units_language => 'units_language',
191 warehouse => 'warehouse',
194 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
197 return KIVITENDO => \@kivitendo_blacklist;
200 sub get_package_names {
201 return KIVITENDO => \%kivitendo_package_names;
204 sub get_package_for_table {
205 %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
206 unless %kivitendo_tables_to_packages;
208 return $kivitendo_tables_to_packages{ $_[0] };
211 sub get_manager_package_for_table {
212 %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
213 unless %kivitendo_tables_to_manager_packages;
215 return $kivitendo_tables_to_manager_packages{ $_[0] };
218 sub get_table_for_package {
219 get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
220 %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
222 my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
223 return $kivitendo_packages_to_tables{ $package };
228 my $lookup = $kivitendo_package_names{$_[0]} ||
229 plurify($kivitendo_package_names{singlify($_[0])});
231 for my $thing ($string, $lookup) {
233 # best guess? its already the name. like part. camelize it first
234 my $class = "SL::DB::" . camelify($thing);
235 return $class if defined *{ $class. '::' };
237 # next, someone wants a manager and pluralized.
238 my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
239 return $manager if defined *{ $manager . '::' };
242 die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
265 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
269 use SL::DB::Helper::Mappings qw(@blacklist %table2model);
273 This modul stores table <-> model mappings used by the
274 L<scripts/rose_auto_create_model.pl> script. If you add a new table that has
275 custom mappings, add it here.
283 A special function provided here is C<db>. Without it you'd have to write:
285 my $part = SL::DB::Part->new(id => 1234);
286 my @all_parts = SL::DB::Manager::Part->get_all;
288 with them it becomes:
290 my $part = db('part')->new(id => 123);
291 my @all_parts = db('parts')->get_all;
293 You don't have to care about add that SL::DB:: incantation anymore. Also, a
294 simple s at the end will get you the associated Manager class.
296 db is written to try to make sense of what you give it, but if all fails, it
297 will die with an error.
299 =item C<get_package_for_table $table_name>
301 Returns the package name for a table name:
303 SL::DB::Helper::Mappings::get_package_for_table('oe')
306 =item C<get_manager_package_for_table $table_name>
308 Returns the manager package name for a table name:
310 SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
311 # SL::DB::Manager::Order
313 =item C<get_table_for_package $package_name>
315 Returns the table name for a package name:
317 SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
319 SL::DB::Helper::Mappings::get_table_for_package('Order')
330 L<scripts/rose_auto_create_model.pl>
334 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
335 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>