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);
 
  36   $self->setup_list_action_bar;
 
  38   $self->render('buchungsgruppen/list',
 
  39                 title           => t8('Booking groups'),
 
  40                 BUCHUNGSGRUPPEN => $buchungsgruppen,
 
  41                 CHARTLIST       => \%chartlist,
 
  42                 TAXZONES        => $taxzones);
 
  48   $self->config(SL::DB::Buchungsgruppe->new());
 
  49   $self->show_form(title => t8('Add booking group'));
 
  53   my ($self, %params) = @_;
 
  55   $self->setup_show_form_action_bar;
 
  56   $self->render('buchungsgruppen/form', %params,
 
  57                  TAXZONES       => SL::DB::Manager::TaxZone->get_all_sorted());
 
  63   # Allow editing of the charts of the Buchungsgruppe if it isn't assigned to
 
  64   # any parts. This is checked inside the template via the Buchungsgruppen
 
  65   # orphaned method, where an IF-ELSE statement toggles between L.select_tag
 
  68   $self->show_form(title     => t8('Edit booking group'),
 
  69                    CHARTLIST => SL::DB::TaxzoneChart->get_all_accounts_by_buchungsgruppen_id($self->config->id));
 
  75   $self->config(SL::DB::Buchungsgruppe->new());
 
  76   $self->create_or_update;
 
  81   $self->create_or_update;
 
  87   # allow deletion of unused Buchungsgruppen. Will fail, due to database
 
  88   # constraint, if Buchungsgruppe is connected to a part
 
  90   $self->{config}->db->with_transaction(sub {
 
  91     my $taxzone_charts = SL::DB::Manager::TaxzoneChart->get_all(where => [ buchungsgruppen_id => $self->config->id ]);
 
  92     foreach my $taxzonechart ( @{$taxzone_charts} ) { $taxzonechart->delete };
 
  93     $self->config->delete();
 
  94     flash_later('info',  $::locale->text('The booking group has been deleted.'));
 
  97   }) || flash_later('error', $::locale->text('The booking group is in use and cannot be deleted.'));
 
  99   $self->redirect_to(action => 'list');
 
 106   SL::DB::Buchungsgruppe->reorder_list(@{ $::form->{bg_id} || [] });
 
 108   $self->render(\'', { type => 'json' });
 
 116   $::auth->assert('config');
 
 122   $self->config(SL::DB::Buchungsgruppe->new(id => $::form->{id})->load);
 
 129 sub create_or_update {
 
 131   my $is_new = !$self->config->id;
 
 133   my $params = delete($::form->{config}) || { };
 
 134   delete $params->{id};
 
 138   my $db = $self->config->db;
 
 139   if (!$db->with_transaction(sub {
 
 141     $self->config->assign_attributes(%{ $params }); # assign description and inventory_accno_id
 
 143     @errors = $self->config->validate; # check for description and inventory_accno_id
 
 146       die "foo" . @errors . "\n";
 
 151     # Save or update taxzone_charts for new or unused Buchungsgruppen
 
 152     if ($is_new or $self->config->orphaned) {
 
 153       my $taxzones = SL::DB::Manager::TaxZone->get_all_sorted();
 
 155       foreach my $tz (@{ $taxzones }) {
 
 157         my $income_accno_id    = $::form->{"income_accno_id_"  . $tz->id};
 
 158         my $expense_accno_id   = $::form->{"expense_accno_id_" . $tz->id};
 
 160         my ($income_accno, $expense_accno);
 
 161         $income_accno    = SL::DB::Manager::Chart->find_by( id => $income_accno_id  ) if $income_accno_id;
 
 162         $expense_accno   = SL::DB::Manager::Chart->find_by( id => $expense_accno_id ) if $expense_accno_id;
 
 164         push(@errors, t8('Tax zone #1 needs a valid income account'   , $tz->description)) unless $income_accno;
 
 165         push(@errors, t8('Tax zone #1 needs a valid expense account'  , $tz->description)) unless $expense_accno;
 
 167         my $taxzone_chart = SL::DB::Manager::TaxzoneChart->find_by_or_create(buchungsgruppen_id => $self->config->id, taxzone_id => $tz->id);
 
 168         $taxzone_chart->taxzone_id($tz->id);
 
 169         $taxzone_chart->buchungsgruppen_id($self->config->id);
 
 170         $taxzone_chart->income_accno_id($income_accno->id);
 
 171         $taxzone_chart->expense_accno_id($expense_accno->id);
 
 172         $taxzone_chart->save;
 
 178     die @errors ? join("\n", @errors) . "\n" : $db->error . "\n";
 
 179     # die with rollback of taxzone save if saving of any of the taxzone_charts fails
 
 180     # only show the $db->error if we haven't already identified the likely error ourselves
 
 183   flash_later('info', $is_new ? t8('The booking group has been created.') : t8('The booking group has been saved.'));
 
 184   $self->redirect_to(action => 'list');
 
 191 sub init_defaults        { SL::DB::Default->get }
 
 197 sub setup_show_form_action_bar {
 
 200   my $is_new = !$self->config->id;
 
 202   for my $bar ($::request->layout->get('actionbar')) {
 
 206         submit    => [ '#form', { action => 'Buchungsgruppen/' . ($is_new ? 'create' : 'update') } ],
 
 207         checks    => [ 'kivi.validate_form' ],
 
 208         accesskey => 'enter',
 
 213         submit   => [ '#form', { action => 'Buchungsgruppen/delete' } ],
 
 214         confirm  => t8('Do you really want to delete this object?'),
 
 215         disabled => $is_new                  ? t8('This object has not been saved yet.')
 
 216                   : !$self->config->orphaned ? t8('The object is in use and cannot be deleted.')
 
 222         link => $self->url_for(action => 'list'),
 
 228 sub setup_list_action_bar {
 
 231   for my $bar ($::request->layout->get('actionbar')) {
 
 235         link => $self->url_for(action => 'new'),