Merge pull request #41 from kivitendo/f-rights-to-view
[kivitendo-erp.git] / SL / Controller / DeliveryOrder / TypeData.pm
index e525f57..0650e08 100644 (file)
@@ -4,289 +4,87 @@ use strict;
 use Exporter qw(import);
 use Scalar::Util qw(weaken);
 use SL::Locale::String qw(t8);
+use SL::DB::DeliveryOrder::TypeData qw(:types :subs);
 
-use constant {
-  SALES_ORDER_TYPE             => 'sales_order',
-  PURCHASE_ORDER_TYPE          => 'purchase_order',
-  SALES_QUOTATION_TYPE         => 'sales_quotation',
-  REQUEST_QUOTATION_TYPE       => 'request_quotation',
-  PURCHASE_DELIVERY_ORDER_TYPE => 'purchase_delivery_order',
-  SALES_DELIVERY_ORDER_TYPE    => 'sales_delivery_order',
-};
+my @export_types = qw(SALES_DELIVERY_ORDER_TYPE PURCHASE_DELIVERY_ORDER_TYPE SUPPLIER_DELIVERY_ORDER_TYPE RMA_DELIVERY_ORDER_TYPE);
 
-our @EXPORT_OK = qw(SALES_ORDER_TYPE PURCHASE_ORDER_TYPE SALES_QUOTATION_TYPE REQUEST_QUOTATION_TYPE);
+our @EXPORT_OK = (@export_types);
+our %EXPORT_TAGS = (types => \@export_types);
 
 use Rose::Object::MakeMethods::Generic scalar => [ qw(c) ];
 
