5a309ccf4360425f16977a1a369ae970b99d6980
[bse.git] / site / cgi-bin / modules / BSE / TB / OrderItem.pm
1 package BSE::TB::OrderItem;
2 use strict;
3 # represents an order line item from the database
4 use Squirrel::Row;
5 use vars qw/@ISA/;
6 @ISA = qw/Squirrel::Row/;
7
8 our $VERSION = "1.004";
9
10 sub columns {
11   return qw/id productId orderId units price wholesalePrice gst options
12             customInt1 customInt2 customInt3 customStr1 customStr2 customStr3
13             title description subscription_id subscription_period max_lapsed
14             session_id product_code/;
15 }
16
17 sub defaults {
18   return
19     (
20      units => 1,
21      options => '',
22      customInt1 => undef,
23      customInt2 => undef,
24      customInt3 => undef,
25      customStr1 => undef,
26      customStr2 => undef,
27      customStr3 => undef,
28     );
29 }
30
31 sub option_list {
32   my ($self) = @_;
33
34   require BSE::TB::OrderItemOptions;
35   return sort { $a->{display_order} <=> $b->{display_order} }
36     BSE::TB::OrderItemOptions->getBy(order_item_id => $self->{id});
37 }
38
39 sub product {
40   my ($self) = @_;
41
42   $self->productId == -1
43     and return;
44   require BSE::TB::Products;
45   return BSE::TB::Products->getByPkey($self->productId);
46 }
47
48 sub option_hashes {
49   my ($self) = @_;
50
51   my $product = $self->product;
52   if (length $self->{options}) {
53     my @values = split /,/, $self->options;
54     return map
55       +{
56         id => $_->{id},
57         value => $_->{value},
58         desc => $_->{desc},
59         label => $_->{display},
60        }, $product->option_descs(BSE::Cfg->single, \@values);
61   }
62   else {
63     my @options = $self->option_list;
64     return map
65       +{
66         id => $_->original_id,
67         value => $_->value,
68         desc => $_->name,
69         label => $_->display
70        }, @options;
71   }
72 }
73
74 sub nice_options {
75   my ($self) = @_;
76
77   my @options = $self->option_hashes
78     or return '';
79
80   return '('.join(", ", map("$_->{desc} $_->{label}", @options)).')';
81 }
82
83 sub session {
84   my ($self) = @_;
85
86   $self->session_id
87     or return;
88
89   require BSE::TB::SeminarSessions;
90   return BSE::TB::SeminarSessions->getByPkey($self->session_id);
91 }
92
93 # cart item compatibility
94 sub retailPrice {
95   $_[0]->price;
96 }
97
98 sub extended {
99   my ($self, $name) = @_;
100
101   return $self->units * $self->$name();
102 }
103
104 1;