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   time_recording_types           => 'time_recording_type',
 
 218   time_recordings                => 'time_recording',
 
 219   todo_user_config               => 'todo_user_config',
 
 220   transfer_type                  => 'transfer_type',
 
 221   translation                    => 'translation',
 
 222   trigger_information            => 'trigger_information',
 
 224   units_language                 => 'units_language',
 
 225   user_preferences               => 'user_preference',
 
 227   warehouse                      => 'warehouse',
 
 230 my (%kivitendo_tables_to_packages, %kivitendo_tables_to_manager_packages, %kivitendo_packages_to_tables);
 
 233   return KIVITENDO => \@kivitendo_blacklist;
 
 236 sub get_package_names {
 
 237   return KIVITENDO => \%kivitendo_package_names;
 
 240 sub get_name_for_table {
 
 241   return $kivitendo_package_names{ $_[0] };
 
 244 sub get_package_for_table {
 
 245   %kivitendo_tables_to_packages = map { ($_ => "SL::DB::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
 
 246     unless %kivitendo_tables_to_packages;
 
 248   return $kivitendo_tables_to_packages{ $_[0] };
 
 251 sub get_manager_package_for_table {
 
 252   %kivitendo_tables_to_manager_packages = map { ($_ => "SL::DB::Manager::" . camelify($kivitendo_package_names{$_})) } keys %kivitendo_package_names
 
 253     unless %kivitendo_tables_to_manager_packages;
 
 255   return $kivitendo_tables_to_manager_packages{ $_[0] };
 
 258 sub get_table_for_package {
 
 259   get_package_for_table('dummy') if !%kivitendo_tables_to_packages;
 
 260   %kivitendo_packages_to_tables = reverse %kivitendo_tables_to_packages unless %kivitendo_packages_to_tables;
 
 262   my $package = $_[0] =~ m/^SL::DB::/ ? $_[0] : "SL::DB::" . $_[0];
 
 263   return $kivitendo_packages_to_tables{ $package };
 
 268   my $lookup = $kivitendo_package_names{$_[0]} ||
 
 269       plurify($kivitendo_package_names{singlify($_[0])});
 
 271   for my $thing ($string, $lookup) {
 
 273     # best guess? its already the name. like part. camelize it first
 
 274     my $class = "SL::DB::" . camelify($thing);
 
 275     return $class if defined *{ $class. '::' };
 
 277     # next, someone wants a manager and pluralized.
 
 278     my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
 
 279     return $manager if defined *{ $manager . '::' };
 
 282   die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
 
 305 SL::DB::Helper::Mappings - Rose Table <-> Model mapping information
 
 309   use SL::DB::Helper::Mappings qw(@blacklist %table2model);
 
 313 This modul stores table <-> model mappings used by the
 
 314 L<scripts/rose_auto_create_model.pl> script.  If you add a new table that has
 
 315 custom mappings, add it here.
 
 323 A special function provided here is C<db>. Without it you'd have to write:
 
 325   my $part = SL::DB::Part->new(id => 1234);
 
 326   my @all_parts = SL::DB::Manager::Part->get_all;
 
 328 with them it becomes:
 
 330   my $part = db('part')->new(id => 123);
 
 331   my @all_parts = db('parts')->get_all;
 
 333 You don't have to care about add that SL::DB:: incantation anymore. Also, a
 
 334 simple s at the end will get you the associated Manager class.
 
 336 db is written to try to make sense of what you give it, but if all fails, it
 
 337 will die with an error.
 
 339 =item C<get_package_for_table $table_name>
 
 341 Returns the package name for a table name:
 
 343   SL::DB::Helper::Mappings::get_package_for_table('oe')
 
 346 =item C<get_manager_package_for_table $table_name>
 
 348 Returns the manager package name for a table name:
 
 350   SL::DB::Helper::Mappings::get_manager_package_for_table('oe')
 
 351   # SL::DB::Manager::Order
 
 353 =item C<get_table_for_package $package_name>
 
 355 Returns the table name for a package name:
 
 357   SL::DB::Helper::Mappings::get_table_for_package('SL::DB::Order')
 
 359   SL::DB::Helper::Mappings::get_table_for_package('Order')
 
 370 L<scripts/rose_auto_create_model.pl>
 
 374 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>,
 
 375 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>