-my %type_data = (
-  SALES_ORDER_TYPE() => {
-    text => {
-      delete => t8('The order has been deleted'),
-      saved  => t8('The order has been saved'),
-      add    => t8("Add Sales Order"),
-      edit   => t8("Edit Sales Order"),
-    },
-    show_menu => {
-      save_and_quotation      => 1,
-      save_and_rfq            => 0,
-      save_and_sales_order    => 0,
-      save_and_purchase_order => 1,
-      save_and_delivery_order => 1,
-      save_and_ap_transaction => 0,
-      delete                  => sub { $::instance_conf->get_sales_order_show_delete },
-    },
-    workflow => {
-      to_order_type        => "purchase_order",
-      to_quotation_type    => "sales_quotation",
-      to_order_copy_shipto => 1,
-    },
-    properties => {
-      customervendor => "customer",
-      is_quotation   => 0,
-      nr_key         => "ordnumber",
-    },
-    part_classification_query => [ "used_for_sale" => 1 ],
-    right => "sales_order_edit",
-  },
-  PURCHASE_ORDER_TYPE() => {
-    text =>{
-      delete => t8('The order has been deleted'),
-      saved  => t8('The order has been saved'),
-      add    => t8("Add Purchase Order"),
-      edit   => t8("Edit Purchase Order"),
-    },
-    show_menu => {
-      save_and_quotation      => 0,
-      save_and_rfq            => 1,
-      save_and_sales_order    => 1,
-      save_and_purchase_order => 0,
-      save_and_delivery_order => 1,
-      save_and_ap_transaction => 1,
-      delete                  => sub { $::instance_conf->get_purchase_order_show_delete },
-    },
-    workflow => {
-      to_order_type        => "sales_order",
-      to_quotation_type    => "request_quotation",
-      to_order_copy_shipto => 0,
-    },
-    properties => {
-      customervendor => "vendor",
-      is_quotation   => 0,
-      nr_key         => "ordnumber",
-    },
-    part_classification_query => [ "used_for_purchase" => 1 ],
-    right => "purchase_order_edit",
-  },
-  SALES_QUOTATION_TYPE() => {
-    text => {
-      delete => t8('The quotation has been deleted'),
-      saved  => t8('The quotation has been saved'),
-      add    => t8("Add Quotation"),
-      edit   => t8("Edit Quotation"),
-    },
-    show_menu => {
-      save_and_quotation      => 0,
-      save_and_rfq            => 0,
-      save_and_sales_order    => 1,
-      save_and_purchase_order => 0,
-      save_and_delivery_order => 0,
-      save_and_ap_transaction => 0,
-      delete                  => 1,
-    },
-    workflow => {
-      to_order_type        => "sales_order",
-      to_quotation_type    => "request_quotation",
-      to_order_copy_shipto => 0,
-    },
-    properties => {
-      customervendor => "customer",
-      is_quotation   => 1,
-      nr_key         => "quonumber",
-    },
-    part_classification_query => [ "used_for_sale" => 1 ],
-    right => "sales_quotation_edit",
-  },
-  REQUEST_QUOTATION_TYPE() => {
-    text => {
-      delete => t8('The rfq has been deleted'),
-      saved  => t8('The rfq has been saved'),
-      add    => t8("Add Request for Quotation"),
-      edit   => t8("Edit Request for Quotation"),
-    },
-    show_menu => {
-      save_and_quotation      => 0,
-      save_and_rfq            => 0,
-      save_and_sales_order    => 0,
-      save_and_purchase_order => 1,
-      save_and_delivery_order => 0,
-      save_and_ap_transaction => 0,
-      delete                  => 1,
-    },
-    workflow => {
-      to_order_type        => "purchase_order",
-      to_quotation_type    => "request_quotation",
-      to_order_copy_shipto => 0,
-    },
-    properties => {
-      customervendor => "vendor",
-      is_quotation   => 1,
-      nr_key         => "quonumber",
-    },
-    part_classification_query => [ "used_for_purchase" => 1 ],
-    right => "request_quotation_edit",
-  },
-  SALES_DELIVERY_ORDER_TYPE() => {
-    text => {
-      delete => t8('Delivery Order has been deleted'),
-      saved  => t8('Delivery Order has been saved'),
-      add    => t8("Add Sales Delivery Order"),
-      edit   => t8("Edit Sales Delivery Order"),
-    },
-    show_menu => {
-      save_and_quotation      => 0,
-      save_and_rfq            => 0,
-      save_and_sales_order    => 0,
-      save_and_purchase_order => 0,
-      save_and_delivery_order => 0,
-      save_and_ap_transaction => 0,
-      delete                  => sub { $::instance_conf->get_sales_delivery_order_show_delete },
-    },
-    properties => {
-      customervendor => "customer",
-      nr_key         => "donumber",
-    },
-    part_classification_query => [ "used_for_sale" => 1 ],
-    right => "sales_delivery_order_edit",
-  },
-  PURCHASE_DELIVERY_ORDER_TYPE() => {
-    text => {
-      delete => t8('Delivery Order has been deleted'),
-      saved  => t8('Delivery Order has been saved'),
-      add    => t8("Add Purchase Delivery Order"),
-      edit   => t8("Edit Purchase Delivery Order"),
-    },
-    show_menu => {
-      save_and_quotation      => 0,
-      save_and_rfq            => 0,
-      save_and_sales_order    => 0,
-      save_and_purchase_order => 0,
-      save_and_delivery_order => 0,
-      save_and_ap_transaction => 0,
-      delete                  => sub { $::instance_conf->get_sales_delivery_order_show_delete },
-    },
-    properties => {
-      customervendor => "vendor",
-      nr_key         => "donumber",
-    },
-    part_classification_query => [ "used_for_purchase" => 1 ],
-    right => "purchase_delivery_order_edit",
-  },
-
-);
-
 sub new {
   my ($class, $controller) = @_;
   my $o = bless {}, $class;
-  $o->c($controller);
-  weaken($o->{c});
-
-  return $o;
-}
-
-sub valid_types {
-  [
-    SALES_ORDER_TYPE,
-    PURCHASE_ORDER_TYPE,
-    SALES_QUOTATION_TYPE,
-    REQUEST_QUOTATION_TYPE,
-    SALES_DELIVERY_ORDER_TYPE,
-    PURCHASE_DELIVERY_ORDER_TYPE,
-  ];
-}
 
-sub type {
-  $_[0]->c->type;
-}
-
-sub _get {
-  my ($self, $key) = @_;
-
-  my $ret = $type_data{$self->type}->{$key} // die "unknown property '$key'";
+  if ($controller) {
+    $o->c($controller);
+    weaken($o->{c});
+  }
 
-  ref $ret eq 'CODE'
-    ? $ret->()
-    : $ret;
+  return $o;
 }
 
