Диплом: Автоматизация процессов управления взаимоотношениями с клиентами в службе реализации ООО "Киноафиша"

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
99
this.newClient = false;
this.setState({
displayClientDialog: true,
client: Object.assign({}, e.data)
});
}
addNew(what) {
if (what === 'film') {
this.newFilm = true;
this.setState({
film: {
name: '',
description: '',
big_poster: '',
small_poster: '',
trailer: '',
director: '',
stars: '',
film_length: '',
age: '',
genre: '',
country: '',
producers: '',
premier: ''
},
displayFilmDialog: true
});
}
if (what === 'cinema') {
this.newCinema = true;
this.setState({
cinema: {name: '', address: '', site: '', phone_number: '', metro: '', lat: '', lng: ''},
displayCinemaDialog: true
});
}
if (what === 'client') {
this.newClient = true;
this.setState({
client: {email: '', phone_number: ''},
displayClientDialog: true
});
}
if (what === 'session') {
this.newSession = true;
this.setState({
session: {
data: {
name: "",
date: "",
price: ""
},
children: []
},
displaySessionDialog: true
});
}
}
renderCinemaEditor() {
let header = <div className="ui-helper-clearfix" style={{lineHeight:
'1.87em'}}>Кинотеатры</div>;
let footer = <div className="ui-helper-clearfix" style={{width: '100%'}}>
<Button style={{float: 'left'}} icon="fa-plus" label="Добавить" onClick={() => {
100
this.addNew('cinema')
}}/>
</div>;
let dialogFooter = <div className="ui-dialog-buttonpane ui-helper-clearfix">
<Button icon="fa-close" label="Удалить" className="ui-button-danger" onClick={() => {
this.delete('cinema')
}}/>
<Button label="Сохранить" icon="fa-check" onClick={() => {
this.save('cinema')
}}/>
</div>;
return (
<div>
<div className="content-section implementation">
<DataTable value={this.state.cinemaList} emptyMessage="Нет записей" paginator={true} rows={15}
header={header} footer={footer}
selectionMode="single" selection={this.state.selectedCar} onSelectionChange={(e) => {
this.setState({selectedCar: e.data});
}}
onRowSelect={this.onCinemaSelect}>
<Column field="name" header="Название" filter={true} sortable={true}/>
<Column field="address" header="Адрес"/>
<Column field="site" header="Сайт" style={{textAlign: 'center'}}/>
<Column field="phone_number" header="Телефон" style={{textAlign: 'center'}}/>
<Column field="metro" header="Станция метро" style={{textAlign: 'center'}}/>
</DataTable>
<Dialog visible={this.state.displayCinemaDialog} header="Подробно о кинотеатре" modal={true}
footer={dialogFooter}
onHide={() => this.setState({displayCinemaDialog: false})}>
{this.state.cinema && <div className="ui-grid ui-grid-responsive ui-fluid">
<div className="ui-grid-row">
<div className="ui-grid-col-4" style={{padding: '4px 10px'}}><label
htmlFor="name">Название</label></div>
<div className="ui-grid-col-8" style={{padding: '4px 10px'}}>
<InputText id="name" onChange={(e) => {
this.updateCinemaProperty('name', e.target.value)
}} value={this.state.cinema.name}/>
</div>
</div>
<div className="ui-grid-row">
<div className="ui-grid-col-4" style={{padding: '4px 10px'}}><label
htmlFor="address">Адрес</label></div>
<div className="ui-grid-col-8" style={{padding: '4px 10px'}}>
<InputText id="address" onChange={(e) => {
this.updateCinemaProperty('address', e.target.value)
}} value={this.state.cinema.address}/>
</div>
</div>
<div className="ui-grid-row">
<div className="ui-grid-col-4" style={{padding: '4px 10px'}}><label
htmlFor="site">Сайт</label></div>
<div className="ui-grid-col-8" style={{padding: '4px 10px'}}>
<InputText id="site" onChange={(e) => {
this.updateCinemaProperty('site', e.target.value)
}} value={this.state.cinema.site}/>
</div>
</div>
<div className="ui-grid-row">
<div className="ui-grid-col-4" style={{padding: '4px 10px'}}><label
htmlFor="phone_number">Номер телефона</label></div>
<div className="ui-grid-col-8" style={{padding: '4px 10px'}}>
<InputText mask="+7(999)999-9999" id="phone_number" onChange={(e) => {
101
this.updateCinemaProperty('phone_number', e.target.value)
}} value={this.state.cinema.phone_number}/>
</div>
</div>
<div className="ui-grid-row">
<div className="ui-grid-col-4" style={{padding: '4px 10px'}}><label
htmlFor="metro">Метро</label></div>
<div className="ui-grid-col-8" style={{padding: '4px 10px'}}>
<InputText id="metro" onChange={(e) => {
this.updateCinemaProperty('metro', e.target.value)
}} value={this.state.cinema.metro}/>
</div>
</div>
<div className="ui-grid-row">
<div className="ui-grid-col-12" style={{padding: '4px 10px'}}><label
htmlFor="metro">Координаты</label></div>
<div className="ui-grid-col-4" style={{paddingTop: '10px', paddingLeft: '15px'}}><label
htmlFor="metro">Широта</label></div>
<div className="ui-grid-col-8" style={{padding: '4px 10px'}}>
<InputText id="metro" onChange={(e) => {
this.updateCinemaProperty('lat', e.target.value)
}} value={this.state.cinema.lat}/>
</div>
<div className="ui-grid-col-4" style={{paddingTop: '10px'}}><label
htmlFor="metro">Долгота</label></div>
<div className="ui-grid-col-8" style={{padding: '4px 10px'}}>
<InputText id="metro" onChange={(e) => {
this.updateCinemaProperty('lng', e.target.value)
}} value={this.state.cinema.lng}/>
</div>
</div>
</div>}
</Dialog>
</div>
</div>);
}
renderFilmEditor() {
let header = <div className="ui-helper-clearfix" style={{lineHeight: '1.87em'}}>Фильмы</div>;
let footer = <div className="ui-helper-clearfix" style={{width: '100%'}}>
<Button style={{float: 'left'}} icon="fa-plus" label="Добавить" onClick={() => {
this.addNew('film')
}}/>
</div>;
let dialogFooter = <div className="ui-dialog-buttonpane ui-helper-clearfix">
<Button icon="fa-close" label="Удалить" className="ui-button-danger" onClick={() => {
this.delete('film')
}}/>
<Button label="Сохранить" icon="fa-check" onClick={() => {
this.save('film')
}}/>
</div>;
const dataFormat = {
'big_poster': (cell) => {
if (cell.big_poster != '') {
return <i className='fa fa-check'/>
} else return <i className='fa fa-times'/>
},
'small_poster': (cell) => {
if (cell.big_poster != '') {
return <i className='fa fa-check'/>
} else return <i className='fa fa-times'/>
},
102
'trailer': (cell) => {
if (cell.big_poster != '') {
return <i className='fa fa-check'/>
} else return <i className='fa fa-times'/>
}
}
return (
<div>
<div className="content-section implementation">
<DataTable value={this.state.filmList} emptyMessage="Нет записей" scrollable={true} paginator={true}
scrollHeight="400px"
rows={5} header={header} footer={footer}
selectionMode="single" selection={this.state.selectedCar} onSelectionChange={(e) => {
this.setState({selectedCar: e.data});
}}
onRowSelect={this.onFilmSelect}>
<Column field="name" header="Название" filter={true} sortable={true} style={{width: '250px'}}/>
<Column field="description" header="Описание" style={{width: '300px'}}/>
<Column field="big_poster" body={dataFormat.big_poster} header="Большой постер"
style={{width: '150px', textAlign: 'center'}}/>
<Column field="small_poster" body={dataFormat.small_poster} header="Маленький постер"
style={{width: '150px', textAlign: 'center'}}/>
<Column field="trailer" body={dataFormat.trailer} header="Трейлер"
style={{width: '150px', textAlign: 'center'}}/>
<Column field="director" header="Режиссёр" style={{width: '200px'}}/>
<Column field="stars" header="Актёры" style={{width: '300px'}}/>
<Column field="producers" header="Продюссеры" style={{width: '250px'}}/>
<Column field="film_length" header="Продолжительность"
style={{width: '200px', textAlign: 'center'}}/>
<Column field="age" header="Возраст" style={{width: '100px', textAlign: 'center'}}/>
<Column field="genre" header="Жанр" style={{width: '150px', textAlign: 'center'}}/>
<Column field="country" header="Страна" style={{width: '100px', textAlign: 'center'}}/>
<Column field="premier" header="Премьера" style={{width: '250px'}}/>
</DataTable>
<Dialog visible={this.state.displayFilmDialog} header="Подробно о фильме" modal={true}
footer={dialogFooter} width='50%'
onHide={() => this.setState({displayFilmDialog: false})}>
{this.state.film && <div className="ui-grid ui-grid-responsive ui-fluid">
<div className="ui-grid-row">
<div className="ui-grid-col-4" style={{padding: '4px 10px'}}><label
htmlFor="name">Название</label></div>
<div className="ui-grid-col-8" style={{padding: '4px 10px'}}>
<InputText id="name" onChange={(e) => {
this.updateFilmProperty('name', e.target.value)
}} value={this.state.film.name}/>
</div>
</div>
<div className="ui-grid-row">
<div className="ui-grid-col-4" style={{padding: '4px 10px'}}><label
htmlFor="description">Описание</label></div>
<div className="ui-grid-col-8" style={{padding: '4px 10px'}}>
<InputTextarea rows={5} cols={30} autoResize={true} id="description"
onChange={(e) => {
this.updateFilmProperty('description', e.target.value)
}} value={this.state.film.description}/>
</div>
</div>
<div className="ui-grid-row">
<div className="ui-grid-col-4" style={{padding: '4px 10px'}}><label
htmlFor="big_poster">Большой постер (url)</label></div>
<div className="ui-grid-col-8" style={{padding: '4px 10px'}}>
<InputText id="site" onChange={(e) => {
103
this.updateFilmProperty('big_poster', e.target.value)
}} value={this.state.film.big_poster}/>
</div>
</div>
<div className="ui-grid-row">
<div className="ui-grid-col-4" style={{padding: '4px 10px'}}><label
htmlFor="small_poster">Маленький постер (url)</label></div>
<div className="ui-grid-col-8" style={{padding: '4px 10px'}}>
<InputText onChange={(e) => {
this.updateFilmProperty('small_poster', e.target.value)
}} value={this.state.film.small_poster}/>
</div>
</div>
<div className="ui-grid-row">
<div className="ui-grid-col-4" style={{padding: '4px 10px'}}><label
htmlFor="trailer">Трейлер (url)</label></div>
<div className="ui-grid-col-8" style={{padding: '4px 10px'}}>
<InputText id="trailer" onChange={(e) => {
this.updateFilmProperty('trailer', e.target.value)
}} value={this.state.film.trailer}/>
</div>
</div>
<div className="ui-grid-row">
<div className="ui-grid-col-4" style={{padding: '4px 10px'}}><label
htmlFor="director">Режиссёр</label></div>
<div className="ui-grid-col-8" style={{padding: '4px 10px'}}>
<InputText id="director" onChange={(e) => {
this.updateFilmProperty('director', e.target.value)
}} value={this.state.film.director}/>
</div>
</div>
<div className="ui-grid-row">
<div className="ui-grid-col-4" style={{padding: '4px 10px'}}><label
htmlFor="stars">Актёры</label></div>
<div className="ui-grid-col-8" style={{padding: '4px 10px'}}>
<InputText id="stars" onChange={(e) => {
this.updateFilmProperty('stars', e.target.value)
}} value={this.state.film.stars}/>
</div>
</div>
<div className="ui-grid-row">
<div className="ui-grid-col-4" style={{padding: '4px 10px'}}><label
htmlFor="film_length">Продолжительность</label></div>
<div className="ui-grid-col-8" style={{padding: '4px 10px'}}>
<InputText id="film_length" onChange={(e) => {
this.updateFilmProperty('film_length', e.target.value)
}} value={this.state.film.film_length}/>
</div>
</div>
<div className="ui-grid-row">
<div className="ui-grid-col-4" style={{padding: '4px 10px'}}><label
htmlFor="age">Возраст</label></div>
<div className="ui-grid-col-8" style={{padding: '4px 10px'}}>
<InputText id="age" onChange={(e) => {
this.updateFilmProperty('age', e.target.value)
}} value={this.state.film.age}/>
</div>
</div>
<div className="ui-grid-row">
<div className="ui-grid-col-4" style={{padding: '4px 10px'}}><label
htmlFor="genre">Жанр</label></div>
<div className="ui-grid-col-8" style={{padding: '4px 10px'}}>
104
<InputText id="genre" onChange={(e) => {
this.updateFilmProperty('genre', e.target.value)
}} value={this.state.film.genre}/>
</div>
</div>
<div className="ui-grid-row">
<div className="ui-grid-col-4" style={{padding: '4px 10px'}}><label
htmlFor="country">Страна</label></div>
<div className="ui-grid-col-8" style={{padding: '4px 10px'}}>
<InputText id="country" onChange={(e) => {
this.updateFilmProperty('country', e.target.value)
}} value={this.state.film.country}/>
</div>
</div>
<div className="ui-grid-row">
<div className="ui-grid-col-4" style={{padding: '4px 10px'}}><label
htmlFor="producers">Продюсеры</label></div>
<div className="ui-grid-col-8" style={{padding: '4px 10px'}}>
<InputText id="producers" onChange={(e) => {
this.updateFilmProperty('producers', e.target.value)
}} value={this.state.film.producers}/>
</div>
</div>
<div className="ui-grid-row">
<div className="ui-grid-col-4" style={{padding: '4px 10px'}}><label
htmlFor="premier">Премьера</label></div>
<div className="ui-grid-col-8" style={{padding: '4px 10px'}}>
<InputText id="premier" onChange={(e) => {
this.updateFilmProperty('premier', e.target.value)
}} value={this.state.film.premier}/>
</div>
</div>
</div>}
</Dialog>
</div>
</div>);
}
onTreeSelect(e) {
this.setState({selectedTree: e.selection});
}
renderSessionEditor() {
let footer = <div className="ui-helper-clearfix" style={{width: '100%'}}>
<Button style={{float: 'left'}} icon="fa-plus" label="Добавить" onClick={() => {
this.addNew('session')
}}/>
</div>;
let dialogFooter = <div className="ui-dialog-buttonpane ui-helper-clearfix">
<Button icon="fa-close" label="Удалить" className="ui-button-danger" onClick={() => {
this.delete('film')
}}/>
<Button label="Сохранить" icon="fa-check" onClick={() => {
this.save('film')
}}/>
</div>;
return (
<div className="content-section implementation">
<TreeTable footer={footer} value={this.state.sessionList}
footer={footer} selectionMode="single"
header="Сеансы"
selectionChange={this.onTreeSelect.bind(this)}>
<Column field="name" header="Название"/>
<Column field="date" header="Дата и время" style={{textAlign: 'center'}}/>
105
<Column field="price" header="Стоимость" style={{textAlign: 'center'}}/>
</TreeTable>
<Dialog visible={this.state.displayClientDialog} header="Подробно о клиенте" modal={true}
footer={dialogFooter}
onHide={() => this.setState({displayClientDialog: false})}>
{this.state.client && <div className="ui-grid ui-grid-responsive ui-fluid">
<div className="ui-grid-row">
<div className="ui-grid-col-4" style={{padding: '4px 10px'}}><label
htmlFor="email">Электронная почта</label></div>
<div className="ui-grid-col-8" style={{padding: '4px 10px'}}>
<InputText id="email" onChange={(e) => {
this.updateClientProperty('email', e.target.value)
}} value={this.state.client.email}/>
</div>
</div>
<div className="ui-grid-row">
<div className="ui-grid-col-4" style={{padding: '4px 10px'}}><label
htmlFor="phone_number">Номер телефона</label></div>
<div className="ui-grid-col-8" style={{padding: '4px 10px'}}>
<InputText id="phone_number" onChange={(e) => {
this.updateClientProperty('phone_number', e.target.value)
}} value={this.state.client.phone_number}/>
</div>
</div>
</div>}
</Dialog></div>)
}
renderClientBase() {
let header = <div className="ui-helper-clearfix" style={{lineHeight: '1.87em'}}>Клиенты</div>;
let footer = <div className="ui-helper-clearfix" style={{width: '100%'}}>
<Button style={{float: 'left'}} icon="fa-plus" label="Добавить" onClick={() => {
this.addNew('client')
}}/>
<div className='ui-grid-row'>
<div className='ui-grid-col-12'>
<InputTextarea rows={5} cols={35} placeholder="Отправить сообщение"/>
</div>
<div className='ui-grid-col-6'>
<Button icon="fa-comments" style={{float: 'right'}} label="На телефон"
onClick={this.sendSms}/>
</div>
<div className='ui-grid-col-6'>
<Button icon="fa-envelope" label="На почту" style={{float: 'left'}}
onClick={this.sendEmail}/>
</div>
</div>
</div>;
let dialogFooter = <div className="ui-dialog-buttonpane ui-helper-clearfix">
<Button icon="fa-close" label="Удалить" className="ui-button-danger" onClick={() => {
this.delete('client')
}}/>
<Button label="Сохранить" icon="fa-check" onClick={() => {
this.save('client')
}}/>
</div>;
return (<div>
<div className="content-section implementation">
<DataTable value={this.state.clientList} emptyMessage="Нет записей"
scrollable={true} paginator={true}
scrollHeight="400px"
rows={10} header={header} footer={footer}
106
selectionMode="single" selection={this.state.selectedCar}
onSelectionChange={(e) => {
this.setState({selectedCar: e.data});
}}
onRowSelect={this.onClientSelect}>
<Column selectionMode="multiple" style={{width: '2em'}}/>
<Column field="email" header="Электронная почта" filter={true} sortable={true}
style={{textAlign: 'center'}}/>
<Column field="phone_number" header="Номер телефона" filter={true} style={{textAlign: 'center'}}/>
</DataTable>
<Dialog visible={this.state.displayClientDialog} header="Подробно о клиенте" modal={true}
footer={dialogFooter}
onHide={() => this.setState({displayClientDialog: false})}>
{this.state.client && <div className="ui-grid ui-grid-responsive ui-fluid">
<div className="ui-grid-row">
<div className="ui-grid-col-4" style={{padding: '4px 10px'}}><label
htmlFor="email">Электронная почта</label></div>
<div className="ui-grid-col-8" style={{padding: '4px 10px'}}>
<InputText id="email" onChange={(e) => {
this.updateClientProperty('email', e.target.value)
}} value={this.state.client.email}/>
</div>
</div>
<div className="ui-grid-row">
<div className="ui-grid-col-4" style={{padding: '4px 10px'}}><label
htmlFor="phone_number">Номер телефона</label></div>
<div className="ui-grid-col-8" style={{padding: '4px 10px'}}>
<InputText id="phone_number" onChange={(e) => {
this.updateClientProperty('phone_number', e.target.value)
}} value={this.state.client.phone_number}/>
</div>
</div>
</div>}
</Dialog>
</div>
</div>);
}
export() {
this.dt.exportCSV();
}
analyticalReportDateOnChange(e) {
this.setState({analyticalReportDate: e.value})
}
renderAnalyticalReport() {
let header = <div><Calendar value={this.state.analyticalReportDate}
onChange={this.analyticalReportDateOnChange}
selectionMode="multiple" showIcon="true" placeholder="Дата"
style={{float: 'left'}} dateFormat="dd.mm.yy"/>
<div className="ui-helper-clearfix" style={{lineHeight: '1.87em'}}>Отчёт</div>
</div>;
let footer = <div className="ui-helper-clearfix" style={{width: '100%'}}>
<Button style={{float: 'left'}} icon="fa-print" label="Печать" onClick={this.export}/>
</div>;
return (<div>
<div className="content-section implementation">
<DataTable value={this.state.analyticalReport}
exportFilename={this.state.analyticalReportDate !== null ?
moment(new Date(this.state.analyticalReportDate)).format('DD.MM.YYYY') : 'Аналитический отчёт'}
emptyMessage="Нет записей" scrollable={true} paginator={true}
scrollHeight="400px" rows={10} header={header} footer={footer}
ref={(el) => {
this.dt = el;
107
}}>
<Column field="cinema" header="Кинотеатр" sortable={true} filter/>
<Column field="film" header="Фильм" sortable={true} filter/>
<Column field="session" header="Сеанс" sortable={true} style={{textAlign: 'center'}}/>
<Column field="sum" header="Выручка" sortable={true} style={{textAlign: 'center'}}/>
<Column field="fullness" header="Процент заполненности" sortable={true}
style={{textAlign: 'center'}}/>
</DataTable>
</div>
</div>);
}
render() {
const MyMapComponent = withScriptjs(withGoogleMap((props) =>
<GoogleMap
defaultZoom={12}
defaultCenter={{lat: 55.755826, lng: 37.6172999}}
>
{this.state.cinemaList.map(marker => {
return <Marker position={{lat: marker.lat, lng: marker.lng}}/>
})
}
</GoogleMap>
));
const header = <div style={{'textAlign': 'left'}}>
<i className="fa fa-search" style={{margin: '4px 4px 0 0'}}/>&nbsp;
<InputText type="search" placeholder="Поиск" size="45"/>
</div>;
return (
<div className="App">
<div className="ui-g">
<div className="ui-g-2"/>
<div className="ui-g-8">
<header className="App-header">
<div className="ui-grid-row">
<div className="ui-grid-col-9">
<h1>КИН<i className="fa fa-star-o fa-spin"/>АФИША</h1>
</div>
<div className="ui-grid-col-2">
<h3 style={{float: 'right'}}>Вы вошли как <br/>Администратор</h3>
</div>
<div className="ui-grid-col-1">
<h3 style={{float: 'right'}}><Button><i className="fa fa-times"/></Button></h3>
</div>
</div>
</header>
<div className="content-section implementation">
<TabView>
<TabPanel header="Фильмы" leftIcon="fa-film" headerClassName='film_panel_style'>
<DataGrid value={this.state.filmList} itemTemplate={this.carTemplate.bind(this)}
header={header}
paginator={true}
rows={12}/>
</TabPanel>
<TabPanel header="Кинотеатры" leftIcon="fa-video-camera"
headerClassName='cinema_panel_style'>
<div className="ui-grid-row">
<div className="ui-grid-col-8">
<DataList value={this.state.cinemaList}
itemTemplate={this.cinemaTemplate.bind(this)}
paginator={true} rows={10} header={header}/>
</div>
<div className="ui-grid-col-4">
108
<MyMapComponent
isMarkerShown
googleMapURL="https://maps.googleapis.com/maps/api/js?v=3.exp&libraries=geometry,drawing,places"
loadingElement={<div style={{height: `100%`}}/>}
containerElement={<div style={{height: `545px`}}/>}
mapElement={<div style={{height: `100%`}}/>}
/>
</div>
</div>
</TabPanel>
<TabPanel header="Панель администратора" leftIcon="fa-cogs"
headerClassName='admin_panel_style'>
<Accordion>
<AccordionTab header="Справочник фильмов">
{this.renderFilmEditor()}
</AccordionTab>
<AccordionTab header="Справочник кинотеатров">
{this.renderCinemaEditor()}
</AccordionTab>
<AccordionTab header="Расписание киносеансов">
{this.renderSessionEditor()}
</AccordionTab>
<AccordionTab header="База данных клиентов">
{this.renderClientBase()}
</AccordionTab>
<AccordionTab header="Аналитический отчёт">
{this.renderAnalyticalReport()}
</AccordionTab>
</Accordion>
</TabPanel>
</TabView>
</div>
</div>
</div>
{this.state.showFilmDlg ? this.renderFilmDialog() : null}
{this.state.showSessionDlg ? this.renderSessionDialog() : null}
{this.state.showSessionForSelectedCinemaDlg ?
this.renderSessionForSelectedCinemaDialog() : null}
<div className="ui-g-2"/>
</div>
);
}
}
export default App;

Смотрите также:

"Автоматизация обработки заявок ООО "Проектно-Строительная Компания"
"Автоматизация процесса аттестации персонала для ООО "Нэт Бай Нэт Холдинг"
"Анализ интернет-активности конкурентов ( на примере конкурентов "Газпром нефть")
"Бухгалтерский учёт и аудит расчётов с подотчётними лицами в организации на примере ООО "ЛОЦ 10""
«Психологическое сопровождение персонала в организации на примере ООО «Крокус»
Cовершенствование деловой оценки персонала в организации (на примере ООО "Даймонд кейтеринг развитие")
IPO - инструмент финансирования деятельности организации. На примере ПАО «Нефтяная компания «Лукойл»
PR как средство продвижения организации (на примере ПАО "Тамбовский завод "Комсомолец им. Н.С. Артемова")
PR-коммуникации в сфере общественного питания (на примере кафе-кондитерской «Cream Cheese»)
SMM как средство повышения эффективности работы учреждений социокультурной сферы (на примере Малого театра)