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',
 
 102   assembly                       => 'assembly',
 
 103   assortment_items               => 'assortment_item',
 
 104   background_jobs                => 'background_job',
 
 105   background_job_histories       => 'background_job_history',
 
 106   ap                             => 'purchase_invoice',
 
 107   bank_accounts                  => 'bank_account',
 
 108   bank_transactions              => 'bank_transaction',
 
 109   bank_transaction_acc_trans     => 'bank_transaction_acc_trans',
 
 110   buchungsgruppen                => 'buchungsgruppe',
 
 112   business                       => 'business',
 
 114   contact_departments            => 'contact_department',
 
 115   contact_titles                 => 'contact_title',
 
 116   contacts                       => 'contact',
 
 117   customer                       => 'customer',
 
 118   csv_import_profiles            => 'csv_import_profile',
 
 119   csv_import_profile_settings    => 'csv_import_profile_setting',
 
 120   csv_import_reports             => 'csv_import_report',
 
 121   csv_import_report_rows         => 'csv_import_report_row',
 
 122   csv_import_report_status       => 'csv_import_report_status',
 
 123   currencies                     => 'currency',
 
 124   custom_data_export_queries     => 'CustomDataExportQuery',
 
 125   custom_data_export_query_parameters => 'CustomDataExportQueryParameter',
 
 126   custom_variable_config_partsgroups => 'custom_variable_config_partsgroup',
 
 127   custom_variable_configs        => 'custom_variable_config',
 
 128   custom_variables               => 'custom_variable',
 
 129   custom_variables_validity      => 'custom_variable_validity',
 
 131   defaults                       => 'default',
 
 132   delivery_orders                => 'delivery_order',
 
 133   delivery_order_items           => 'delivery_order_item',
 
 134   delivery_order_items_stock     => 'delivery_order_items_stock',
 
 135   delivery_terms                 => 'delivery_term',
 
 136   department                     => 'department',
 
 138   dunning                        => 'dunning',
 
 139   dunning_config                 => 'dunning_config',
 
 140   email_journal                  => 'EmailJournal',
 
 141   email_journal_attachments      => 'EmailJournalAttachment',
 
 142   employee                       => 'employee',
 
 143   employee_project_invoices      => 'EmployeeProjectInvoices',
 
 144   exchangerate                   => 'exchangerate',
 
 146   finanzamt                      => 'finanzamt',
 
 147   follow_up_access               => 'follow_up_access',
 
 148   follow_up_links                => 'follow_up_link',
 
 149   follow_ups                     => 'follow_up',
 
 150   generic_translations           => 'generic_translation',
 
 151   gl                             => 'GLTransaction',
 
 152   greetings                      => 'greeting',
 
 153   history_erp                    => 'history',
 
 154   inventory                      => 'inventory',
 
 155   invoice                        => 'invoice_item',
 
 156   language                       => 'language',
 
 158   letter_draft                   => 'letter_draft',
 
 159   makemodel                      => 'make_model',
 
 161   orderitems                     => 'order_item',
 
 164   partsgroup                     => 'parts_group',
 
 165   part_classifications           => 'PartClassification',
 
 166   part_customer_prices           => 'PartCustomerPrice',
 
 167   parts_price_history            => 'PartsPriceHistory',
 
 168   payment_terms                  => 'payment_term',
 
 169   periodic_invoices              => 'periodic_invoice',
 
 170   periodic_invoices_configs      => 'periodic_invoices_config',
 
 172   price_factors                  => 'price_factor',
 
 173   price_rules                    => 'price_rule',
 
 174   price_rule_items               => 'price_rule_item',
 
 175   pricegroup                     => 'pricegroup',
 
 176   printers                       => 'printer',
 
 177   project                        => 'project',
 
 178   project_participants           => 'project_participant',
 
 179   project_phase_participants     => 'project_phase_participant',
 
 180   project_phases                 => 'project_phase',
 
 181   project_roles                  => 'project_role',
 
 182   project_statuses               => 'project_status',
 
 183   project_types                  => 'project_type',
 
 184   reconciliation_links           => 'reconciliation_link',
 
 185   record_links                   => 'record_link',
 
 186   record_templates               => 'record_template',
 
 187   record_template_items          => 'record_template_item',
 
 188   requirement_spec_acceptance_statuses => 'RequirementSpecAcceptanceStatus',
 
 189   requirement_spec_complexities        => 'RequirementSpecComplexity',
 
 190   requirement_spec_item_dependencies   => 'RequirementSpecDependency',
 
 191   requirement_spec_items               => 'RequirementSpecItem',
 
 192   requirement_spec_orders              => 'RequirementSpecOrder',
 
 193   requirement_spec_parts               => 'RequirementSpecPart',
 
 194   requirement_spec_pictures            => 'RequirementSpecPicture',
 
 195   requirement_spec_predefined_texts    => 'RequirementSpecPredefinedText',
 
 196   requirement_spec_risks               => 'RequirementSpecRisk',
 
 197   requirement_spec_statuses            => 'RequirementSpecStatus',
 
 198   requirement_spec_text_blocks         => 'RequirementSpecTextBlock',
 
 199   requirement_spec_types               => 'RequirementSpecType',
 
 200   requirement_spec_versions            => 'RequirementSpecVersion',
 
 201   requirement_specs                    => 'RequirementSpec',
 
 202   sepa_export                    => 'sepa_export',
 
 203   sepa_export_items              => 'sepa_export_item',
 
 204   sepa_export_message_ids        => 'SepaExportMessageId',
 
 205   schema_info                    => 'schema_info',
 
 208   shop_images                    => 'shop_image',
 
 209   shop_orders                    => 'shop_order',
 
 210   shop_order_items               => 'shop_order_item',
 
 211   shop_parts                     => 'shop_part',
 
 213   stocktakings                   => 'stocktaking',
 
 215   taxkeys                        => 'tax_key',
 
 216   tax_zones                      => 'tax_zone',
 
 217   taxzone_charts                 => 'taxzone_chart',
 
 218   time_recording_articles        => 'time_recording_article',
 
 219   time_recordings                => 'time_recording',
 
 220   todo_user_config               => 'todo_user_config',
 
 221   transfer_type                  => 'transfer_type',
 
 222   translation                    => 'translation',
 
 223   trigger_information            => 'trigger_information',
 
 225   units_language                 => 'units_language',
 
 226   user_preferences               => 'user_preference',
 
 228   warehouse                      => 'warehouse',
 
 231 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
 
 234   return KIVITENDO => \@kivitendo_blacklist;
 
 237 sub get_package_names {
 
 238   return KIVITENDO => \%kivitendo_package_names;
 
 241 sub get_name_for_table {
 
 242   return $kivitendo_package_names{ $_[0] };
 
 245 sub get_package_for_table {
 
 246   %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
 
 247     unless %kivitendo_tables_to_packages;
 
 249   return $kivitendo_tables_to_packages{ $_[0] };
 
 252 sub get_manager_package_for_table {
 
 253   %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
 
 254     unless %kivitendo_tables_to_manager_packages;
 
 256   return $kivitendo_tables_to_manager_packages{ $_[0] };
 
 259 sub get_table_for_package {
 
 260   get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
 
 261   %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
 
 263   my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
 
 264   return $kivitendo_packages_to_tables{ $package };
 
 269   my $lookup = $kivitendo_package_names{$_[0]} ||
 
 270       plurify($kivitendo_package_names{singlify($_[0])});
 
 272   for my $thing ($string, $lookup) {
 
 274     # best guess? its already the name. like part. camelize it first
 
 275     my $class = "SL::DB::" . camelify($thing);
 
 276     return $class if defined *{ $class. '::' };
 
 278     # next, someone wants a manager and pluralized.
 
 279     my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
 
 280     return $manager if defined *{ $manager . '::' };
 
 283   die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
 
 306 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
 
 310   use SL::DB::Helper::Mappings qw(@blacklist %table2model);
 
 314 This modul stores table <-> model mappings used by the
 
 315 L<scripts/rose_auto_create_model.pl> script.  If you add a new table that has
 
 316 custom mappings, add it here.
 
 324 A special function provided here is C<db>. Without it you'd have to write:
 
 326   my $part = SL::DB::Part->new(id => 1234);
 
 327   my @all_parts = SL::DB::Manager::Part->get_all;
 
 329 with them it becomes:
 
 331   my $part = db('part')->new(id => 123);
 
 332   my @all_parts = db('parts')->get_all;
 
 334 You don't have to care about add that SL::DB:: incantation anymore. Also, a
 
 335 simple s at the end will get you the associated Manager class.
 
 337 db is written to try to make sense of what you give it, but if all fails, it
 
 338 will die with an error.
 
 340 =item C<get_package_for_table $table_name>
 
 342 Returns the package name for a table name:
 
 344   SL::DB::Helper::Mappings::get_package_for_table('oe')
 
 347 =item C<get_manager_package_for_table $table_name>
 
 349 Returns the manager package name for a table name:
 
 351   SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
 
 352   # SL::DB::Manager::Order
 
 354 =item C<get_table_for_package $package_name>
 
 356 Returns the table name for a package name:
 
 358   SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
 
 360   SL::DB::Helper::Mappings::get_table_for_package('Order')
 
 371 L<scripts/rose_auto_create_model.pl>
 
 375 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
 
 376 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>