include product option pricing in the main dist
[bse.git] / plugins / optionpricing / lib / BSECustom / ProductOptionPricing.pm
1 package BSECustom::ProductOptionPricing;
2 use strict;
3
4 our $VERSION = "1.000";
5
6 sub init {
7   my ($class) = @_;
8
9   my $self = bless {}, $class;
10
11   BSE::PubSub->handle("*", [ $self ]);
12 }
13
14 sub product_edit_variables {
15   my ($self, $params) = @_;
16
17   $params->{req}->set_variable(
18     option_value_price => sub {
19       $_[0]->get_custom("value_price");
20       });
21 }
22
23 sub product_option_edit_variables {
24   my ($self, $params) = @_;
25
26   $params->{req}->set_variable(
27     option_value_price => sub {
28       $_[0]->get_custom("value_price");
29       });
30 }
31
32 my $price_re1 = qr/^\s*-?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)\s*$/;
33 my $price_re2 = qr/^\s*-?(?:[0-9]+(?:\.[0-9]{0,2})?|\.[0-9]{1,2})\s*$/;
34
35 sub product_option_add_validate {
36   my ($self, $params) = @_;
37
38   my $cgi = $params->{req}->cgi;
39   my $error = $params->{errors};
40   for my $value_field (grep /^value[1-9][0-9]*$/, $cgi->param) {
41     my $val = $cgi->param($value_field);
42     if (defined $val && $val =~ /\S/) {
43       (my $price_field = $value_field) =~ s/^value/price/;
44       my $price = $cgi->param($price_field);
45       if (defined $price && $price =~ /\S/) {
46         if ($price !~ $price_re1) {
47           $error->{$price_field} = "Invalid price";
48         }
49         elsif ($price !~ $price_re2) {
50           $error->{$price_field} = "Invalid price, only two cents digits allowed";
51         }
52       }
53     }
54   }
55 }
56
57 sub product_option_add {
58   my ($self, $params) = @_;
59
60   my $values = $params->{values};
61   my $cgi = $params->{req}->cgi;
62   for my $key (keys %$values) {
63     (my $price_key = $key) =~ s/^value/price/;
64     my $price = ($cgi->param($price_key))[0] || 0;
65     my $option = $values->{$key};
66     $option->set_custom(value_price => 0+sprintf("%.0f", $price * 100));
67     $option->save;
68   }
69 }
70
71 sub product_option_edit_validate {
72   my ($self, $params) = @_;
73
74   my $cgi = $params->{req}->cgi;
75   my $error = $params->{errors};
76   for my $value ($params->{option}->values) {
77     my $price_key = "price".$value->id;
78     my $price = ($cgi->param($price_key))[0] || 0;
79     if (defined $price && $price =~ /\S/) {
80       if ($price !~ $price_re1) {
81         $error->{$price_key} = "Invalid price";
82       }
83       elsif ($price !~ $price_re2) {
84         $error->{$price_key} = "Invalid price, only two cents digits allowed";
85       }
86     }
87   }
88
89   my $newvalues = $params->{newvalues};
90   for my $newkey (keys %$newvalues) {
91     my $newvalue = $newvalues->{$newkey};
92     (my $price_key = $newkey) =~ s/value/price/;
93     my $price = ($cgi->param($price_key))[0] || 0;
94     if (defined $price) {
95       if ($price !~ $price_re1) {
96         $error->{$price_key} = "Invalid price";
97       }
98       elsif ($price !~ $price_re2) {
99         $error->{$price_key} = "Invalid price, only two cents digits allowed";
100       }
101     }
102   }
103 }
104
105 sub product_option_edit_save {
106   my ($self, $params) = @_;
107
108   my $cgi = $params->{req}->cgi;
109   for my $value ($params->{option}->values) {
110     my $price_key = "price".$value->id;
111     my $price = ($cgi->param($price_key))[0] || 0;
112     $value->set_custom(value_price => 0+sprintf("%.0f", $price * 100));
113     $value->save;
114   }
115
116   my $newvalues = $params->{newvalues};
117   for my $newkey (keys %$newvalues) {
118     my $newvalue = $newvalues->{$newkey};
119     (my $price_key = $newkey) =~ s/value/price/;
120     my $price = ($cgi->param($price_key))[0] || 0;
121     $newvalue->set_custom(value_price => sprintf("%.0f", $price * 100));
122     $newvalue->save;
123   }
124 }
125
126 sub cart_price {
127   my ($self, $params) = @_;
128
129   my $item = $params->{cartitem};
130   my $rprice = $params->{price};
131
132   for my $option ($item->option_list) {
133     if (my $value = $option->{valueobj}) {
134       $$rprice += $value->get_custom("value_price") || 0;
135     }
136   }
137 }
138
139 sub order_item_option {
140   my ($self, $params) = @_;
141
142   my $cartitem = $params->{cartitem};
143   my $ooption = $params->{orderitemoption};
144   my $value = $params->{cartoption};
145
146   $ooption->set_custom(value_price => $value->get_custom("value_price") || 0);
147   $ooption->save;
148 }
149
150 1;