c80_estate 0.1.0.14 → 0.1.0.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/admin/c80_estate/properties.rb +5 -0
- data/app/assets/javascript/c80_estate/backend/admin/shared/areas/gallery3.js +27 -26
- data/app/assets/javascript/c80_estate/backend/admin/shared/properties/property_show.js +480 -0
- data/app/assets/javascript/c80_estate/backend/admin/src/properties.js +5 -0
- data/app/assets/javascript/c80_estate/backend/admin/src/pstats.js +67 -3
- data/app/assets/javascript/c80_estate/lib/highstock.js +434 -0
- data/app/assets/stylesheets/c80_estate/backend/admin_pstats.scss +0 -132
- data/app/assets/stylesheets/c80_estate/backend/dashboard/prop_in_list.scss +1 -1
- data/app/assets/stylesheets/c80_estate/backend/shared/areas/stroitelnye_materialy_item/div_comments.scss +3 -1
- data/app/assets/stylesheets/c80_estate/backend/shared/areas/stroitelnye_materialy_item/div_main.scss +4 -2
- data/app/assets/stylesheets/c80_estate/backend/shared/index_adds_like_pstats.scss +131 -0
- data/app/helpers/c80_estate/app_helper.rb +38 -0
- data/app/helpers/c80_estate/properties_helper.rb +67 -0
- data/app/models/c80_estate/area.rb +15 -8
- data/app/models/c80_estate/property.rb +28 -0
- data/app/models/c80_estate/pstat.rb +96 -10
- data/app/uploaders/c80_estate/pphoto_uploader.rb +2 -2
- data/app/views/admin/properties/_show_property.html.erb +1 -0
- data/app/views/c80_estate/shared/areas/_single_area_on_page.html.erb +1 -1
- data/app/views/c80_estate/shared/properties/_single_property_on_page.html.erb +38 -0
- data/lib/c80_estate/version.rb +1 -1
- metadata +9 -2
@@ -11,138 +11,6 @@ body.admin_pstats {
|
|
11
11
|
-o-transition: opacity .2s ease-in;
|
12
12
|
transition: opacity .2s ease-in;
|
13
13
|
|
14
|
-
div#index_adds {
|
15
|
-
height: calc(483px + 15px);
|
16
|
-
min-height: calc(183px + 15px);
|
17
|
-
margin-bottom: 0;
|
18
|
-
|
19
|
-
> div {
|
20
|
-
float: left;
|
21
|
-
padding: 10px;
|
22
|
-
border-radius: 2px;
|
23
|
-
border: 2px solid #f1f1f1;
|
24
|
-
height: 183px;
|
25
|
-
|
26
|
-
&#coef {
|
27
|
-
width: 33%;
|
28
|
-
text-align: center;
|
29
|
-
margin-bottom: 15px;
|
30
|
-
|
31
|
-
p {
|
32
|
-
width: 100%;
|
33
|
-
|
34
|
-
&.val {
|
35
|
-
margin-top: 15px;
|
36
|
-
margin-bottom: 0;
|
37
|
-
font-size: 40px;
|
38
|
-
}
|
39
|
-
|
40
|
-
}
|
41
|
-
}
|
42
|
-
|
43
|
-
&#coef_sq {
|
44
|
-
width: 33%;
|
45
|
-
text-align: center;
|
46
|
-
|
47
|
-
p {
|
48
|
-
width: 100%;
|
49
|
-
|
50
|
-
&.val {
|
51
|
-
margin-top: 15px;
|
52
|
-
margin-bottom: 0;
|
53
|
-
font-size: 40px;
|
54
|
-
}
|
55
|
-
|
56
|
-
}
|
57
|
-
}
|
58
|
-
|
59
|
-
&#text_stats, &#text_stats_sq {
|
60
|
-
width: calc(33% - 30px);
|
61
|
-
margin-left: 30px;
|
62
|
-
margin-bottom: 15px;
|
63
|
-
|
64
|
-
ul {
|
65
|
-
padding: 0 5px;
|
66
|
-
list-style: none;
|
67
|
-
#title {
|
68
|
-
font-weight: bold;
|
69
|
-
}
|
70
|
-
}
|
71
|
-
|
72
|
-
}
|
73
|
-
|
74
|
-
&#graph_radial {
|
75
|
-
width: calc(33% - 30px);
|
76
|
-
margin-left: 30px;
|
77
|
-
margin-bottom: 15px;
|
78
|
-
padding: 0;
|
79
|
-
|
80
|
-
-webkit-transition: opacity .2s ease-in;
|
81
|
-
-moz-transition: opacity .2s ease-in;
|
82
|
-
-ms-transition: opacity .2s ease-in;
|
83
|
-
-o-transition: opacity .2s ease-in;
|
84
|
-
transition: opacity .2s ease-in;
|
85
|
-
}
|
86
|
-
|
87
|
-
&#graph_radial_sq {
|
88
|
-
width: calc(33% - 30px);
|
89
|
-
margin-left: 30px;
|
90
|
-
padding: 0;
|
91
|
-
|
92
|
-
-webkit-transition: opacity .2s ease-in;
|
93
|
-
-moz-transition: opacity .2s ease-in;
|
94
|
-
-ms-transition: opacity .2s ease-in;
|
95
|
-
-o-transition: opacity .2s ease-in;
|
96
|
-
transition: opacity .2s ease-in;
|
97
|
-
}
|
98
|
-
|
99
|
-
&#graph2 {
|
100
|
-
width: 100%;
|
101
|
-
height: 198px;
|
102
|
-
|
103
|
-
margin-top: 15px;
|
104
|
-
margin-bottom: 15px;
|
105
|
-
padding: 0;
|
106
|
-
display: none;
|
107
|
-
opacity: 0;
|
108
|
-
|
109
|
-
-webkit-transition: opacity .2s ease-in;
|
110
|
-
-moz-transition: opacity .2s ease-in;
|
111
|
-
-ms-transition: opacity .2s ease-in;
|
112
|
-
-o-transition: opacity .2s ease-in;
|
113
|
-
transition: opacity .2s ease-in;
|
114
|
-
|
115
|
-
#graph2canvas {
|
116
|
-
width: 100%;
|
117
|
-
}
|
118
|
-
|
119
|
-
}
|
120
|
-
|
121
|
-
&#graph3 {
|
122
|
-
width: 100%;
|
123
|
-
height: 198px;
|
124
|
-
|
125
|
-
margin-top: 15px;
|
126
|
-
margin-bottom: 15px;
|
127
|
-
padding: 0;
|
128
|
-
display: none;
|
129
|
-
opacity: 0;
|
130
|
-
|
131
|
-
-webkit-transition: opacity .2s ease-in;
|
132
|
-
-moz-transition: opacity .2s ease-in;
|
133
|
-
-ms-transition: opacity .2s ease-in;
|
134
|
-
-o-transition: opacity .2s ease-in;
|
135
|
-
transition: opacity .2s ease-in;
|
136
|
-
|
137
|
-
#graph3canvas {
|
138
|
-
width: 100%;
|
139
|
-
}
|
140
|
-
|
141
|
-
}
|
142
|
-
|
143
|
-
}
|
144
|
-
}
|
145
|
-
|
146
14
|
}
|
147
15
|
|
148
16
|
.batch_actions_selector {
|
data/app/assets/stylesheets/c80_estate/backend/shared/areas/stroitelnye_materialy_item/div_main.scss
CHANGED
@@ -3,7 +3,9 @@ $gallery_wrapper_margin_left: 45px;
|
|
3
3
|
$gallery_frame_width: 310px;
|
4
4
|
$gallery_frame_height: 188px;
|
5
5
|
|
6
|
-
body.admin_areas.show
|
6
|
+
body.admin_areas.show,
|
7
|
+
body.admin_properties.show,
|
8
|
+
{
|
7
9
|
|
8
10
|
h4 {
|
9
11
|
background-color: transparent !important;
|
@@ -22,7 +24,7 @@ body.admin_areas.show {
|
|
22
24
|
|
23
25
|
div#div_main_show_area {
|
24
26
|
width: 1085px;
|
25
|
-
border-right: 1px solid #C2C2C2
|
27
|
+
/*border-right: 1px solid #C2C2C2;*/
|
26
28
|
float: left;
|
27
29
|
|
28
30
|
a {
|
@@ -0,0 +1,131 @@
|
|
1
|
+
div.index_adds_like_pstats {
|
2
|
+
height: calc(483px + 15px);
|
3
|
+
min-height: calc(183px + 15px);
|
4
|
+
margin-bottom: 0;
|
5
|
+
|
6
|
+
> div {
|
7
|
+
float: left;
|
8
|
+
padding: 10px;
|
9
|
+
border-radius: 2px;
|
10
|
+
border: 2px solid #f1f1f1;
|
11
|
+
height: 183px;
|
12
|
+
|
13
|
+
&#coef {
|
14
|
+
width: 33%;
|
15
|
+
text-align: center;
|
16
|
+
margin-bottom: 15px;
|
17
|
+
|
18
|
+
p {
|
19
|
+
width: 100%;
|
20
|
+
|
21
|
+
&.val {
|
22
|
+
margin-top: 15px;
|
23
|
+
margin-bottom: 0;
|
24
|
+
font-size: 40px;
|
25
|
+
}
|
26
|
+
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
&#coef_sq {
|
31
|
+
width: 33%;
|
32
|
+
text-align: center;
|
33
|
+
|
34
|
+
p {
|
35
|
+
width: 100%;
|
36
|
+
|
37
|
+
&.val {
|
38
|
+
margin-top: 15px;
|
39
|
+
margin-bottom: 0;
|
40
|
+
font-size: 40px;
|
41
|
+
}
|
42
|
+
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
&#text_stats, &#text_stats_sq {
|
47
|
+
width: calc(33% - 30px);
|
48
|
+
margin-left: 30px;
|
49
|
+
margin-bottom: 15px;
|
50
|
+
|
51
|
+
ul {
|
52
|
+
padding: 0 5px;
|
53
|
+
list-style: none;
|
54
|
+
#title {
|
55
|
+
font-weight: bold;
|
56
|
+
}
|
57
|
+
}
|
58
|
+
|
59
|
+
}
|
60
|
+
|
61
|
+
&#graph_radial {
|
62
|
+
width: calc(33% - 30px);
|
63
|
+
margin-left: 30px;
|
64
|
+
margin-bottom: 15px;
|
65
|
+
padding: 0;
|
66
|
+
|
67
|
+
-webkit-transition: opacity .2s ease-in;
|
68
|
+
-moz-transition: opacity .2s ease-in;
|
69
|
+
-ms-transition: opacity .2s ease-in;
|
70
|
+
-o-transition: opacity .2s ease-in;
|
71
|
+
transition: opacity .2s ease-in;
|
72
|
+
}
|
73
|
+
|
74
|
+
&#graph_radial_sq {
|
75
|
+
width: calc(33% - 30px);
|
76
|
+
margin-left: 30px;
|
77
|
+
padding: 0;
|
78
|
+
|
79
|
+
-webkit-transition: opacity .2s ease-in;
|
80
|
+
-moz-transition: opacity .2s ease-in;
|
81
|
+
-ms-transition: opacity .2s ease-in;
|
82
|
+
-o-transition: opacity .2s ease-in;
|
83
|
+
transition: opacity .2s ease-in;
|
84
|
+
}
|
85
|
+
|
86
|
+
&#graph2 {
|
87
|
+
width: 100%;
|
88
|
+
height: 350px;
|
89
|
+
|
90
|
+
margin-top: 15px;
|
91
|
+
margin-bottom: 15px;
|
92
|
+
padding: 0;
|
93
|
+
display: none;
|
94
|
+
opacity: 0;
|
95
|
+
|
96
|
+
-webkit-transition: opacity .2s ease-in;
|
97
|
+
-moz-transition: opacity .2s ease-in;
|
98
|
+
-ms-transition: opacity .2s ease-in;
|
99
|
+
-o-transition: opacity .2s ease-in;
|
100
|
+
transition: opacity .2s ease-in;
|
101
|
+
|
102
|
+
#graph2canvas {
|
103
|
+
width: 100%;
|
104
|
+
}
|
105
|
+
|
106
|
+
}
|
107
|
+
|
108
|
+
&#graph3 {
|
109
|
+
width: 100%;
|
110
|
+
height: 350px;
|
111
|
+
|
112
|
+
margin-top: 15px;
|
113
|
+
margin-bottom: 15px;
|
114
|
+
padding: 0;
|
115
|
+
display: none;
|
116
|
+
opacity: 0;
|
117
|
+
|
118
|
+
-webkit-transition: opacity .2s ease-in;
|
119
|
+
-moz-transition: opacity .2s ease-in;
|
120
|
+
-ms-transition: opacity .2s ease-in;
|
121
|
+
-o-transition: opacity .2s ease-in;
|
122
|
+
transition: opacity .2s ease-in;
|
123
|
+
|
124
|
+
#graph3canvas {
|
125
|
+
width: 100%;
|
126
|
+
}
|
127
|
+
|
128
|
+
}
|
129
|
+
|
130
|
+
}
|
131
|
+
}
|
@@ -2,6 +2,7 @@ module C80Estate
|
|
2
2
|
module AppHelper
|
3
3
|
|
4
4
|
include AreasHelper
|
5
|
+
include PropertiesHelper
|
5
6
|
|
6
7
|
def render_table_prop_busy_coef(atype_id: nil)
|
7
8
|
# Rails.logger.debug "<render_table_prop_busy_coef> atype_id = #{atype_id}"
|
@@ -99,5 +100,42 @@ module C80Estate
|
|
99
100
|
render :partial => 'c80_estate/shared/areas/single_area_on_page'
|
100
101
|
end
|
101
102
|
|
103
|
+
def render_show_property(property)
|
104
|
+
|
105
|
+
slug = 'stroitelnye-materialy'
|
106
|
+
@page = Page.where(:slug => slug).first
|
107
|
+
|
108
|
+
@item = property #strh_item_get(@sub_cat.id,params[:item_id]) #Item.find(params[:item_id])
|
109
|
+
# @sub_cat = area.atype #Strsubcat.where(:slug => params[:sub_cat_slug]).first
|
110
|
+
|
111
|
+
# puts "<SiteController.stroitelnye_materialy_item> @item = #{@item}"
|
112
|
+
# {"id"=>5, "item_id"=>5, "item_title"=>"Кирпич длинного формата Alt Berlin GS стандарт качества Qbricks",
|
113
|
+
# "is_main"=>0, "is_hit"=>1, "is_sale"=>0, "strsubcat_id"=>1, "strsubcat_slug"=>"kirpich",
|
114
|
+
# "vendor_id"=>-1,
|
115
|
+
# "prop_18"=>"93,98", "prop_19"=>"0", "prop_20"=>"51", "prop_21"=>"0",
|
116
|
+
# "prop_23"=>"290 x 90 x 52 мм", "prop_24"=>"Германия", "prop_25"=>"1000",
|
117
|
+
# "prop_26"=>"0,10", "prop_27"=>"F300", "prop_28"=>"2,9", "prop_29"=>"чёрный",
|
118
|
+
# "prop_30"=>"пустотелый", "prop_31"=>"пластичное формование", "prop_32"=>"шероховатая",
|
119
|
+
# "prop_33"=>"2,50", "prop_34"=>"450", "prop_35"=>"длинный, ригельный", "prop_36"=>"Не указан",
|
120
|
+
# "prop_37"=>"PR12010-1", "prop_38"=>"NF"}
|
121
|
+
|
122
|
+
# @vparams[:body_class] += ' stroitelnye_materialy_item'
|
123
|
+
|
124
|
+
# add_breadcrumb 'Строительные материалы', '/stroitelnye-materialy', :title => 'Строительные материалы'
|
125
|
+
# add_breadcrumb @sub_cat.title, apph_my_url_strsubcat(@sub_cat), :title => @sub_cat.title
|
126
|
+
# add_breadcrumb @item["item_title"]
|
127
|
+
|
128
|
+
@vparams = {}
|
129
|
+
# @vparams[:page_slug] = 'stroitelnye-materialy' # помогаем слайдеру страницы найти соответствующие картинки
|
130
|
+
# @vparams[:sub_cat_slug] = params[:sub_cat_slug]
|
131
|
+
# @vparams[:c80_order_form_subj] = "#{root_url}stroitelnye-materialy/#{params[:sub_cat_slug]}/#{params[:item_id]}"
|
132
|
+
# @vparams[:c80_order_form_comment_text] = "Заявка на '#{@item["item_title"]}'. Кол-во: "
|
133
|
+
|
134
|
+
# найдём галереи товара
|
135
|
+
@vparams[:galleries] = @item.pphotos #Gallery.where_item(params[:item_id])
|
136
|
+
|
137
|
+
render :partial => 'c80_estate/shared/properties/single_property_on_page'
|
138
|
+
end
|
139
|
+
|
102
140
|
end
|
103
141
|
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module C80Estate
|
2
|
+
module PropertiesHelper
|
3
|
+
|
4
|
+
def smiph_render_property_props(property)
|
5
|
+
|
6
|
+
result = ''
|
7
|
+
|
8
|
+
# area.item_props.each do |prop|
|
9
|
+
# title = prop.prop_name.title
|
10
|
+
# value = prop.value
|
11
|
+
# uom = prop.prop_name.uom.title
|
12
|
+
# result += "<li><span class='ptitle bold'>#{title}</span>: <span class='pvalue'>#{value}</span> <span class='puom'>#{uom}</span></li>"
|
13
|
+
# end
|
14
|
+
|
15
|
+
result += "<li><span class='ptitle bold'>Объём</span>: <span class='pvalue'>#{property.square_value}</span> <span class='puom'>м.кв.</span></li>"
|
16
|
+
result += "<li><span class='ptitle bold'>Доход при 100% занятости</span>: <span class='pvalue'>#{property.power_price_value}</span> <span class='puom'>руб</span></li>"
|
17
|
+
result += "<li><span class='ptitle bold'>Всего площадей</span>: <span class='pvalue'>#{property.areas.all.count}</span></li>"
|
18
|
+
result += "<li><span class='ptitle bold'>Свободно площадей</span>: <span class='pvalue'>#{property.areas.free_areas.count}</span></li>"
|
19
|
+
result += "<li><span class='ptitle bold'>Занято площадей</span>: <span class='pvalue'>#{property.areas.busy_areas.count}</span></li>"
|
20
|
+
result += "<li><span class='ptitle bold'>Свободно метров</span>: <span class='pvalue'>#{property.areas.free_areas_sq}</span> <span class='puom'>м.кв.</span></li>"
|
21
|
+
result += "<li><span class='ptitle bold'>Занято метров</span>: <span class='pvalue'>#{property.areas.busy_areas_sq}</span> <span class='puom'>м.кв.</span></li>"
|
22
|
+
result += "<li><span style='font-weight:bold;'>Площади объекта по типам:</span></li><ul>"
|
23
|
+
|
24
|
+
Atype.all.each do |atype|
|
25
|
+
aa = Area.where_atype(atype.id)
|
26
|
+
c = aa.count
|
27
|
+
cb = aa.busy_areas.count
|
28
|
+
result +=
|
29
|
+
"<li><span class='ptitle bold'>#{atype.title}</span>: <span class='pvalue'>#{c}</span>
|
30
|
+
<abbr title='Занятых'><span class='puom'>(#{cb})</span></abbr></li>"
|
31
|
+
end
|
32
|
+
|
33
|
+
result = "<ul>#{result}</ul></ul>"
|
34
|
+
result.html_safe
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
def ph_render_tech_props(property)
|
39
|
+
|
40
|
+
result = ''
|
41
|
+
index = 0
|
42
|
+
|
43
|
+
area_item_props = [
|
44
|
+
{ title: 'ID объекта', value: property.id },
|
45
|
+
{ title: 'Название', value: property.title },
|
46
|
+
{ title: 'Адрес', value: property.address },
|
47
|
+
{ title: 'Кто создал', value: property.owner.email },
|
48
|
+
{ title: 'Время создания', value: property.created_at.strftime('%Y/%m/%d %H:%M:%S') },
|
49
|
+
{ title: 'Время последнего изменения', value: property.updated_at.strftime('%Y/%m/%d %H:%M:%S') },
|
50
|
+
{ title: 'Кто последний раз вносил изменения', value: property.last_updater },
|
51
|
+
{ title: 'Ответственный', value: property.assigned_person_title }
|
52
|
+
]
|
53
|
+
|
54
|
+
area_item_props.each do |prop|
|
55
|
+
title = prop[:title]
|
56
|
+
value = prop[:value]
|
57
|
+
result += "<tr class='p#{index % 2}'><td><span class='ptitle medium'>#{title}</span></td> <td><span class='pvalue'>#{value}</span></td></tr>"
|
58
|
+
index += 1
|
59
|
+
end
|
60
|
+
|
61
|
+
result = "<table>#{result}</table>"
|
62
|
+
result.html_safe
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
@@ -41,10 +41,9 @@ module C80Estate
|
|
41
41
|
def self.free_areas_sq
|
42
42
|
sum = 0
|
43
43
|
self.free_areas.each do |area|
|
44
|
-
area_prop_square = area.item_props.where(:prop_name_id => 9)
|
45
|
-
|
46
|
-
|
47
|
-
end
|
44
|
+
# area_prop_square = area.item_props.where(:prop_name_id => 9)
|
45
|
+
area_prop_square = area.square_value
|
46
|
+
sum += area_prop_square.first.value.to_i
|
48
47
|
end
|
49
48
|
sum
|
50
49
|
end
|
@@ -172,6 +171,10 @@ module C80Estate
|
|
172
171
|
|
173
172
|
end
|
174
173
|
|
174
|
+
def self.where_atype(atype_id)
|
175
|
+
self.where(:atype_id => atype_id)
|
176
|
+
end
|
177
|
+
|
175
178
|
def atype_title
|
176
179
|
res = "-"
|
177
180
|
if atype.present?
|
@@ -233,23 +236,27 @@ module C80Estate
|
|
233
236
|
end
|
234
237
|
|
235
238
|
def price_value
|
236
|
-
res =
|
239
|
+
res = 0
|
237
240
|
p = item_props.where(:prop_name_id => 1)
|
238
241
|
if p.count > 0
|
239
|
-
res = p.first.value
|
242
|
+
res = p.first.value.to_i
|
240
243
|
end
|
241
244
|
res
|
242
245
|
end
|
243
246
|
|
244
247
|
def square_value
|
245
|
-
res =
|
248
|
+
res = 0
|
246
249
|
p = item_props.where(:prop_name_id => 9)
|
247
250
|
if p.count > 0
|
248
|
-
res = p.first.value
|
251
|
+
res = p.first.value.to_f
|
249
252
|
end
|
250
253
|
res
|
251
254
|
end
|
252
255
|
|
256
|
+
def power_price_value
|
257
|
+
price_value * 1.0 * square_value
|
258
|
+
end
|
259
|
+
|
253
260
|
def main_image_url
|
254
261
|
url = 'no_thumb.png'
|
255
262
|
if aphotos.count > 0
|