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   additional_billing_addresses   => 'additional_billing_address',
 
  88   'auth.clients'                 => 'auth_client',
 
  89   'auth.clients_users'           => 'auth_client_user',
 
  90   'auth.clients_groups'          => 'auth_client_group',
 
  91   'auth.group'                   => 'auth_group',
 
  92   'auth.group_rights'            => 'auth_group_right',
 
  93   'auth.master_rights'           => 'auth_master_right',
 
  94   'auth.schema_info'             => 'auth_schema_info',
 
  95   'auth.session'                 => 'auth_session',
 
  96   'auth.session_content'         => 'auth_session_content',
 
  97   'auth.user'                    => 'auth_user',
 
  98   'auth.user_config'             => 'auth_user_config',
 
  99   'auth.user_group'              => 'auth_user_group',
 
 101   ap                             => 'purchase_invoice',
 
 103   assembly                       => 'assembly',
 
 104   assortment_items               => 'assortment_item',
 
 105   background_jobs                => 'background_job',
 
 106   background_job_histories       => 'background_job_history',
 
 107   ap                             => 'purchase_invoice',
 
 108   bank_accounts                  => 'bank_account',
 
 109   bank_transactions              => 'bank_transaction',
 
 110   bank_transaction_acc_trans     => 'bank_transaction_acc_trans',
 
 111   buchungsgruppen                => 'buchungsgruppe',
 
 113   business                       => 'business',
 
 115   contact_departments            => 'contact_department',
 
 116   contact_titles                 => 'contact_title',
 
 117   contacts                       => 'contact',
 
 118   customer                       => 'customer',
 
 119   csv_import_profiles            => 'csv_import_profile',
 
 120   csv_import_profile_settings    => 'csv_import_profile_setting',
 
 121   csv_import_reports             => 'csv_import_report',
 
 122   csv_import_report_rows         => 'csv_import_report_row',
 
 123   csv_import_report_status       => 'csv_import_report_status',
 
 124   currencies                     => 'currency',
 
 125   custom_data_export_queries     => 'CustomDataExportQuery',
 
 126   custom_data_export_query_parameters => 'CustomDataExportQueryParameter',
 
 127   custom_variable_config_partsgroups => 'custom_variable_config_partsgroup',
 
 128   custom_variable_configs        => 'custom_variable_config',
 
 129   custom_variables               => 'custom_variable',
 
 130   custom_variables_validity      => 'custom_variable_validity',
 
 132   defaults                       => 'default',
 
 133   delivery_orders                => 'delivery_order',
 
 134   delivery_order_items           => 'delivery_order_item',
 
 135   delivery_order_items_stock     => 'delivery_order_items_stock',
 
 136   delivery_terms                 => 'delivery_term',
 
 137   department                     => 'department',
 
 139   dunning                        => 'dunning',
 
 140   dunning_config                 => 'dunning_config',
 
 141   email_journal                  => 'EmailJournal',
 
 142   email_journal_attachments      => 'EmailJournalAttachment',
 
 143   employee                       => 'employee',
 
 144   employee_project_invoices      => 'EmployeeProjectInvoices',
 
 145   exchangerate                   => 'exchangerate',
 
 147   file_full_texts                => 'file_full_text',
 
 148   finanzamt                      => 'finanzamt',
 
 149   follow_up_access               => 'follow_up_access',
 
 150   follow_up_links                => 'follow_up_link',
 
 151   follow_ups                     => 'follow_up',
 
 152   generic_translations           => 'generic_translation',
 
 153   gl                             => 'GLTransaction',
 
 154   greetings                      => 'greeting',
 
 155   history_erp                    => 'history',
 
 156   inventory                      => 'inventory',
 
 157   invoice                        => 'invoice_item',
 
 158   language                       => 'language',
 
 160   letter_draft                   => 'letter_draft',
 
 161   makemodel                      => 'make_model',
 
 162   mebil_mapping                  => 'mebil_mapping',
 
 164   orderitems                     => 'order_item',
 
 167   partsgroup                     => 'parts_group',
 
 168   part_classifications           => 'PartClassification',
 
 169   part_customer_prices           => 'PartCustomerPrice',
 
 170   parts_price_history            => 'PartsPriceHistory',
 
 171   payment_terms                  => 'payment_term',
 
 172   periodic_invoices              => 'periodic_invoice',
 
 173   periodic_invoices_configs      => 'periodic_invoices_config',
 
 175   price_factors                  => 'price_factor',
 
 176   price_rules                    => 'price_rule',
 
 177   price_rule_items               => 'price_rule_item',
 
 178   pricegroup                     => 'pricegroup',
 
 179   printers                       => 'printer',
 
 180   project                        => 'project',
 
 181   project_participants           => 'project_participant',
 
 182   project_phase_participants     => 'project_phase_participant',
 
 183   project_phases                 => 'project_phase',
 
 184   project_roles                  => 'project_role',
 
 185   project_statuses               => 'project_status',
 
 186   project_types                  => 'project_type',
 
 187   reconciliation_links           => 'reconciliation_link',
 
 188   record_links                   => 'record_link',
 
 189   record_templates               => 'record_template',
 
 190   record_template_items          => 'record_template_item',
 
 191   requirement_spec_acceptance_statuses => 'RequirementSpecAcceptanceStatus',
 
 192   requirement_spec_complexities        => 'RequirementSpecComplexity',
 
 193   requirement_spec_item_dependencies   => 'RequirementSpecDependency',
 
 194   requirement_spec_items               => 'RequirementSpecItem',
 
 195   requirement_spec_orders              => 'RequirementSpecOrder',
 
 196   requirement_spec_parts               => 'RequirementSpecPart',
 
 197   requirement_spec_pictures            => 'RequirementSpecPicture',
 
 198   requirement_spec_predefined_texts    => 'RequirementSpecPredefinedText',
 
 199   requirement_spec_risks               => 'RequirementSpecRisk',
 
 200   requirement_spec_statuses            => 'RequirementSpecStatus',
 
 201   requirement_spec_text_blocks         => 'RequirementSpecTextBlock',
 
 202   requirement_spec_types               => 'RequirementSpecType',
 
 203   requirement_spec_versions            => 'RequirementSpecVersion',
 
 204   requirement_specs                    => 'RequirementSpec',
 
 205   sepa_export                    => 'sepa_export',
 
 206   sepa_export_items              => 'sepa_export_item',
 
 207   sepa_export_message_ids        => 'SepaExportMessageId',
 
 208   schema_info                    => 'schema_info',
 
 211   shop_images                    => 'shop_image',
 
 212   shop_orders                    => 'shop_order',
 
 213   shop_order_items               => 'shop_order_item',
 
 214   shop_parts                     => 'shop_part',
 
 216   stocktakings                   => 'stocktaking',
 
 218   taxkeys                        => 'tax_key',
 
 219   tax_zones                      => 'tax_zone',
 
 220   taxzone_charts                 => 'taxzone_chart',
 
 221   time_recording_articles        => 'time_recording_article',
 
 222   time_recordings                => 'time_recording',
 
 223   todo_user_config               => 'todo_user_config',
 
 224   transfer_type                  => 'transfer_type',
 
 225   translation                    => 'translation',
 
 226   trigger_information            => 'trigger_information',
 
 228   units_language                 => 'units_language',
 
 229   user_preferences               => 'user_preference',
 
 231   warehouse                      => 'warehouse',
 
 234 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
 
 237   return KIVITENDO => \@kivitendo_blacklist;
 
 240 sub get_package_names {
 
 241   return KIVITENDO => \%kivitendo_package_names;
 
 244 sub get_name_for_table {
 
 245   return $kivitendo_package_names{ $_[0] };
 
 248 sub get_package_for_table {
 
 249   %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
 
 250     unless %kivitendo_tables_to_packages;
 
 252   return $kivitendo_tables_to_packages{ $_[0] };
 
 255 sub get_manager_package_for_table {
 
 256   %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
 
 257     unless %kivitendo_tables_to_manager_packages;
 
 259   return $kivitendo_tables_to_manager_packages{ $_[0] };
 
 262 sub get_table_for_package {
 
 263   get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
 
 264   %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
 
 266   my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
 
 267   return $kivitendo_packages_to_tables{ $package };
 
 272   my $lookup = $kivitendo_package_names{$_[0]} ||
 
 273       plurify($kivitendo_package_names{singlify($_[0])});
 
 275   for my $thing ($string, $lookup) {
 
 277     # best guess? its already the name. like part. camelize it first
 
 278     my $class = "SL::DB::" . camelify($thing);
 
 279     return $class if defined *{ $class. '::' };
 
 281     # next, someone wants a manager and pluralized.
 
 282     my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
 
 283     return $manager if defined *{ $manager . '::' };
 
 286   die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
 
 309 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
 
 313   use SL::DB::Helper::Mappings qw(@blacklist %table2model);
 
 317 This modul stores table <-> model mappings used by the
 
 318 L<scripts/rose_auto_create_model.pl> script.  If you add a new table that has
 
 319 custom mappings, add it here.
 
 327 A special function provided here is C<db>. Without it you'd have to write:
 
 329   my $part = SL::DB::Part->new(id => 1234);
 
 330   my @all_parts = SL::DB::Manager::Part->get_all;
 
 332 with them it becomes:
 
 334   my $part = db('part')->new(id => 123);
 
 335   my @all_parts = db('parts')->get_all;
 
 337 You don't have to care about add that SL::DB:: incantation anymore. Also, a
 
 338 simple s at the end will get you the associated Manager class.
 
 340 db is written to try to make sense of what you give it, but if all fails, it
 
 341 will die with an error.
 
 343 =item C<get_package_for_table $table_name>
 
 345 Returns the package name for a table name:
 
 347   SL::DB::Helper::Mappings::get_package_for_table('oe')
 
 350 =item C<get_manager_package_for_table $table_name>
 
 352 Returns the manager package name for a table name:
 
 354   SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
 
 355   # SL::DB::Manager::Order
 
 357 =item C<get_table_for_package $package_name>
 
 359 Returns the table name for a package name:
 
 361   SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
 
 363   SL::DB::Helper::Mappings::get_table_for_package('Order')
 
 374 L<scripts/rose_auto_create_model.pl>
 
 378 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
 
 379 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>