-sub _get3 {
-  my ($self, $topic, $key) = @_;
-
-  my $ret = $type_data{$self->type}->{$topic}->{$key} // die "unknown property '$key' in topic '$topic'";
-
-  ref $ret eq 'CODE'
-    ? $ret->()
-    : $ret;
+sub validate {
+  my ($self, $string) = @_;
+  validate_type($string);
 }
 
 sub text {
   my ($self, $string) = @_;
-  _get3($self, "text", $string);
+  get3($self->c->type, "text", $string);
 }
 
 sub show_menu {
   my ($self, $string) = @_;
-  _get3($self, "show_menu", $string);
+  get3($self->c->type, "show_menu", $string);
 }
 
 sub workflow {
   my ($self, $string) = @_;
-  _get3($self, "workflow", $string);
+  get3($self->c->type, "workflow", $string);
 }
 
 sub properties {
   my ($self, $string) = @_;
-  _get3($self, "properties", $string);
-}
-
-sub is_valid_type {
-  !!exists $type_data{$_[1]};
-}
-
-sub type_data {
-  $type_data{ $_[0]->type } // die "unknown type";
+  get3($self->c->type, "properties", $string);
 }
 
 sub access {
-  _get($_[0], "right");
+  my ($self, $string) = @_;
+  get3($_[0]->c->type, "rights", $string);
 }
 
 sub is_quotation {
-  _get3($_[0], "properties", "is_quotation");
+  get3($_[0]->c->type, "properties", "is_quotation");
 }
 
 sub customervendor {
-  _get3($_[0], "properties", "customervendor");
+  get3($_[0]->c->type, "properties", "customervendor");
+}
+
+sub is_customer {
+  get3($_[0]->c->type, "properties", "is_customer");
 }
 
 sub nr_key {
-  _get3($_[0], "properties", "nr_key");
+  get3($_[0]->c->type, "properties", "nr_key");
+}
+
+sub transfer {
+  get3($_[0]->c->type, "properties", "transfer");
 }
 
 sub part_classification_query {
   my ($self, $string) = @_;
-  _get($self, "part_classification_query");
+  get($self->c->type, "part_classification_query");
 }
 
 sub set_reqdate_by_type {
   my ($self) = @_;
 
-  my $extra_days = $self->type eq SALES_QUOTATION_TYPE ? $::instance_conf->get_reqdate_interval       :
-                   $self->type eq SALES_ORDER_TYPE     ? $::instance_conf->get_delivery_date_interval : 1;
-
-  if (   ($self->type eq SALES_ORDER_TYPE     &&  $::instance_conf->get_deliverydate_on)
-      || ($self->type eq SALES_QUOTATION_TYPE &&  $::instance_conf->get_reqdate_on)
-      && (!$self->order->reqdate)) {
-    $self->c->order->reqdate(DateTime->today_local->next_workday(extra_days => $extra_days));
+  if (!$self->c->order->reqdate) {
+    $self->c->order->reqdate(DateTime->today_local->next_workday(extra_days => 1));
   }
 }
 
@@ -294,16 +92,10 @@ sub get_reqdate_by_type {
   my ($self, $reqdate, $saved_reqdate) = @_;
 
   if ($reqdate == $saved_reqdate) {
-    my $extra_days = $self->type eq SALES_QUOTATION_TYPE ? $::instance_conf->get_reqdate_interval       :
-                     $self->type eq SALES_ORDER_TYPE     ? $::instance_conf->get_delivery_date_interval : 1;
-
-    if (   ($self->type eq SALES_ORDER_TYPE     &&  !$::instance_conf->get_deliverydate_on)
-        || ($self->type eq SALES_QUOTATION_TYPE &&  !$::instance_conf->get_reqdate_on)) {
-      return '';
-    } else {
-      return DateTime->today_local->next_workday(extra_days => $extra_days);
-    }
+    return DateTime->today_local->next_workday(extra_days => 1);
   } else {
     return $reqdate;
   }
 }
+
+1;