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(
27 # tables created by cash register
28 my @cash_register_blacklist = qw(
29 ekartikel ekbon ekkunde ektext erptasten
32 my @kivitendo_blacklist = (@kivitendo_blacklist_permanent, @kivitendo_blacklist_temp, @crm_blacklist, @cash_register_blacklist);
34 # map table names to their models.
35 # unlike rails we have no singular<->plural magic.
36 # remeber: tables should be named as the plural of the model name.
37 my %kivitendo_package_names = (
38 acc_trans => 'acc_transaction',
39 audittrail => 'audit_trail',
40 'auth.clients' => 'auth_client',
41 'auth.clients_users' => 'auth_client_user',
42 'auth.clients_groups' => 'auth_client_group',
43 'auth.group' => 'auth_groups',
44 'auth.group_right' => 'auth_group_rights',
45 'auth.user' => 'auth_users',
46 'auth.user_config' => 'auth_user_configs',
47 'auth.user_group' => 'auth_user_groups',
49 ap => 'purchase_invoice',
50 background_jobs => 'background_job',
51 background_job_histories => 'background_job_history',
52 ap => 'purchase_invoice',
53 bank_accounts => 'bank_account',
54 buchungsgruppen => 'buchungsgruppe',
55 contacts => 'contact',
56 csv_import_profiles => 'csv_import_profile',
57 csv_import_profile_settings => 'csv_import_profile_setting',
58 csv_import_reports => 'csv_import_report',
59 csv_import_report_rows => 'csv_import_report_row',
60 csv_import_report_status => 'csv_import_report_status',
61 currencies => 'currency',
62 custom_variable_configs => 'custom_variable_config',
63 custom_variables => 'custom_variable',
64 custom_variables_validity => 'custom_variable_validity',
66 defaults => 'default',
67 delivery_orders => 'delivery_order',
68 delivery_order_items => 'delivery_order_item',
69 department => 'department',
70 dpt_trans => 'dpt_trans',
73 dunning_config => 'dunning_config',
74 employee => 'employee',
75 exchangerate => 'exchangerate',
76 finanzamt => 'finanzamt',
77 follow_up_access => 'follow_up_access',
78 follow_up_links => 'follow_up_link',
79 follow_ups => 'follow_up',
80 generic_translations => 'generic_translation',
81 gl => 'GLTransaction',
82 history_erp => 'history',
83 inventory => 'inventory',
84 invoice => 'invoice_item',
85 language => 'language',
86 makemodel => 'make_model',
88 orderitems => 'order_item',
91 partsgroup => 'parts_group',
92 payment_terms => 'payment_term',
93 periodic_invoices => 'periodic_invoice',
94 periodic_invoices_configs => 'periodic_invoices_config',
96 price_factors => 'price_factor',
97 pricegroup => 'pricegroup',
98 printers => 'Printer',
99 record_links => 'record_link',
100 sepa_export => 'sepa_export',
101 sepa_export_items => 'sepa_export_item',
102 schema_info => 'schema_info',
105 taxkeys => 'tax_key',
106 tax_zones => 'tax_zone',
107 todo_user_config => 'todo_user_config',
108 translation => 'translation',
109 translation_payment_terms => 'translation_payment_term',
111 units_language => 'units_language',
115 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
118 return KIVITENDO => \@kivitendo_blacklist;
121 sub get_package_names {
122 return KIVITENDO => \%kivitendo_package_names;
125 sub get_package_for_table {
126 %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
127 unless %kivitendo_tables_to_packages;
129 return $kivitendo_tables_to_packages{ $_[0] };
132 sub get_manager_package_for_table {
133 %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
134 unless %kivitendo_tables_to_manager_packages;
136 return $kivitendo_tables_to_manager_packages{ $_[0] };
139 sub get_table_for_package {
140 get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
141 %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
143 my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
144 return $kivitendo_packages_to_tables{ $package };
149 my $lookup = $kivitendo_package_names{$_[0]} ||
150 plurify($kivitendo_package_names{singlify($_[0])});
152 for my $thing ($string, $lookup) {
154 # best guess? its already the name. like part. camelize it first
155 my $class = "SL::DB::" . camelify($thing);
156 return $class if defined *{ $class. '::' };
158 # next, someone wants a manager and pluralized.
159 my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
160 return $manager if defined *{ $manager . '::' };
163 die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
186 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
190 use SL::DB::Helper::Mappings qw(@blacklist %table2model);
194 This modul stores table <-> model mappings used by the
195 L<scripts/rose_auto_create_model.pl> script. If you add a new table that has
196 custom mappings, add it here.
204 A special function provided here is C<db>. Without it you'd have to write:
206 my $part = SL::DB::Part->new(id => 1234);
207 my @all_parts = SL::DB::Manager::Part->get_all;
209 with them it becomes:
211 my $part = db('part')->new(id => 123);
212 my @all_parts = db('parts')->get_all;
214 You don't have to care about add that SL::DB:: incantation anymore. Also, a
215 simple s at the end will get you the associated Manager class.
217 db is written to try to make sense of what you give it, but if all fails, it
218 will die with an error.
220 =item C<get_package_for_table $table_name>
222 Returns the package name for a table name:
224 SL::DB::Helper::Mappings::get_package_for_table('oe')
227 =item C<get_manager_package_for_table $table_name>
229 Returns the manager package name for a table name:
231 SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
232 # SL::DB::Manager::Order
234 =item C<get_table_for_package $package_name>
236 Returns the table name for a package name:
238 SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
240 SL::DB::Helper::Mappings::get_table_for_package('Order')
251 L<scripts/rose_auto_create_model.pl>
255 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
256 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>