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