Line # Revision Author
1 270 ahitrov package webshop::Coupon;
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 { 'attr' => 'class', 'column' => undef },
14 { 'attr' => 'status', 'type' => 'status', 'rusname' => 'Статус',
15 'cases' => [
16 [0, 'Купон не активен'],
17 [1, 'Купон активен и разослан'],
18 [2, 'Прототип ждет обработки'],
19 [3, 'Купон использован'],
20 [4, 'Прототип обработан роботом'],
21 ],
22 },
23 { 'attr' => 'uid_proto','type' => 'status', 'rusname' => 'Прототип пользовательского доступа',
24 'cases' => [
25 [0, 'Купон доступен всем пользователям'],
26 [1, 'Персональный купон, создается для всех зарегистрированных пользователей'],
27 [2, 'Персональный купон, пользователи по выбору'],
28 [3, 'Персональный купон для одного пользователя'],
29 ],
30 'rem' => 'Заполняется при создании прототипа купона',
31 },
32 { 'attr' => 'uid_condition', 'type' => 'string', 'rusname' => 'Условие для прототипа' },
33 { 'attr' => 'uid', 'type' => 'pickup', 'rusname' => 'Пользователь',
34 lookup_opts => { class => $state->{users}->profile_document_class, order_by => 'email', search_by => 'email' },
35 allow_null => 1, default => 0,
36 rem => '0 - действует для всех пользователей, многократно. id - для одного пользователя, однократно.'
37 },
38 { 'attr' => 'groups', 'rusname' => 'Группы товаров',
39 lookup_opts => { class => $state->{webshop}->{item_section_class}, },
40 allow_null => 1,
41 rem => 'Список разделов, на содержимое которых распространяется скидка по купону',
42 },
43 { 'attr' => 'discount', 'type' => 'string', 'rusname' => 'Скидка на сумму заказа (число или процент)', shortname => 'Скидка',
44 default => 0, column => 2 },
45 { 'attr' => 'min_sum', 'type' => 'string', 'rusname' => 'Минимальная сумма, на которую действует скидка', default => 0 },
46 )
47 }
48
49 sub class_name
50 {
51 return 'Webshop: купон';
52 }
53
54 sub class_description
55 {
56 return 'Webshop: купон';
57 }
58
59 sub class_table
60 {
61 return 'webshop::SQL::CouponsTable';
62 }
63
64 sub contenido_status_style
65 {
66 my $self = shift;
67 if ( $self->status == 3 ) {
68 return 'color:black;';
69 } elsif ( $self->status == 2 ) {
70 return 'color:red;';
71 } elsif ( $self->status == 4 ) {
72 return 'color:olive;';
73 }
74 }
75
76 274 ahitrov sub table_links
77 {
78 return [
79 { name => 'Купоны', class => 'webshop::Coupon', filter => 'pid', field => 'pid' },
80 ];
81 }
82 270 ahitrov
83
84 sub get_discount
85 {
86 my $self = shift;
87
88 my (%opts) = @_;
89 my $basket = delete $opts{basket};
90 return 0 unless exists $opts{uid} && $opts{uid} || exists $opts{session} && $opts{session};
91 return 0 unless $self->discount;
92
93 $basket ||= $keeper->{webshop}->get_basket ( %opts );
94 return 0 unless ref $basket eq 'ARRAY' && @$basket;
95
96 my ($number, $sum_total) = (0, 0);
97 map { $number += $_->number; $sum_total += $_->number * $_->price } @$basket;
98 warn "BASKET: $number Items of $sum_total Value\n";
99
100 my $discount_counted = 0;
101 my $items;
102 if ( $self->groups ) {
103 $items = $self->keeper->get_documents (
104 s => [$self->groups],
105 class => $state->{webshop}->{item_document_class},
106 light => 1,
107 return_mode => 'array_ref',
108 );
109 } else {
110 $items = $self->keeper->get_documents (
111 class => $state->{webshop}->{item_document_class},
112 lclass => 'webshop::CouponItemLink',
113 lsource => $self->id,
114 light => 1,
115 return_mode => 'array_ref',
116 );
117 }
118
119 if ( ref $items eq 'ARRAY' && @$items ) {
120 my $found_sum = 0;
121 foreach my $bi ( @$basket ) {
122 warn "BASKET: Item id [".$bi->item_id."]\n";
123 356 ahitrov next unless $bi->special_price;
124 270 ahitrov foreach ( @$items) {
125 warn "BASKET: Item [".$_->name."] id [".$_->id."]\n";
126 if ( $bi->item_id == $_->id ) {
127 $found_sum += $bi->number * $bi->price;
128 last;
129 }
130 }
131 }
132 warn "Sum found: [$found_sum]\n";
133 return $self->can_discount( $found_sum );
134 } elsif ( $self->groups ) {
135 return 0;
136 }
137
138 return $self->can_discount( $sum_total );
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
166 #sub table_links
167 #{
168 # return [
169 # { name => 'Города', class => 'webshop::Town', filter => 'pid', field => 'pid' },
170 # ];
171 #}
172
173 sub pre_store
174 {
175 my $self = shift;
176
177 my $default_section = $project->s_alias->{webshop_coupons} if ref $project->s_alias eq 'HASH';
178 if ( $default_section && !$self->sections ) {
179 $self->sections($default_section);
180 }
181
182 return 1;
183 }
184
185 274 ahitrov
186 sub post_delete
187 {
188 my $self = shift;
189
190 my $sql = $self->keeper->SQL->prepare('DELETE FROM webshop_coupons where pid = ?');
191 $sql->execute( $self->id );
192 276 ahitrov $sql = $self->keeper->SQL->prepare('DELETE FROM webshop_coupon_links where source_id = ?');
193 274 ahitrov $sql->execute( $self->id );
194 276 ahitrov $sql = $self->keeper->SQL->prepare('DELETE FROM webshop_order_coupons where dest_id = ?');
195 274 ahitrov $sql->execute( $self->id );
196
197 1;
198 }
199
200 270 ahitrov 1;