Line # Revision Author
1 270 ahitrov package webshop::SQL::CouponsTable;
2
3 use base 'SQL::DocumentTable';
4
5 sub db_table
6 {
7 return 'webshop_coupons';
8 }
9
10 my $available_filters = [qw(
11
12 _class_filter
13 _status_filter
14 _in_id_filter
15 _id_filter
16 _name_filter
17 _class_excludes_filter
18 _sfilter_filter
19 _excludes_filter
20 _datetime_filter
21 _date_equal_filter
22 _date_filter
23 _previous_days_filter
24 _s_filter
25 _link_filter
26
27 _uid_filter
28 274 ahitrov _pid_filter
29 270 ahitrov _code_filter
30 425 ahitrov _interval_filter
31 270 ahitrov )];
32
33 sub available_filters {
34 return $available_filters;
35 }
36
37
38 # ----------------------------------------------------------------------------
39 # Свойства храним в массивах, потому что порядок важен!
40 # Это общие свойства - одинаковые для всех документов.
41 #
42 # attr - обязательный параметр, название атрибута;
43 # type - тип аттрибута, требуется для отображдения;
44 # rusname - русское название, опять же требуется для отображения;
45 # hidden - равен 1, когда
46 # readonly - инициализации при записи только без изменения в дальнейшем
47 # db_field - поле в таблице
48 # default - значение по умолчанию (поле всегда имеет это значение)
49 # ----------------------------------------------------------------------------
50 sub required_properties
51 {
52 my $self = shift;
53
54 my @parent_properties = grep { $_->{attr} ne 'sections' && $_->{attr} ne 'dtime' } $self->SUPER::required_properties;
55 return (
56 @parent_properties,
57 {
58 'attr' => 'code',
59 'type' => 'string',
60 'rusname' => 'Код купона',
61 'shortname' => 'Код',
62 'column' => 1,
63 'rem' => 'Оставьте незаполненным для автоматической генерации',
64 'db_field' => 'code',
65 'db_type' => 'text',
66 },
67 {
68 'attr' => 'dtime',
69 'type' => 'datetime',
70 'rusname' => 'Начало действия купона',
71 'shortname' => 'Начало',
72 686 ahitrov 'column' => 5,
73 270 ahitrov 'db_field' => 'dtime',
74 'db_type' => 'timestamp',
75 'db_opts' => 'not null default now()',
76 'default' => 'CURRENT_TIMESTAMP',
77 },
78 {
79 'attr' => 'etime',
80 'type' => 'datetime',
81 'rusname' => 'Окончание действия купона',
82 'shortname' => 'Конец',
83 686 ahitrov 'column' => 6,
84 270 ahitrov 'db_field' => 'etime',
85 'db_type' => 'timestamp',
86 'db_opts' => 'not null default now()',
87 'default' => 'CURRENT_TIMESTAMP',
88 },
89 {
90 'attr' => 'pid',
91 'type' => 'integer',
92 'rusname' => 'ID прототипа',
93 'hidden' => 1,
94 'db_field' => 'pid',
95 'db_type' => 'integer',
96 'db_opts' => "not null default 0",
97 'default' => 0,
98 },
99 { # User ID
100 'attr' => 'uid',
101 'type' => 'integer',
102 'rusname' => 'ID пользователя',
103 'db_field' => 'uid',
104 'db_type' => 'integer',
105 'db_opts' => "not null default 0",
106 'default' => 0,
107 },
108 {
109 'attr' => 'groups',
110 'type' => 'lookup_multi',
111 'rusname' => 'Группы товаров',
112 'db_field' => 'groups',
113 'db_type' => 'integer[]',
114 },
115 {
116 'attr' => 'sections',
117 'type' => 'sections_list',
118 'rusname' => 'Секции',
119 'hidden' => 1,
120 'db_field' => 'sections',
121 'db_type' => 'integer',
122 },
123 );
124 }
125
126 ########### FILTERS DESCRIPTION ###############################################################################
127 sub _s_filter {
128 my ($self,%opts)=@_;
129 return undef unless ( exists $opts{s} );
130 return &SQL::Common::_generic_int_filter('d.sections', $opts{s});
131 }
132
133 sub _uid_filter {
134 my ($self,%opts)=@_;
135 return undef unless ( exists $opts{uid} );
136 return &SQL::Common::_generic_int_filter('d.uid', $opts{uid});
137 }
138
139 274 ahitrov sub _pid_filter {
140 my ($self,%opts)=@_;
141 return undef unless ( exists $opts{pid} );
142 return &SQL::Common::_generic_int_filter('d.pid', $opts{pid});
143 }
144
145 270 ahitrov sub _code_filter {
146 my ($self,%opts)=@_;
147 return undef unless ( exists $opts{code} );
148 return &SQL::Common::_generic_name_filter('d.code', $opts{code}, undef, \%opts);
149 }
150
151 sub _interval_filter {
152 my ($self,%opts)=@_;
153 return undef unless ( exists $opts{interval} && ref $opts{interval} eq 'ARRAY' && scalar @{$opts{interval}} == 2 );
154 432 ahitrov return undef unless $opts{interval}->[0] && $opts{interval}->[1];
155 my $date1 = ref $opts{interval}->[0] ? $opts{interval}->[0] : Contenido::DateTime->new( postgres => $opts{interval}->[0].( $opts{interval}->[0] =~ /\d{2}\:\d{2}\:\d{2}/ ? '' : ' 00:00:00' ) );
156 my $date2 = ref $opts{interval}->[1] ? $opts{interval}->[1] : Contenido::DateTime->new( postgres => $opts{interval}->[1].( $opts{interval}->[1] =~ /\d{2}\:\d{2}\:\d{2}/ ? '' : ' 00:00:00' ) );
157 return undef if DateTime->compare($date1, $date2) == 1;
158 270 ahitrov
159 425 ahitrov my $wheres = "date_trunc('day', d.dtime) <= ? and date_trunc('day', d.etime) >= ?";
160 432 ahitrov my @values = ($date2->ymd('-'), $date1->ymd('-'));
161 270 ahitrov
162 return ($wheres, \@values);
163 }
164
165 sub _link_filter {
166 my ($self,%opts)=@_;
167
168 my @wheres=();
169 my @binds=();
170
171 # Связь определенного класса
172 if (exists($opts{lclass})) {
173 my ($where, $values) = SQL::Common::_generic_text_filter('l.class', $opts{lclass});
174 push (@wheres, $where);
175 push (@binds, ref($values) ? @$values:$values) if (defined $values);
176 }
177
178 my $lclass = $opts{lclass} || 'Contenido::Link';
179 my $link_table = $lclass->_get_table->db_table();
180
181 # Ограничение по статусу связи
182 if ( exists $opts{lstatus} ) {
183 my ($where, $values) = SQL::Common::_generic_int_filter('l.status', $opts{lstatus});
184 push (@wheres, $where);
185 push (@binds, ref($values) ? @$values:$values) if (defined $values);
186 }
187
188 # Ограничение по uid
189 if ( exists $opts{luid} ) {
190 my ($where, $values) = SQL::Common::_generic_int_filter('l.uid', $opts{luid});
191 push (@wheres, $where);
192 push (@binds, ref($values) ? @$values:$values) if (defined $values);
193 }
194
195 # Ограничение по сессии
196 if ( exists $opts{lsession} ) {
197 my ($where, $values) = SQL::Common::_generic_text_filter('l.session', $opts{lsession});
198 push (@wheres, $where);
199 push (@binds, ref($values) ? @$values:$values) if (defined $values);
200 }
201
202 # Связь с определенным документ(ом/тами) по цели линка
203 if ( exists $opts{ldest} ) {
204 my ($where, $values) = SQL::Common::_generic_int_filter('l.dest_id', $opts{ldest});
205 push (@wheres, $where);
206 push (@binds, ref($values) ? @$values:$values) if (defined $values);
207 if ($self->_single_class) {
208 return (\@wheres, \@binds, " join $link_table as l on l.source_id=d.id");
209 } else {
210 return (\@wheres, \@binds, " join $link_table as l on l.source_id=d.id and l.source_class=d.class");
211 }
212 }
213 # Связь с определенным документ(ом/тами) по источнику линка
214 if ( exists $opts{lsource} ) {
215 my ($where, $values) = SQL::Common::_generic_int_filter('l.source_id', $opts{lsource});
216 push (@wheres, $where);
217 push (@binds, ref($values) ? @$values:$values) if (defined $values);
218 if ($self->_single_class) {
219 return (\@wheres, \@binds, " join $link_table as l on l.dest_id=d.id");
220 } else {
221 return (\@wheres, \@binds, " join $link_table as l on l.dest_id=d.id and l.dest_class=d.class");
222 }
223 }
224
225 return (undef);
226 }
227
228
229 1;