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   bank_transaction_acc_trans     => 'bank_transaction_acc_trans',
 
 109   buchungsgruppen                => 'buchungsgruppe',
 
 111   business                       => 'business',
 
 113   contacts                       => 'contact',
 
 114   customer                       => 'customer',
 
 115   csv_import_profiles            => 'csv_import_profile',
 
 116   csv_import_profile_settings    => 'csv_import_profile_setting',
 
 117   csv_import_reports             => 'csv_import_report',
 
 118   csv_import_report_rows         => 'csv_import_report_row',
 
 119   csv_import_report_status       => 'csv_import_report_status',
 
 120   currencies                     => 'currency',
 
 121   custom_data_export_queries     => 'CustomDataExportQuery',
 
 122   custom_data_export_query_parameters => 'CustomDataExportQueryParameter',
 
 123   custom_variable_config_partsgroups => 'custom_variable_config_partsgroup',
 
 124   custom_variable_configs        => 'custom_variable_config',
 
 125   custom_variables               => 'custom_variable',
 
 126   custom_variables_validity      => 'custom_variable_validity',
 
 128   defaults                       => 'default',
 
 129   delivery_orders                => 'delivery_order',
 
 130   delivery_order_items           => 'delivery_order_item',
 
 131   delivery_order_items_stock     => 'delivery_order_items_stock',
 
 132   delivery_terms                 => 'delivery_term',
 
 133   department                     => 'department',
 
 135   dunning                        => 'dunning',
 
 136   dunning_config                 => 'dunning_config',
 
 137   email_journal                  => 'EmailJournal',
 
 138   email_journal_attachments      => 'EmailJournalAttachment',
 
 139   employee                       => 'employee',
 
 140   employee_project_invoices      => 'EmployeeProjectInvoices',
 
 141   exchangerate                   => 'exchangerate',
 
 143   finanzamt                      => 'finanzamt',
 
 144   follow_up_access               => 'follow_up_access',
 
 145   follow_up_links                => 'follow_up_link',
 
 146   follow_ups                     => 'follow_up',
 
 147   generic_translations           => 'generic_translation',
 
 148   gl                             => 'GLTransaction',
 
 149   history_erp                    => 'history',
 
 150   inventory                      => 'inventory',
 
 151   invoice                        => 'invoice_item',
 
 152   language                       => 'language',
 
 154   letter_draft                   => 'letter_draft',
 
 155   makemodel                      => 'make_model',
 
 157   orderitems                     => 'order_item',
 
 160   partsgroup                     => 'parts_group',
 
 161   part_classifications           => 'PartClassification',
 
 162   part_customer_prices           => 'PartCustomerPrice',
 
 163   parts_price_history            => 'PartsPriceHistory',
 
 164   payment_terms                  => 'payment_term',
 
 165   periodic_invoices              => 'periodic_invoice',
 
 166   periodic_invoices_configs      => 'periodic_invoices_config',
 
 168   price_factors                  => 'price_factor',
 
 169   price_rules                    => 'price_rule',
 
 170   price_rule_items               => 'price_rule_item',
 
 171   pricegroup                     => 'pricegroup',
 
 172   printers                       => 'printer',
 
 173   project                        => 'project',
 
 174   project_participants           => 'project_participant',
 
 175   project_phase_participants     => 'project_phase_participant',
 
 176   project_phases                 => 'project_phase',
 
 177   project_roles                  => 'project_role',
 
 178   project_statuses               => 'project_status',
 
 179   project_types                  => 'project_type',
 
 180   reconciliation_links           => 'reconciliation_link',
 
 181   record_links                   => 'record_link',
 
 182   record_templates               => 'record_template',
 
 183   record_template_items          => 'record_template_item',
 
 184   requirement_spec_acceptance_statuses => 'RequirementSpecAcceptanceStatus',
 
 185   requirement_spec_complexities        => 'RequirementSpecComplexity',
 
 186   requirement_spec_item_dependencies   => 'RequirementSpecDependency',
 
 187   requirement_spec_items               => 'RequirementSpecItem',
 
 188   requirement_spec_orders              => 'RequirementSpecOrder',
 
 189   requirement_spec_parts               => 'RequirementSpecPart',
 
 190   requirement_spec_pictures            => 'RequirementSpecPicture',
 
 191   requirement_spec_predefined_texts    => 'RequirementSpecPredefinedText',
 
 192   requirement_spec_risks               => 'RequirementSpecRisk',
 
 193   requirement_spec_statuses            => 'RequirementSpecStatus',
 
 194   requirement_spec_text_blocks         => 'RequirementSpecTextBlock',
 
 195   requirement_spec_types               => 'RequirementSpecType',
 
 196   requirement_spec_versions            => 'RequirementSpecVersion',
 
 197   requirement_specs                    => 'RequirementSpec',
 
 198   sepa_export                    => 'sepa_export',
 
 199   sepa_export_items              => 'sepa_export_item',
 
 200   sepa_export_message_ids        => 'SepaExportMessageId',
 
 201   schema_info                    => 'schema_info',
 
 204   shop_images                    => 'shop_image',
 
 205   shop_orders                    => 'shop_order',
 
 206   shop_order_items               => 'shop_order_item',
 
 207   shop_parts                     => 'shop_part',
 
 209   stocktakings                   => 'stocktaking',
 
 211   taxkeys                        => 'tax_key',
 
 212   tax_zones                      => 'tax_zone',
 
 213   taxzone_charts                 => 'taxzone_chart',
 
 214   todo_user_config               => 'todo_user_config',
 
 215   transfer_type                  => 'transfer_type',
 
 216   translation                    => 'translation',
 
 217   trigger_information            => 'trigger_information',
 
 219   units_language                 => 'units_language',
 
 220   user_preferences               => 'user_preference',
 
 222   warehouse                      => 'warehouse',
 
 225 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
 
 228   return KIVITENDO => \@kivitendo_blacklist;
 
 231 sub get_package_names {
 
 232   return KIVITENDO => \%kivitendo_package_names;
 
 235 sub get_name_for_table {
 
 236   return $kivitendo_package_names{ $_[0] };
 
 239 sub get_package_for_table {
 
 240   %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
 
 241     unless %kivitendo_tables_to_packages;
 
 243   return $kivitendo_tables_to_packages{ $_[0] };
 
 246 sub get_manager_package_for_table {
 
 247   %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
 
 248     unless %kivitendo_tables_to_manager_packages;
 
 250   return $kivitendo_tables_to_manager_packages{ $_[0] };
 
 253 sub get_table_for_package {
 
 254   get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
 
 255   %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
 
 257   my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
 
 258   return $kivitendo_packages_to_tables{ $package };
 
 263   my $lookup = $kivitendo_package_names{$_[0]} ||
 
 264       plurify($kivitendo_package_names{singlify($_[0])});
 
 266   for my $thing ($string, $lookup) {
 
 268     # best guess? its already the name. like part. camelize it first
 
 269     my $class = "SL::DB::" . camelify($thing);
 
 270     return $class if defined *{ $class. '::' };
 
 272     # next, someone wants a manager and pluralized.
 
 273     my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
 
 274     return $manager if defined *{ $manager . '::' };
 
 277   die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
 
 300 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
 
 304   use SL::DB::Helper::Mappings qw(@blacklist %table2model);
 
 308 This modul stores table <-> model mappings used by the
 
 309 L<scripts/rose_auto_create_model.pl> script.  If you add a new table that has
 
 310 custom mappings, add it here.
 
 318 A special function provided here is C<db>. Without it you'd have to write:
 
 320   my $part = SL::DB::Part->new(id => 1234);
 
 321   my @all_parts = SL::DB::Manager::Part->get_all;
 
 323 with them it becomes:
 
 325   my $part = db('part')->new(id => 123);
 
 326   my @all_parts = db('parts')->get_all;
 
 328 You don't have to care about add that SL::DB:: incantation anymore. Also, a
 
 329 simple s at the end will get you the associated Manager class.
 
 331 db is written to try to make sense of what you give it, but if all fails, it
 
 332 will die with an error.
 
 334 =item C<get_package_for_table $table_name>
 
 336 Returns the package name for a table name:
 
 338   SL::DB::Helper::Mappings::get_package_for_table('oe')
 
 341 =item C<get_manager_package_for_table $table_name>
 
 343 Returns the manager package name for a table name:
 
 345   SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
 
 346   # SL::DB::Manager::Order
 
 348 =item C<get_table_for_package $package_name>
 
 350 Returns the table name for a package name:
 
 352   SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
 
 354   SL::DB::Helper::Mappings::get_table_for_package('Order')
 
 365 L<scripts/rose_auto_create_model.pl>
 
 369 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
 
 370 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>