Line # Revision Author
1 424 ahitrov package webshop::Discount;
2
3 use strict;
4 use warnings 'all';
5
6 use Contenido::Globals;
7 use base "Contenido::Document";
8 use Data::Dumper;
9
10 sub extra_properties
11 {
12 return (
13 425 ahitrov { 'attr' => 'code', 'hidden' => 1, 'column' => undef },
14 424 ahitrov { 'attr' => 'class', 'column' => undef },
15 425 ahitrov { 'attr' => 'dtime', 'rusname' => 'Начало действия скидки' },
16 { 'attr' => 'etime', 'rusname' => 'Окончание действия скидки' },
17 424 ahitrov { 'attr' => 'status', 'type' => 'status', 'rusname' => 'Статус',
18 'cases' => [
19 [0, 'Скидка не активна'],
20 [1, 'Скидка активна'],
21 ],
22 },
23 { 'attr' => 'uid', 'type' => 'status', 'rusname' => 'Доступность для пользователей',
24 'cases' => [
25 [0, 'Скидка доступна всем пользователям'],
26 [1, 'Скидка доступна только зарегистрированным пользователям'],
27 ],
28 },
29 { 'attr' => 'groups', 'rusname' => 'Группы товаров',
30 lookup_opts => { class => $state->{webshop}->{item_section_class}, },
31 allow_null => 1,
32 rem => 'Список разделов, на содержимое которых распространяется скидка по купону',
33 },
34 425 ahitrov { 'attr' => 'min_sum', 'type' => 'string', 'rusname' => 'Порог суммы, с которого действует скидка',
35 default => 0, column => 2, shortname => 'Сумма заказа' },
36 { 'attr' => 'discount', 'type' => 'string', 'rusname' => 'Размер скидки (число или процент)', shortname => 'Скидка',
37 default => 0, column => 3 },
38 424 ahitrov )
39 }
40
41 sub class_name
42 {
43 return 'Webshop: скидка';
44 }
45
46 sub class_description
47 {
48 return 'Webshop: скидка';
49 }
50
51 sub class_table
52 {
53 return 'webshop::SQL::CouponsTable';
54 }
55
56 sub contenido_status_style
57 {
58 my $self = shift;
59 if ( $self->status == 3 ) {
60 return 'color:black;';
61 } elsif ( $self->status == 2 ) {
62 return 'color:red;';
63 } elsif ( $self->status == 4 ) {
64 return 'color:olive;';
65 }
66 }
67
68 sub table_links
69 {
70 return [
71 # { name => 'Купоны', class => 'webshop::Coupon', filter => 'pid', field => 'pid' },
72 ];
73 }
74
75
76 sub get_discount
77 {
78 my $self = shift;
79
80 my (%opts) = @_;
81 my $basket = delete $opts{basket};
82 return 0 unless exists $opts{uid} && $opts{uid} || exists $opts{session} && $opts{session};
83 return 0 unless $self->discount;
84
85 $basket ||= $keeper->{webshop}->get_basket ( %opts );
86 return 0 unless ref $basket eq 'ARRAY' && @$basket;
87
88 my ($number, $sum_total) = (0, 0);
89 map { $number += $_->number; $sum_total += $_->number * $_->price } @$basket;
90 warn "BASKET: $number Items of $sum_total Value\n";
91
92 my $discount_counted = 0;
93 my $items;
94 if ( $self->groups ) {
95 $items = $self->keeper->get_documents (
96 s => [$self->groups],
97 class => $state->{webshop}->{item_document_class},
98 light => 1,
99 return_mode => 'array_ref',
100 );
101 } else {
102 $items = $self->keeper->get_documents (
103 class => $state->{webshop}->{item_document_class},
104 lclass => 'webshop::DiscountItemLink',
105 lsource => $self->id,
106 light => 1,
107 return_mode => 'array_ref',
108 );
109 }
110
111 if ( ref $items eq 'ARRAY' && @$items ) {
112 my $found_sum = 0;
113 foreach my $bi ( @$basket ) {
114 warn "BASKET: Item id [".$bi->item_id."]\n" if $DEBUG;
115 next if $bi->special_price;
116 foreach my $item ( @$items) {
117 if ( $bi->item_id == $item->id ) {
118 warn "BASKET: Item [".$item->name."] id [".$item->id."]\n" if $DEBUG;
119 $found_sum += $bi->number * $bi->price;
120 last;
121 }
122 }
123 }
124 warn "Sum found: [$found_sum]\n" if $DEBUG;
125 return $self->can_discount( $found_sum );
126 } elsif ( $self->groups ) {
127 return 0;
128 } else {
129 my $found_sum = 0;
130 foreach my $bi ( @$basket ) {
131 warn "BASKET: Item id [".$bi->item_id."]\n" if $DEBUG;
132 next if $bi->special_price;
133 $found_sum += $bi->number * $bi->price;
134 }
135 warn "Sum found: [$found_sum]\n" if $DEBUG;
136 return $self->can_discount( $found_sum );
137 }
138 return 0;
139 }
140
141
142 sub can_discount
143 {
144 my $self = shift;
145 my $sum = shift;
146 return 0 unless $sum;
147
148 my $discount = $self->discount;
149 my $min_sum = $self->min_sum || 0;
150 my $count = 0;
151 if ( $discount =~ /([\d\.]+)%/ ) {
152 my $proc = $1;
153 return 0 unless $proc;
154 $count = $sum / 100 * $proc;
155 } else {
156 $count = $discount;
157 }
158 my $rest = $sum - $count;
159 $count = 0 if $rest < $min_sum || $rest == 0;
160 return $count;
161 }
162
163
164
165 sub pre_store
166 {
167 my $self = shift;
168
169 my $default_section = $project->s_alias->{webshop_discounts} if ref $project->s_alias eq 'HASH';
170 if ( $default_section && !$self->sections ) {
171 $self->sections($default_section);
172 }
173
174 return 1;
175 }
176
177
178 sub post_delete
179 {
180 my $self = shift;
181
182 427 ahitrov my $sql = $self->keeper->SQL->prepare('DELETE FROM webshop_coupon_links where source_id = ?');
183 424 ahitrov $sql->execute( $self->id );
184
185 1;
186 }
187
188 1;