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   bank_transactions              => 'bank_transaction',
 
 103   buchungsgruppen                => 'buchungsgruppe',
 
 105   business                       => 'business',
 
 107   contacts                       => 'contact',
 
 108   customer                       => 'customer',
 
 109   csv_import_profiles            => 'csv_import_profile',
 
 110   csv_import_profile_settings    => 'csv_import_profile_setting',
 
 111   csv_import_reports             => 'csv_import_report',
 
 112   csv_import_report_rows         => 'csv_import_report_row',
 
 113   csv_import_report_status       => 'csv_import_report_status',
 
 114   currencies                     => 'currency',
 
 115   custom_variable_config_partsgroups => 'custom_variable_config_partsgroup',
 
 116   custom_variable_configs        => 'custom_variable_config',
 
 117   custom_variables               => 'custom_variable',
 
 118   custom_variables_validity      => 'custom_variable_validity',
 
 120   defaults                       => 'default',
 
 121   delivery_orders                => 'delivery_order',
 
 122   delivery_order_items           => 'delivery_order_item',
 
 123   delivery_order_items_stock     => 'delivery_order_items_stock',
 
 124   delivery_terms                 => 'delivery_term',
 
 125   department                     => 'department',
 
 127   dunning                        => 'dunning',
 
 128   dunning_config                 => 'dunning_config',
 
 129   employee                       => 'employee',
 
 130   exchangerate                   => 'exchangerate',
 
 131   finanzamt                      => 'finanzamt',
 
 132   follow_up_access               => 'follow_up_access',
 
 133   follow_up_links                => 'follow_up_link',
 
 134   follow_ups                     => 'follow_up',
 
 135   generic_translations           => 'generic_translation',
 
 136   gl                             => 'GLTransaction',
 
 137   history_erp                    => 'history',
 
 138   inventory                      => 'inventory',
 
 139   invoice                        => 'invoice_item',
 
 140   language                       => 'language',
 
 142   letter_draft                   => 'letter_draft',
 
 143   makemodel                      => 'make_model',
 
 145   orderitems                     => 'order_item',
 
 148   partsgroup                     => 'parts_group',
 
 149   payment_terms                  => 'payment_term',
 
 150   periodic_invoices              => 'periodic_invoice',
 
 151   periodic_invoices_configs      => 'periodic_invoices_config',
 
 153   price_factors                  => 'price_factor',
 
 154   price_rules                    => 'price_rule',
 
 155   price_rule_items               => 'price_rule_item',
 
 156   pricegroup                     => 'pricegroup',
 
 157   printers                       => 'printer',
 
 158   project                        => 'project',
 
 159   project_participants           => 'project_participant',
 
 160   project_phase_participants     => 'project_phase_participant',
 
 161   project_phases                 => 'project_phase',
 
 162   project_roles                  => 'project_role',
 
 163   project_statuses               => 'project_status',
 
 164   project_types                  => 'project_type',
 
 165   record_links                   => 'record_link',
 
 166   reconciliation_links           => 'reconciliation_link',
 
 167   requirement_spec_acceptance_statuses => 'RequirementSpecAcceptanceStatus',
 
 168   requirement_spec_complexities        => 'RequirementSpecComplexity',
 
 169   requirement_spec_item_dependencies   => 'RequirementSpecDependency',
 
 170   requirement_spec_items               => 'RequirementSpecItem',
 
 171   requirement_spec_orders              => 'RequirementSpecOrder',
 
 172   requirement_spec_parts               => 'RequirementSpecPart',
 
 173   requirement_spec_pictures            => 'RequirementSpecPicture',
 
 174   requirement_spec_predefined_texts    => 'RequirementSpecPredefinedText',
 
 175   requirement_spec_risks               => 'RequirementSpecRisk',
 
 176   requirement_spec_statuses            => 'RequirementSpecStatus',
 
 177   requirement_spec_text_blocks         => 'RequirementSpecTextBlock',
 
 178   requirement_spec_types               => 'RequirementSpecType',
 
 179   requirement_spec_versions            => 'RequirementSpecVersion',
 
 180   requirement_specs                    => 'RequirementSpec',
 
 181   sepa_export                    => 'sepa_export',
 
 182   sepa_export_items              => 'sepa_export_item',
 
 183   schema_info                    => 'schema_info',
 
 187   taxkeys                        => 'tax_key',
 
 188   tax_zones                      => 'tax_zone',
 
 189   taxzone_charts                 => 'taxzone_chart',
 
 190   todo_user_config               => 'todo_user_config',
 
 191   transfer_type                  => 'transfer_type',
 
 192   translation                    => 'translation',
 
 193   trigger_information            => 'trigger_information',
 
 195   units_language                 => 'units_language',
 
 197   warehouse                      => 'warehouse',
 
 200 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
 
 203   return KIVITENDO => \@kivitendo_blacklist;
 
 206 sub get_package_names {
 
 207   return KIVITENDO => \%kivitendo_package_names;
 
 210 sub get_name_for_table {
 
 211   return $kivitendo_package_names{ $_[0] };
 
 214 sub get_package_for_table {
 
 215   %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
 
 216     unless %kivitendo_tables_to_packages;
 
 218   return $kivitendo_tables_to_packages{ $_[0] };
 
 221 sub get_manager_package_for_table {
 
 222   %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
 
 223     unless %kivitendo_tables_to_manager_packages;
 
 225   return $kivitendo_tables_to_manager_packages{ $_[0] };
 
 228 sub get_table_for_package {
 
 229   get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
 
 230   %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
 
 232   my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
 
 233   return $kivitendo_packages_to_tables{ $package };
 
 238   my $lookup = $kivitendo_package_names{$_[0]} ||
 
 239       plurify($kivitendo_package_names{singlify($_[0])});
 
 241   for my $thing ($string, $lookup) {
 
 243     # best guess? its already the name. like part. camelize it first
 
 244     my $class = "SL::DB::" . camelify($thing);
 
 245     return $class if defined *{ $class. '::' };
 
 247     # next, someone wants a manager and pluralized.
 
 248     my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
 
 249     return $manager if defined *{ $manager . '::' };
 
 252   die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
 
 275 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
 
 279   use SL::DB::Helper::Mappings qw(@blacklist %table2model);
 
 283 This modul stores table <-> model mappings used by the
 
 284 L<scripts/rose_auto_create_model.pl> script.  If you add a new table that has
 
 285 custom mappings, add it here.
 
 293 A special function provided here is C<db>. Without it you'd have to write:
 
 295   my $part = SL::DB::Part->new(id => 1234);
 
 296   my @all_parts = SL::DB::Manager::Part->get_all;
 
 298 with them it becomes:
 
 300   my $part = db('part')->new(id => 123);
 
 301   my @all_parts = db('parts')->get_all;
 
 303 You don't have to care about add that SL::DB:: incantation anymore. Also, a
 
 304 simple s at the end will get you the associated Manager class.
 
 306 db is written to try to make sense of what you give it, but if all fails, it
 
 307 will die with an error.
 
 309 =item C<get_package_for_table $table_name>
 
 311 Returns the package name for a table name:
 
 313   SL::DB::Helper::Mappings::get_package_for_table('oe')
 
 316 =item C<get_manager_package_for_table $table_name>
 
 318 Returns the manager package name for a table name:
 
 320   SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
 
 321   # SL::DB::Manager::Order
 
 323 =item C<get_table_for_package $package_name>
 
 325 Returns the table name for a package name:
 
 327   SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
 
 329   SL::DB::Helper::Mappings::get_table_for_package('Order')
 
 340 L<scripts/rose_auto_create_model.pl>
 
 344 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
 
 345 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>