PriceTaxCalculator: chart->taxkey lookup vorberechnen
[kivitendo-erp.git] / scripts / rose_auto_create_model.pl
index 14fea79..fb589c6 100755 (executable)
@@ -47,17 +47,19 @@ our $manager_path = "SL/DB/Manager";
 
 my %config;
 
-our %foreign_key_name_map = (
-  oe                   => { payment => 'payment_terms', },
-  ar                   => { payment => 'payment_terms', },
-  ap                   => { payment => 'payment_terms', },
-
-  orderitems           => { parts => 'part', trans => 'order', },
-  delivery_order_items => { parts => 'part' },
-  invoice              => { parts => 'part' },
-  follow_ups           => { 'employee_obj' => 'created_for' },
-
-  periodic_invoices_configs => { oe => 'order' },
+our %foreign_key_name_map     = (
+  KIVITENDO                   => {
+    oe                        => { payment => 'payment_terms', },
+    ar                        => { payment => 'payment_terms', },
+    ap                        => { payment => 'payment_terms', },
+
+    orderitems                => { parts => 'part', trans => 'order', },
+    delivery_order_items      => { parts => 'part' },
+    invoice                   => { parts => 'part' },
+    follow_ups                => { 'employee_obj' => 'created_for' },
+
+    periodic_invoices_configs => { oe => 'order' },
+  },
 );
 
 sub setup {
@@ -139,7 +141,8 @@ CODE
   if ($foreign_key_definition && ($definition =~ /\Q$foreign_key_definition\E/)) {
     my ($start, $end) = ($-[0], $+[0]);
 
-    while (my ($auto_generated_name, $desired_name) = each %{ $foreign_key_name_map{$table} || {} }) {
+    my %changes = map { %{$_} } grep { $_ } ($foreign_key_name_map{$domain}->{ALL}, $foreign_key_name_map{$domain}->{$table});
+    while (my ($auto_generated_name, $desired_name) = each %changes) {
       $foreign_key_definition =~ s/^ \s \s ${auto_generated_name} \b/  ${desired_name}/msx;
     }
 
@@ -241,6 +244,7 @@ sub parse_args {
   GetOptions(
     'client=s'          => \ my $client,
     all                 => \ my $all,
+    'db=s'              => \ my $db,
     'no-commit|dry-run' => \ my $nocommit,
     help                => sub { pod2usage(verbose => 99, sections => 'NAME|SYNOPSIS|OPTIONS') },
     quiet               => \ my $quiet,
@@ -249,6 +253,7 @@ sub parse_args {
 
   $options->{client}   = $client;
   $options->{all}      = $all;
+  $options->{db}       = $db;
   $options->{nocommit} = $nocommit;
   $options->{quiet}    = $quiet;
   $options->{color}    = -t STDOUT ? 1 : 0;
@@ -288,7 +293,9 @@ sub usage {
 sub make_tables {
   my %tables_by_domain;
   if ($config{all}) {
-    foreach my $domain (sort keys %package_names) {
+    my @domains = $config{db} ? (uc $config{db}) : sort keys %package_names;
+
+    foreach my $domain (@domains) {
       my $db  = SL::DB::create(undef, $domain);
       $tables_by_domain{$domain} = [ grep { my $table = $_; none { $_ eq $table } @{ $blacklist{$domain} } } $db->list_tables ];
       $db->disconnect;
@@ -320,8 +327,19 @@ sub notice {
   print @_, $/;
 }
 
+sub check_errors_in_package_names {
+  foreach my $domain (sort keys %package_names) {
+    my @both = grep { $package_names{$domain}->{$_} } @{ $blacklist{$domain} || [] };
+    next unless @both;
+
+    print "Error: domain '$domain': The following table names are present in both the black list and the package name hash: ", join(' ', sort @both), "\n";
+    exit 1;
+  }
+}
+
 parse_args(\%config);
 setup();
+check_errors_in_package_names();
 
 my %tables_by_domain = make_tables();
 
@@ -352,7 +370,7 @@ rose_auto_create_model - mana Rose::DB::Object classes for kivitendo
   scripts/rose_auto_create_model.pl --client name-or-id [--all|-a]
 
   # updates all models
-  scripts/rose_auto_create_model.pl --client name-or-id --all
+  scripts/rose_auto_create_model.pl --client name-or-id --all [--db db]
 
   # updates only customer table, login taken from config
   scripts/rose_auto_create_model.pl customer
@@ -432,6 +450,11 @@ Note that C<CLIENT> can be either a database ID or a client's name.
 Process all tables from the database. Only those that are blacklistes in
 L<SL::DB::Helper::Mappings> are excluded.
 
+=item C<--db db>
+
+In combination with C<--all> causes all tables in the specific
+database to be processed, not in all databases.
+
 =item C<--no-commit, -n>
 
 =item C<--dry-run>