0a9f09d850123840602c1790d7893ad59b424875
[kivitendo-erp.git] / SL / DB / PriceRule.pm
1 # This file has been auto-generated only because it didn't exist.
2 # Feel free to modify it at will; it will not be overwritten automatically.
3
4 package SL::DB::PriceRule;
5
6 use strict;
7
8 use SL::DB::MetaSetup::PriceRule;
9 use SL::DB::Manager::PriceRule;
10 use Rose::DB::Object::Helpers qw(clone_and_reset);
11 use SL::Locale::String qw(t8);
12
13 __PACKAGE__->meta->add_relationship(
14   items => {
15     type         => 'one to many',
16     class        => 'SL::DB::PriceRuleItem',
17     column_map   => { id => 'price_rules_id' },
18   },
19 );
20
21 __PACKAGE__->meta->initialize;
22
23 use Rose::Object::MakeMethods::Generic (
24   'scalar --get_set_init' => [ qw(price_or_discount_state) ],
25 );
26
27 sub match {
28   my ($self, %params) = @_;
29
30   die 'need record'      unless $params{record};
31   die 'need record_item' unless $params{record_item};
32
33   for ($self->items) {
34     next if $_->match(%params);
35     # TODO save for error
36     return
37   }
38
39   return 1;
40 }
41
42 sub is_sales {
43     $_[0]->type eq 'customer' ? 1
44   : $_[0]->type eq 'vendor'   ? 0 : do { die 'wrong type' };
45 }
46
47 sub price_or_discount {
48   my ($self, $value) = @_;
49
50   if (@_ > 1) {
51     my $number = $self->price || $self->discount;
52     if ($value) {
53       $self->discount($number);
54     } else {
55       $self->price($number);
56     }
57     $self->price_or_discount_state($value);
58   }
59   $self->price_or_discount_state;
60 }
61
62 sub price_or_discount_as_number {
63   my ($self, @slurp) = @_;
64
65   $self->price_or_discount ? $self->price(undef)               : $self->discount(undef);
66   $self->price_or_discount ? $self->discount_as_number(@slurp) : $self->price_as_number(@slurp);
67 }
68
69 sub init_price_or_discount_state {
70     defined $_[0]->price ? 0
71   : defined $_[0]->discount ? 1 : 0
72 }
73
74 sub validate {
75   my ($self) = @_;
76
77   my @errors;
78   push @errors, $::locale->text('The name must not be empty.')              if !$self->name;
79   push @errors, $::locale->text('Price or discount must not be zero.')      if !$self->price && !$self->discount;
80   push @errors, $::locale->text('Pirce rules must have at least one rule.') if !@{[ $self->items ]};
81
82   return @errors;
83 }
84
85 sub clone_and_reset_deep {
86   my ($self) = @_;
87
88   my $clone = $self->clone_and_reset;
89   $clone->items(map { $_->clone_and_reset } $self->items);
90   $clone->name('');
91
92   return $clone;
93 }
94
95 sub full_description {
96   my ($self) = @_;
97
98   my $items = $self->item_summary;
99   my $price = $self->price_or_discount
100             ? t8('Discount #1%', $self->discount_as_number)
101             : t8('Price #1', $self->price_as_number);
102
103   sprintf "%s: %s (%s)", $self->name, $price, $items;
104 }
105
106 sub item_summary {
107   join ', ', map { $_->full_description } $_[0]->items;
108 }
109
110 sub in_use {
111   my ($self) = @_;
112
113   # is use is in this case used by record_items for their current price source
114   # so, get any of those that might have it
115   require SL::DB::OrderItem;
116   require SL::DB::DeliveryOrderItem;
117   require SL::DB::InvoiceItem;
118
119   my $price_source_spec = 'price_rules' . '/' . $self->id;
120
121      SL::DB::Manager::OrderItem->get_all_count(query => [ active_price_source => $price_source_spec ])
122   || SL::DB::Manager::DeliveryOrderItem->get_all_count(query => [ active_price_source => $price_source_spec ])
123   || SL::DB::Manager::InvoiceItem->get_all_count(query => [ active_price_source => $price_source_spec ]);
124 }
125
126 sub priority_as_text {
127   my ($self) = @_;
128
129   return t8('Override') if $self->priority == 4;
130   t8('Normal');
131 }
132
133
134 1;