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',
 
 163   orderitems                     => 'order_item',
 
 166   partsgroup                     => 'parts_group',
 
 167   part_classifications           => 'PartClassification',
 
 168   part_customer_prices           => 'PartCustomerPrice',
 
 169   parts_price_history            => 'PartsPriceHistory',
 
 170   payment_terms                  => 'payment_term',
 
 171   periodic_invoices              => 'periodic_invoice',
 
 172   periodic_invoices_configs      => 'periodic_invoices_config',
 
 174   price_factors                  => 'price_factor',
 
 175   price_rules                    => 'price_rule',
 
 176   price_rule_items               => 'price_rule_item',
 
 177   pricegroup                     => 'pricegroup',
 
 178   printers                       => 'printer',
 
 179   project                        => 'project',
 
 180   project_participants           => 'project_participant',
 
 181   project_phase_participants     => 'project_phase_participant',
 
 182   project_phases                 => 'project_phase',
 
 183   project_roles                  => 'project_role',
 
 184   project_statuses               => 'project_status',
 
 185   project_types                  => 'project_type',
 
 186   reconciliation_links           => 'reconciliation_link',
 
 187   record_links                   => 'record_link',
 
 188   record_templates               => 'record_template',
 
 189   record_template_items          => 'record_template_item',
 
 190   requirement_spec_acceptance_statuses => 'RequirementSpecAcceptanceStatus',
 
 191   requirement_spec_complexities        => 'RequirementSpecComplexity',
 
 192   requirement_spec_item_dependencies   => 'RequirementSpecDependency',
 
 193   requirement_spec_items               => 'RequirementSpecItem',
 
 194   requirement_spec_orders              => 'RequirementSpecOrder',
 
 195   requirement_spec_parts               => 'RequirementSpecPart',
 
 196   requirement_spec_pictures            => 'RequirementSpecPicture',
 
 197   requirement_spec_predefined_texts    => 'RequirementSpecPredefinedText',
 
 198   requirement_spec_risks               => 'RequirementSpecRisk',
 
 199   requirement_spec_statuses            => 'RequirementSpecStatus',
 
 200   requirement_spec_text_blocks         => 'RequirementSpecTextBlock',
 
 201   requirement_spec_types               => 'RequirementSpecType',
 
 202   requirement_spec_versions            => 'RequirementSpecVersion',
 
 203   requirement_specs                    => 'RequirementSpec',
 
 204   sepa_export                    => 'sepa_export',
 
 205   sepa_export_items              => 'sepa_export_item',
 
 206   sepa_export_message_ids        => 'SepaExportMessageId',
 
 207   schema_info                    => 'schema_info',
 
 210   shop_images                    => 'shop_image',
 
 211   shop_orders                    => 'shop_order',
 
 212   shop_order_items               => 'shop_order_item',
 
 213   shop_parts                     => 'shop_part',
 
 215   stocktakings                   => 'stocktaking',
 
 217   taxkeys                        => 'tax_key',
 
 218   tax_zones                      => 'tax_zone',
 
 219   taxzone_charts                 => 'taxzone_chart',
 
 220   time_recording_articles        => 'time_recording_article',
 
 221   time_recordings                => 'time_recording',
 
 222   todo_user_config               => 'todo_user_config',
 
 223   transfer_type                  => 'transfer_type',
 
 224   translation                    => 'translation',
 
 225   trigger_information            => 'trigger_information',
 
 227   units_language                 => 'units_language',
 
 228   user_preferences               => 'user_preference',
 
 230   warehouse                      => 'warehouse',
 
 233 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
 
 236   return KIVITENDO => \@kivitendo_blacklist;
 
 239 sub get_package_names {
 
 240   return KIVITENDO => \%kivitendo_package_names;
 
 243 sub get_name_for_table {
 
 244   return $kivitendo_package_names{ $_[0] };
 
 247 sub get_package_for_table {
 
 248   %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
 
 249     unless %kivitendo_tables_to_packages;
 
 251   return $kivitendo_tables_to_packages{ $_[0] };
 
 254 sub get_manager_package_for_table {
 
 255   %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
 
 256     unless %kivitendo_tables_to_manager_packages;
 
 258   return $kivitendo_tables_to_manager_packages{ $_[0] };
 
 261 sub get_table_for_package {
 
 262   get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
 
 263   %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
 
 265   my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
 
 266   return $kivitendo_packages_to_tables{ $package };
 
 271   my $lookup = $kivitendo_package_names{$_[0]} ||
 
 272       plurify($kivitendo_package_names{singlify($_[0])});
 
 274   for my $thing ($string, $lookup) {
 
 276     # best guess? its already the name. like part. camelize it first
 
 277     my $class = "SL::DB::" . camelify($thing);
 
 278     return $class if defined *{ $class. '::' };
 
 280     # next, someone wants a manager and pluralized.
 
 281     my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
 
 282     return $manager if defined *{ $manager . '::' };
 
 285   die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
 
 308 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
 
 312   use SL::DB::Helper::Mappings qw(@blacklist %table2model);
 
 316 This modul stores table <-> model mappings used by the
 
 317 L<scripts/rose_auto_create_model.pl> script.  If you add a new table that has
 
 318 custom mappings, add it here.
 
 326 A special function provided here is C<db>. Without it you'd have to write:
 
 328   my $part = SL::DB::Part->new(id => 1234);
 
 329   my @all_parts = SL::DB::Manager::Part->get_all;
 
 331 with them it becomes:
 
 333   my $part = db('part')->new(id => 123);
 
 334   my @all_parts = db('parts')->get_all;
 
 336 You don't have to care about add that SL::DB:: incantation anymore. Also, a
 
 337 simple s at the end will get you the associated Manager class.
 
 339 db is written to try to make sense of what you give it, but if all fails, it
 
 340 will die with an error.
 
 342 =item C<get_package_for_table $table_name>
 
 344 Returns the package name for a table name:
 
 346   SL::DB::Helper::Mappings::get_package_for_table('oe')
 
 349 =item C<get_manager_package_for_table $table_name>
 
 351 Returns the manager package name for a table name:
 
 353   SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
 
 354   # SL::DB::Manager::Order
 
 356 =item C<get_table_for_package $package_name>
 
 358 Returns the table name for a package name:
 
 360   SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
 
 362   SL::DB::Helper::Mappings::get_table_for_package('Order')
 
 373 L<scripts/rose_auto_create_model.pl>
 
 377 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
 
 378 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>