flash_later(): In Session gespeicherter Flash für nächsten Request implementiert
[kivitendo-erp.git] / SL / DB / Helpers / Mappings.pm
index d4ee675..48c4863 100644 (file)
@@ -1,20 +1,17 @@
 package SL::DB::Helpers::Mappings;
 
+use utf8;
 use strict;
 
-# these will not be managed as Rose::DB models, because they are not normalized
-# significant changes are needed to get them done.
+# these will not be managed as Rose::DB models, because they are not normalized,
+# significant changes are needed to get them done, or they were done by CRM.
 my @lxoffice_blacklist_permanent = qw(
-  acc_trans audittrail customertax datev defaults department dpt_trans
-  exchangerate finanzamt follow_up_access gifi inventory leads licenseinvoice
-  makemodel partsgroup partstax prices record_links rmaitems status tax_zones
-  todo_user_config translation translation_payment_terms units_language
-  vendortax);
+  leads
+);
 
 # these are not managed _yet_, but will hopefully at some point.
 # if you are confident that one of these works, remove it here.
 my @lxoffice_blacklist_temp = qw(
-     schema_info
 );
 
 my @lxoffice_blacklist = (@lxoffice_blacklist_permanent, @lxoffice_blacklist_temp);
@@ -23,6 +20,8 @@ my @lxoffice_blacklist = (@lxoffice_blacklist_permanent, @lxoffice_blacklist_tem
 # unlike rails we have no singular<->plural magic.
 # remeber: tables should be named as the plural of the model name.
 my %lxoffice_package_names = (
+  acc_trans                      => 'acc_transaction',
+  audittrail                     => 'audit_trail',
   ar                             => 'invoice',
   ap                             => 'purchase_invoice',
   bank_accounts                  => 'bank_account',
@@ -31,34 +30,59 @@ my %lxoffice_package_names = (
   custom_variable_configs        => 'custom_variable_config',
   custom_variables               => 'custom_variable',
   custom_variables_validity      => 'custom_variable_validity',
+  customertax                    => 'customer_tax',
+  datev                          => 'datev',
+  defaults                       => 'default',
   delivery_orders                => 'delivery_order',
   delivery_order_items           => 'delivery_order_item',
+  department                     => 'department',
+  dpt_trans                      => 'dpt_trans',
   drafts                         => 'draft',
   dunning                        => 'dunning',
   dunning_config                 => 'dunning_config',
   employee                       => 'employee',
+  exchangerate                   => 'exchangerate',
+  finanzamt                      => 'finanzamt',
+  follow_up_access               => 'follow_up_access',
   follow_up_links                => 'follow_up_link',
   follow_ups                     => 'follow_up',
   generic_translations           => 'generic_translation',
+  gifi                           => 'gifi',
   gl                             => 'GLTransaction',
   history_erp                    => 'history',
+  inventory                      => 'inventory',
   invoice                        => 'invoice_item',
   language                       => 'language',
-  license                        => 'licemse',
+  license                        => 'license',
+  licenseinvoice                 => 'license_invoice',
+  makemodel                      => 'make_model',
   notes                          => 'note',
   orderitems                     => 'order_item',
   oe                             => 'order',
   parts                          => 'part',
+  partsgroup                     => 'parts_group',
+  partstax                       => 'parts_tax',
   payment_terms                  => 'payment_term',
+  prices                         => 'prices',
   price_factors                  => 'price_factor',
   pricegroup                     => 'pricegroup',
   printers                       => 'Printer',
+  record_links                   => 'record_link',
   rma                            => 'RMA',
+  rmaitems                       => 'RMA_item',
   sepa_export                    => 'sepa_export',
   sepa_export_items              => 'sepa_export_item',
+  schema_info                    => 'schema_info',
+  status                         => 'status',
   tax                            => 'tax',
-  taxkeys                        => 'taxkey',
+  taxkeys                        => 'tax_key',
+  tax_zones                      => 'tax_zone',
+  todo_user_config               => 'todo_user_config',
+  translation                    => 'translation',
+  translation_payment_terms      => 'translation_payment_term',
   units                          => 'unit',
+  units_language                 => 'units_language',
+  vendortax                      => 'vendor_tax',
 );
 
 sub get_blacklist {
@@ -69,6 +93,49 @@ sub get_package_names {
   return LXOFFICE => \%lxoffice_package_names;
 }
 
+sub db {
+  my $string = $_[0];
+  my $lookup = $lxoffice_package_names{$_[0]} ||
+      plurify($lxoffice_package_names{singlify($_[0])});
+
+  for my $thing ($string, $lookup) {
+
+    # best guess? its already the name. like part. camelize it first
+    my $class = "SL::DB::" . camelify($thing);
+    return $class if defined *{ $class. '::' };
+
+    # next, someone wants a manager and pluralized.
+    my $manager = "SL::DB::Manager::" . singlify(camelify($thing));
+    return $manager if defined *{ $manager . '::' };
+  }
+
+  die "Can't resolve '$string' as a database model, sorry. Did you perhaps forgot to load it?";
+}
+
+sub camelify {
+  my ($str) = @_;
+  $str =~ s/_+(.)/uc($1)/ge;
+  ucfirst $str;
+}
+
+sub snakify {
+  my ($str) = @_;
+  $str =~ s/(?<!^)\u(.)/'_' . lc($1)/ge;
+  lcfirst $str;
+}
+
+sub plurify {
+  my ($str) = @_;
+  $str . 's';
+}
+
+sub singlify {
+  my ($str) = @_;
+  local $/ = 's';
+  chomp $str;
+  $str;
+}
+
 1;
 
 __END__
@@ -87,6 +154,24 @@ This modul stores table <-> model mappings used by the
 L<scripts/rose_auto_create_model.pl> script.  If you add a new table that has
 custom mappings, add it here.
 
+=head2 db
+
+A special function provided here is E<db>. Without it you'd have to write:
+
+  my $part = SL::DB::Part->new(id => 1234);
+  my @all_parts = SL::DB::Manager::Part->get_all;
+
+with them it becomes:
+
+  my $part = db('part')->new(id => 123);
+  my @all_parts = db('parts')->get_all;
+
+You don't have to care about add that SL::DB:: incantation anymore. Also, a
+simple s at the end will get you the associated Manager class.
+
+db is written to try to make sense of what you give it, but if all fails, it
+will die with an error.
+
 =head1 BUGS
 
 nothing yet
@@ -97,6 +182,6 @@ L<scripts/rose_auto_create_model.pl>
 
 =head1 AUTHOR
 
-Sven Schöling <s.schoeling@linet-services.de>
+Sven Schöling <s.schoeling@linet-services.de>
 
 =cut