1 package SL::Controller::Buchungsgruppen;
 
   5 use parent qw(SL::Controller::Base);
 
   9 use SL::Locale::String;
 
  10 use SL::DB::TaxzoneChart;
 
  13 use Rose::Object::MakeMethods::Generic (
 
  14   scalar                  => [ qw(config) ],
 
  15   'scalar --get_set_init' => [ qw(defaults) ],
 
  18 __PACKAGE__->run_before('check_auth');
 
  19 __PACKAGE__->run_before('load_config', only => [ qw(edit update delete) ]);
 
  28   my $buchungsgruppen = SL::DB::Manager::Buchungsgruppe->get_all_sorted();
 
  29   my $taxzones        = SL::DB::Manager::TaxZone->get_all_sorted(query => [ obsolete => 0 ]);
 
  32   foreach my $gruppe (@{ $buchungsgruppen }) {
 
  33       $chartlist{ $gruppe->id } = SL::DB::TaxzoneChart->get_all_accounts_by_buchungsgruppen_id($gruppe->id);
 
  37   $self->render('buchungsgruppen/list',
 
  38                 title           => t8('Buchungsgruppen'),
 
  39                 BUCHUNGSGRUPPEN => $buchungsgruppen,
 
  40                 CHARTLIST       => \%chartlist,
 
  41                 TAXZONES        => $taxzones);
 
  47   $self->config(SL::DB::Buchungsgruppe->new());
 
  48   $self->show_form(title => t8('Add Buchungsgruppe'));
 
  52   my ($self, %params) = @_;
 
  54   $self->render('buchungsgruppen/form', %params,
 
  55                  TAXZONES       => SL::DB::Manager::TaxZone->get_all_sorted());
 
  61   # Allow editing of the charts of the Buchungsgruppe if it isn't assigned to
 
  62   # any parts. This is checked inside the template via the Buchungsgruppen
 
  63   # orphaned method, where an IF-ELSE statement toggles between L.select_tag
 
  66   $self->show_form(title     => t8('Edit Buchungsgruppe'),
 
  67                    CHARTLIST => SL::DB::TaxzoneChart->get_all_accounts_by_buchungsgruppen_id($self->config->id));
 
  73   $self->config(SL::DB::Buchungsgruppe->new());
 
  74   $self->create_or_update;
 
  79   $self->create_or_update;
 
  85   # allow deletion of unused Buchungsgruppen. Will fail, due to database
 
  86   # constraint, if Buchungsgruppe is connected to a part
 
  88   my $db = $self->{config}->db;
 
  89   $db->do_transaction(sub {
 
  90         my $taxzone_charts = SL::DB::Manager::TaxzoneChart->get_all(where => [ buchungsgruppen_id => $self->config->id ]);
 
  91         foreach my $taxzonechart ( @{$taxzone_charts} ) { $taxzonechart->delete };
 
  92         $self->config->delete();
 
  93         flash_later('info',  $::locale->text('The buchungsgruppe has been deleted.'));
 
  94   }) || flash_later('error', $::locale->text('The buchungsgruppe is in use and cannot be deleted.'));
 
  96   $self->redirect_to(action => 'list');
 
 103   SL::DB::Buchungsgruppe->reorder_list(@{ $::form->{bg_id} || [] });
 
 105   $self->render(\'', { type => 'json' });
 
 113   $::auth->assert('config');
 
 119   $self->config(SL::DB::Buchungsgruppe->new(id => $::form->{id})->load);
 
 126 sub create_or_update {
 
 128   my $is_new = !$self->config->id;
 
 130   my $params = delete($::form->{config}) || { };
 
 131   delete $params->{id};
 
 135   my $db = $self->config->db;
 
 136   $db->do_transaction( sub {
 
 138     $self->config->assign_attributes(%{ $params }); # assign description and inventory_accno_id
 
 140     @errors = $self->config->validate; # check for description and inventory_accno_id
 
 143       die "foo" . @errors . "\n";
 
 148     # Save or update taxzone_charts for new or unused Buchungsgruppen
 
 149     if ($is_new or $self->config->orphaned) {
 
 150       my $taxzones = SL::DB::Manager::TaxZone->get_all_sorted();
 
 152       foreach my $tz (@{ $taxzones }) {
 
 154         my $income_accno_id    = $::form->{"income_accno_id_"  . $tz->id};
 
 155         my $expense_accno_id   = $::form->{"expense_accno_id_" . $tz->id};
 
 157         my ($income_accno, $expense_accno);
 
 158         $income_accno    = SL::DB::Manager::Chart->find_by( id => $income_accno_id  ) if $income_accno_id;
 
 159         $expense_accno   = SL::DB::Manager::Chart->find_by( id => $expense_accno_id ) if $expense_accno_id;
 
 161         push(@errors, t8('Tax zone #1 needs a valid income account'   , $tz->description)) unless $income_accno;
 
 162         push(@errors, t8('Tax zone #1 needs a valid expense account'  , $tz->description)) unless $expense_accno;
 
 164         my $taxzone_chart = SL::DB::Manager::TaxzoneChart->find_by_or_create(buchungsgruppen_id => $self->config->id, taxzone_id => $tz->id);
 
 165         $taxzone_chart->taxzone_id($tz->id);
 
 166         $taxzone_chart->buchungsgruppen_id($self->config->id);
 
 167         $taxzone_chart->income_accno_id($income_accno->id);
 
 168         $taxzone_chart->expense_accno_id($expense_accno->id);
 
 169         $taxzone_chart->save;
 
 172   } ) || die @errors ? join("\n", @errors) . "\n" : $db->error . "\n";
 
 173          # die with rollback of taxzone save if saving of any of the taxzone_charts fails
 
 174          # only show the $db->error if we haven't already identified the likely error ourselves
 
 176   flash_later('info', $is_new ? t8('The Buchungsgruppe has been created.') : t8('The Buchungsgruppe has been saved.'));
 
 177   $self->redirect_to(action => 'list');
 
 184 sub init_defaults        { SL::DB::Default->get }