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.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',
 
 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',
 
 110   business                       => 'business',
 
 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',
 
 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',
 
 134   dunning                        => 'dunning',
 
 135   dunning_config                 => 'dunning_config',
 
 136   email_journal                  => 'EmailJournal',
 
 137   email_journal_attachments      => 'EmailJournalAttachment',
 
 138   employee                       => 'employee',
 
 139   exchangerate                   => 'exchangerate',
 
 141   finanzamt                      => 'finanzamt',
 
 142   follow_up_access               => 'follow_up_access',
 
 143   follow_up_links                => 'follow_up_link',
 
 144   follow_ups                     => 'follow_up',
 
 145   generic_translations           => 'generic_translation',
 
 146   gl                             => 'GLTransaction',
 
 147   history_erp                    => 'history',
 
 148   inventory                      => 'inventory',
 
 149   invoice                        => 'invoice_item',
 
 150   language                       => 'language',
 
 152   letter_draft                   => 'letter_draft',
 
 153   makemodel                      => 'make_model',
 
 155   orderitems                     => 'order_item',
 
 158   partsgroup                     => 'parts_group',
 
 159   part_classifications           => 'PartClassification',
 
 160   part_customer_prices           => 'PartCustomerPrice',
 
 161   parts_price_history            => 'PartsPriceHistory',
 
 162   payment_terms                  => 'payment_term',
 
 163   periodic_invoices              => 'periodic_invoice',
 
 164   periodic_invoices_configs      => 'periodic_invoices_config',
 
 166   price_factors                  => 'price_factor',
 
 167   price_rules                    => 'price_rule',
 
 168   price_rule_items               => 'price_rule_item',
 
 169   pricegroup                     => 'pricegroup',
 
 170   printers                       => 'printer',
 
 171   project                        => 'project',
 
 172   project_participants           => 'project_participant',
 
 173   project_phase_participants     => 'project_phase_participant',
 
 174   project_phases                 => 'project_phase',
 
 175   project_roles                  => 'project_role',
 
 176   project_statuses               => 'project_status',
 
 177   project_types                  => 'project_type',
 
 178   reconciliation_links           => 'reconciliation_link',
 
 179   record_links                   => 'record_link',
 
 180   record_templates               => 'record_template',
 
 181   record_template_items          => 'record_template_item',
 
 182   requirement_spec_acceptance_statuses => 'RequirementSpecAcceptanceStatus',
 
 183   requirement_spec_complexities        => 'RequirementSpecComplexity',
 
 184   requirement_spec_item_dependencies   => 'RequirementSpecDependency',
 
 185   requirement_spec_items               => 'RequirementSpecItem',
 
 186   requirement_spec_orders              => 'RequirementSpecOrder',
 
 187   requirement_spec_parts               => 'RequirementSpecPart',
 
 188   requirement_spec_pictures            => 'RequirementSpecPicture',
 
 189   requirement_spec_predefined_texts    => 'RequirementSpecPredefinedText',
 
 190   requirement_spec_risks               => 'RequirementSpecRisk',
 
 191   requirement_spec_statuses            => 'RequirementSpecStatus',
 
 192   requirement_spec_text_blocks         => 'RequirementSpecTextBlock',
 
 193   requirement_spec_types               => 'RequirementSpecType',
 
 194   requirement_spec_versions            => 'RequirementSpecVersion',
 
 195   requirement_specs                    => 'RequirementSpec',
 
 196   sepa_export                    => 'sepa_export',
 
 197   sepa_export_items              => 'sepa_export_item',
 
 198   sepa_export_message_ids        => 'SepaExportMessageId',
 
 199   schema_info                    => 'schema_info',
 
 202   shop_images                    => 'shop_image',
 
 203   shop_orders                    => 'shop_order',
 
 204   shop_order_items               => 'shop_order_item',
 
 205   shop_parts                     => 'shop_part',
 
 207   stocktakings                   => 'stocktaking',
 
 209   taxkeys                        => 'tax_key',
 
 210   tax_zones                      => 'tax_zone',
 
 211   taxzone_charts                 => 'taxzone_chart',
 
 212   todo_user_config               => 'todo_user_config',
 
 213   transfer_type                  => 'transfer_type',
 
 214   translation                    => 'translation',
 
 215   trigger_information            => 'trigger_information',
 
 217   units_language                 => 'units_language',
 
 218   user_preferences               => 'user_preference',
 
 220   warehouse                      => 'warehouse',
 
 223 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
 
 226   return KIVITENDO => \@kivitendo_blacklist;
 
 229 sub get_package_names {
 
 230   return KIVITENDO => \%kivitendo_package_names;
 
 233 sub get_name_for_table {
 
 234   return $kivitendo_package_names{ $_[0] };
 
 237 sub get_package_for_table {
 
 238   %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
 
 239     unless %kivitendo_tables_to_packages;
 
 241   return $kivitendo_tables_to_packages{ $_[0] };
 
 244 sub get_manager_package_for_table {
 
 245   %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
 
 246     unless %kivitendo_tables_to_manager_packages;
 
 248   return $kivitendo_tables_to_manager_packages{ $_[0] };
 
 251 sub get_table_for_package {
 
 252   get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
 
 253   %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
 
 255   my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
 
 256   return $kivitendo_packages_to_tables{ $package };
 
 261   my $lookup = $kivitendo_package_names{$_[0]} ||
 
 262       plurify($kivitendo_package_names{singlify($_[0])});
 
 264   for my $thing ($string, $lookup) {
 
 266     # best guess? its already the name. like part. camelize it first
 
 267     my $class = "SL::DB::" . camelify($thing);
 
 268     return $class if defined *{ $class. '::' };
 
 270     # next, someone wants a manager and pluralized.
 
 271     my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
 
 272     return $manager if defined *{ $manager . '::' };
 
 275   die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
 
 298 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
 
 302   use SL::DB::Helper::Mappings qw(@blacklist %table2model);
 
 306 This modul stores table <-> model mappings used by the
 
 307 L<scripts/rose_auto_create_model.pl> script.  If you add a new table that has
 
 308 custom mappings, add it here.
 
 316 A special function provided here is C<db>. Without it you'd have to write:
 
 318   my $part = SL::DB::Part->new(id => 1234);
 
 319   my @all_parts = SL::DB::Manager::Part->get_all;
 
 321 with them it becomes:
 
 323   my $part = db('part')->new(id => 123);
 
 324   my @all_parts = db('parts')->get_all;
 
 326 You don't have to care about add that SL::DB:: incantation anymore. Also, a
 
 327 simple s at the end will get you the associated Manager class.
 
 329 db is written to try to make sense of what you give it, but if all fails, it
 
 330 will die with an error.
 
 332 =item C<get_package_for_table $table_name>
 
 334 Returns the package name for a table name:
 
 336   SL::DB::Helper::Mappings::get_package_for_table('oe')
 
 339 =item C<get_manager_package_for_table $table_name>
 
 341 Returns the manager package name for a table name:
 
 343   SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
 
 344   # SL::DB::Manager::Order
 
 346 =item C<get_table_for_package $package_name>
 
 348 Returns the table name for a package name:
 
 350   SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
 
 352   SL::DB::Helper::Mappings::get_table_for_package('Order')
 
 363 L<scripts/rose_auto_create_model.pl>
 
 367 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
 
 368 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>