Project

General

Profile

Download (12.6 KB) Statistics
| Branch: | Tag: | Revision:

kivitendo / SL / DB / Helper / Mappings.pm @ bc182129

1
package SL::DB::Helper::Mappings;
2

    
3
use utf8;
4
use strict;
5

    
6
use SL::Util qw(camelify);
7

    
8
require Exporter;
9
our @ISA       = qw(Exporter);
10
our @EXPORT_OK = qw(get_table_for_package get_package_for_table get_package_names);
11

    
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(
15
  leads
16
);
17

    
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(
21
);
22

    
23
# tables created by crm module
24
my @crm_blacklist = qw(
25
  blz_data
26
  bundesland
27
  contmasch
28
  contract
29
  crm
30
  crmdefaults
31
  crmemployee
32
  custmsg
33
  docfelder
34
  documents
35
  documenttotc
36
  docvorlage
37
  extra_felder
38
  geodb_changelog
39
  geodb_coordinates
40
  geodb_floatdata
41
  geodb_hierarchies
42
  geodb_intdata
43
  geodb_locations
44
  geodb_textdata
45
  geodb_type_names
46
  grpusr
47
  gruppenname
48
  history
49
  labels
50
  labeltxt
51
  mailvorlage
52
  maschine
53
  maschmat
54
  opport_status
55
  opportunity
56
  postit
57
  repauftrag
58
  telcall
59
  telcallhistory
60
  telnr
61
  tempcsvdata
62
  termdate
63
  termincat
64
  termine
65
  terminmember
66
  timetrack
67
  tt_event
68
  tt_parts
69
  wiedervorlage
70
  wissencategorie
71
  wissencontent
72
);
73

    
74
# tables created by cash register
75
my @cash_register_blacklist = qw(
76
ekartikel ekbon ekkunde ektext erptasten
77
);
78

    
79
my @kivitendo_blacklist = (@kivitendo_blacklist_permanent, @kivitendo_blacklist_temp, @crm_blacklist, @cash_register_blacklist);
80

    
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',
99
  ar                             => 'invoice',
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',
109
  bin                            => 'bin',
110
  business                       => 'business',
111
  chart                          => 'chart',
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',
126
  datev                          => 'datev',
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',
133
  drafts                         => 'draft',
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',
141
  files                          => 'file',
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',
152
  letter                         => 'letter',
153
  letter_draft                   => 'letter_draft',
154
  makemodel                      => 'make_model',
155
  notes                          => 'note',
156
  orderitems                     => 'order_item',
157
  oe                             => 'order',
158
  parts                          => 'part',
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',
166
  prices                         => 'price',
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',
201
  shipto                         => 'shipto',
202
  shops                          => 'shop',
203
  shop_images                    => 'shop_image',
204
  shop_orders                    => 'shop_order',
205
  shop_order_items               => 'shop_order_item',
206
  shop_parts                     => 'shop_part',
207
  status                         => 'status',
208
  stocktakings                   => 'stocktaking',
209
  tax                            => 'tax',
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',
217
  units                          => 'unit',
218
  units_language                 => 'units_language',
219
  user_preferences               => 'user_preference',
220
  vendor                         => 'vendor',
221
  warehouse                      => 'warehouse',
222
);
223

    
224
my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
225

    
226
sub get_blacklist {
227
  return KIVITENDO => \@kivitendo_blacklist;
228
}
229

    
230
sub get_package_names {
231
  return KIVITENDO => \%kivitendo_package_names;
232
}
233

    
234
sub get_name_for_table {
235
  return $kivitendo_package_names{ $_[0] };
236
}
237

    
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;
241

    
242
  return $kivitendo_tables_to_packages{ $_[0] };
243
}
244

    
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;
248

    
249
  return $kivitendo_tables_to_manager_packages{ $_[0] };
250
}
251

    
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;
255

    
256
  my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
257
  return $kivitendo_packages_to_tables{ $package };
258
}
259

    
260
sub db {
261
  my $string = $_[0];
262
  my $lookup = $kivitendo_package_names{$_[0]} ||
263
      plurify($kivitendo_package_names{singlify($_[0])});
264

    
265
  for my $thing ($string, $lookup) {
266

    
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. '::' };
270

    
271
    # next, someone wants a manager and pluralized.
272
    my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
273
    return $manager if defined *{ $manager . '::' };
274
  }
275

    
276
  die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
277
}
278

    
279
sub plurify {
280
  my ($str) = @_;
281
  $str . 's';
282
}
283

    
284
sub singlify {
285
  my ($str) = @_;
286
  local $/ = 's';
287
  chomp $str;
288
  $str;
289
}
290

    
291
1;
292

    
293
__END__
294

    
295
=encoding utf8
296

    
297
=head1 NAME
298

    
299
SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
300

    
301
=head1 SYNOPSIS
302

    
303
  use SL::DB::Helper::Mappings qw(@blacklist %table2model);
304

    
305
=head1 DESCRIPTION
306

    
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.
310

    
311
=head1 FUNCTIONS
312

    
313
=over 4
314

    
315
=item C<db $name>
316

    
317
A special function provided here is C<db>. Without it you'd have to write:
318

    
319
  my $part = SL::DB::Part->new(id => 1234);
320
  my @all_parts = SL::DB::Manager::Part->get_all;
321

    
322
with them it becomes:
323

    
324
  my $part = db('part')->new(id => 123);
325
  my @all_parts = db('parts')->get_all;
326

    
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.
329

    
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.
332

    
333
=item C<get_package_for_table $table_name>
334

    
335
Returns the package name for a table name:
336

    
337
  SL::DB::Helper::Mappings::get_package_for_table('oe')
338
  # SL::DB::Order
339

    
340
=item C<get_manager_package_for_table $table_name>
341

    
342
Returns the manager package name for a table name:
343

    
344
  SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
345
  # SL::DB::Manager::Order
346

    
347
=item C<get_table_for_package $package_name>
348

    
349
Returns the table name for a package name:
350

    
351
  SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
352
  # oe
353
  SL::DB::Helper::Mappings::get_table_for_package('Order')
354
  # oe
355

    
356
=back
357

    
358
=head1 BUGS
359

    
360
nothing yet
361

    
362
=head1 SEE ALSO
363

    
364
L<scripts/rose_auto_create_model.pl>
365

    
366
=head1 AUTHOR
367

    
368
Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
369
Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
370

    
371
=cut