Commit 62ff66e4c33ca74113533ee6a1b6642ce5921206

Authored by Administrator
1 parent 7882b398

change request to massage

src/app/frontend/controllers/EventsController.php
@@ -76,6 +76,11 @@ class EventsController extends \Phalcon\Mvc\Controller @@ -76,6 +76,11 @@ class EventsController extends \Phalcon\Mvc\Controller
76 } 76 }
77 } 77 }
78 78
  79 + /**
  80 + * @param $data
  81 + * @param $template
  82 + * @throws \Exception
  83 + */
79 private function sendDelivery($data, $template){ 84 private function sendDelivery($data, $template){
80 if($this->post['email']){ 85 if($this->post['email']){
81 86
@@ -94,6 +99,8 @@ class EventsController extends \Phalcon\Mvc\Controller @@ -94,6 +99,8 @@ class EventsController extends \Phalcon\Mvc\Controller
94 99
95 100
96 $this->event_info->save(); 101 $this->event_info->save();
  102 + $this->addLetersList($this->post['project_id']);
  103 +
97 } else { 104 } else {
98 105
99 $this->event_info->event_id = $data->id; 106 $this->event_info->event_id = $data->id;
@@ -271,12 +278,54 @@ class EventsController extends \Phalcon\Mvc\Controller @@ -271,12 +278,54 @@ class EventsController extends \Phalcon\Mvc\Controller
271 278
272 } 279 }
273 280
274 - private function getEventDate($time){  
275 - $now = date("Y-m-d H:i:s");  
276 - $EmailDate = new \DateTime($now); 281 + private function getEventDate($first_delivery,$time){
  282 + $now = date("Y-m-d");
  283 + $EmailDate = new \DateTime($first_delivery);
277 $EmailDate->modify($time); 284 $EmailDate->modify($time);
278 - return $EmailDate->format('Y-m-d H:i:s'); 285 + return $EmailDate->format('Y-m-d');
  286 + }
  287 +
  288 +
  289 + function getNextDate($day)
  290 + {
  291 + $ret = false;
  292 + for ($i=1; $i<=7; $i++)
  293 + {
  294 + if (date('w',strtotime('+'.$i.' day'))==$day)
  295 + {
  296 + $ret = date('Y-m-d',strtotime('+'.$i.' day'));
  297 + break;
  298 + }
  299 + }
  300 + return $ret;
279 } 301 }
  302 +
  303 + private function addLetersList($project_id){
  304 + $data = \seriesOfLetters::find("project_id ={$project_id} ");
  305 +
  306 + foreach($data as $row){
  307 +
  308 + $letters = explode(',',$row->letters);
  309 +
  310 +
  311 + $days = count($letters);
  312 + for($i=0; $i<$days; $i++){
  313 + $now = date('N');
  314 + $row->first_delivery = $this->getNextDate($row->first_delivery);
  315 + $date = $this->getEventDate($row->first_delivery, "+". ($i)*$row->period_val ." days");
  316 + $event = new \eventInfo();
  317 + $event->customer_id = $this->customers_model->id;
  318 + $event->event_id = $letters[$i];
  319 + $event->next_delivery = $date;
  320 + $event->project_id = $project_id;
  321 + $event->event_trigger = 'series_of_letter';
  322 + $event->save();
  323 + }
  324 +
  325 + }
  326 + }
  327 +
  328 +
280 private function subscribeNewCustomer(){ 329 private function subscribeNewCustomer(){
281 $user['email'] = $this->post['email']; 330 $user['email'] = $this->post['email'];
282 $user['name'] = isset($this->post['name']) ? $this->post['name']:''; 331 $user['name'] = isset($this->post['name']) ? $this->post['name']:'';
@@ -285,26 +334,9 @@ class EventsController extends \Phalcon\Mvc\Controller @@ -285,26 +334,9 @@ class EventsController extends \Phalcon\Mvc\Controller
285 if($customer instanceof \customersEmailList){ 334 if($customer instanceof \customersEmailList){
286 335
287 } else { 336 } else {
288 - $data = \seriesOfLetters::find("project_id ={$user['project_id']} ");  
289 $this->customers_model->save($user); 337 $this->customers_model->save($user);
290 - foreach($data as $row){ 338 + $this->addLetersList($this->post['project_id']);
291 339
292 - $letters = explode(',',$row->letters);  
293 -  
294 -  
295 - $days = count($letters);  
296 - for($i=0; $i<$days; $i++){  
297 - $date = $this->getEventDate("+". ($i+1)*$row->period_val ." days");  
298 - $event = new \eventInfo();  
299 - $event->customer_id = $this->customers_model->id;  
300 - $event->event_id = $letters[$i];  
301 - $event->next_delivery = $date;  
302 - $event->project_id = $user['project_id'];  
303 - $event->event_trigger = 'series_of_letter';  
304 - $event->save();  
305 - }  
306 -  
307 - }  
308 340
309 } 341 }
310 342
src/app/frontend/controllers/SeriesOfLettersController.php
@@ -20,14 +20,17 @@ class SeriesOfLettersController extends \Phalcon\Mvc\Controller @@ -20,14 +20,17 @@ class SeriesOfLettersController extends \Phalcon\Mvc\Controller
20 ]); 20 ]);
21 } 21 }
22 22
  23 +
23 public function addAction(){ 24 public function addAction(){
24 if( $this->request->isPost() ) 25 if( $this->request->isPost() )
25 { 26 {
  27 +
26 $data['project_id'] = $this->session->get('project-id'); 28 $data['project_id'] = $this->session->get('project-id');
27 $data['name'] = $this->request->getPost('name', 'string', NULL ); 29 $data['name'] = $this->request->getPost('name', 'string', NULL );
28 $data['status'] = $this->request->getPost('status')?$this->request->getPost('status'):0 ; 30 $data['status'] = $this->request->getPost('status')?$this->request->getPost('status'):0 ;
29 $data['event'] = $this->request->getPost('event' ); 31 $data['event'] = $this->request->getPost('event' );
30 $data['period_val'] = $this->request->getPost('period_val' ); 32 $data['period_val'] = $this->request->getPost('period_val' );
  33 + $data['first_delivery'] = $this->request->getPost('first_delivery' );
31 $data['letters'] = implode(',',$data['event']); 34 $data['letters'] = implode(',',$data['event']);
32 35
33 $model = new \seriesOfLetters(); 36 $model = new \seriesOfLetters();
@@ -46,7 +49,8 @@ class SeriesOfLettersController extends \Phalcon\Mvc\Controller @@ -46,7 +49,8 @@ class SeriesOfLettersController extends \Phalcon\Mvc\Controller
46 } 49 }
47 $this->view->pick( 'series_of_letters/addEdit' ); 50 $this->view->pick( 'series_of_letters/addEdit' );
48 $this->view->setVars([ 51 $this->view->setVars([
49 - 52 + 'page' => new \seriesOfLetters(),
  53 + 'events' => []
50 ]); 54 ]);
51 } 55 }
52 56
@@ -60,12 +64,40 @@ class SeriesOfLettersController extends \Phalcon\Mvc\Controller @@ -60,12 +64,40 @@ class SeriesOfLettersController extends \Phalcon\Mvc\Controller
60 } 64 }
61 65
62 public function updateAction($id){ 66 public function updateAction($id){
63 -//  
64 -// $data = \seriesOfLetters::findFirst("id=$id AND project_id ={$this->session->get('project-id')} ");  
65 -// $this->view->pick( 'series_of_letters/addEdit' );  
66 -// $this->view->setVars([  
67 -// 'page' => $data  
68 -// ]); 67 + $model = \seriesOfLetters::findFirst("id=$id AND project_id ={$this->session->get('project-id')} ");
  68 + if( $this->request->isPost() )
  69 + {
  70 +
  71 +
  72 + $data['project_id'] = $this->session->get('project-id');
  73 + $data['name'] = $this->request->getPost('name', 'string', NULL );
  74 + $data['status'] = $this->request->getPost('status')?$this->request->getPost('status'):0 ;
  75 + $data['event'] = $this->request->getPost('event' );
  76 + $data['period_val'] = $this->request->getPost('period_val' );
  77 + $data['first_delivery'] = $this->request->getPost('first_delivery' );
  78 + $data['letters'] = implode(',',$data['event']);
  79 +
  80 + if( !empty( $data['name'] ))
  81 + {
  82 + if( $model->save( $data ) )
  83 + {
  84 + $this->flash->success( 'Сохранение прошло успешно' );
  85 + return $this->response->redirect('series_of_letters/index');
  86 + }
  87 + else
  88 + {
  89 + $this->flash->error( 'Произошла ошибка во время добавления.' );
  90 + }
  91 + }
  92 + }
  93 +
  94 +
  95 + $events = \eventEmail::find("id IN ('".implode("','", explode(',',$model->letters))."') ");
  96 + $this->view->pick( 'series_of_letters/addEdit' );
  97 + $this->view->setVars([
  98 + 'page' => $model,
  99 + 'events' => $events
  100 + ]);
69 } 101 }
70 102
71 public function getTemplateAction() 103 public function getTemplateAction()
src/app/frontend/views/series_of_letters/addEdit.php
@@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
7 7
8 8
9 <div class="input-group"> 9 <div class="input-group">
10 - <input type="checkbox" id="status" name="status" class="unique" value="<?= (isset( $page->status ) && !empty( $page->status ) ? $page->status : '') ?>"> 10 + <input type="checkbox" id="status" value="1" name="status" <?= ((isset( $page->status ) && !empty( $page->status )) ? 'checked' : '') ?>>
11 <label for="status">Статус рассылки</label> 11 <label for="status">Статус рассылки</label>
12 </div> 12 </div>
13 13
@@ -16,8 +16,23 @@ @@ -16,8 +16,23 @@
16 <div class="input-group"> 16 <div class="input-group">
17 <span class="input-group-addon title-block-sizing">Название рассылки</span> 17 <span class="input-group-addon title-block-sizing">Название рассылки</span>
18 <input type="text" name="name" class="form-control" value='<?= (isset( $page->name ) && !empty( $page->name ) ? $page->name : '') ?>'> 18 <input type="text" name="name" class="form-control" value='<?= (isset( $page->name ) && !empty( $page->name ) ? $page->name : '') ?>'>
  19 +
19 </div> 20 </div>
20 21
  22 +
  23 + <div class="input-group">
  24 + <span class="input-group-addon title-block-sizing">День первого письма</span>
  25 + <select class="form-control" name="first_delivery">
  26 +
  27 + <?php foreach($page->getDays() as $day):?>
  28 +
  29 + <option <?= !empty( $page->first_delivery )&& $page->isActive($page->first_delivery,$day['val']) ? "selected" :"" ?> value="<?= $day['val'] ?>"><?= $day['name'] ?></option>
  30 + <?php endforeach?>
  31 + </select>
  32 + </div>
  33 +
  34 +
  35 +
21 <div class="input-group"> 36 <div class="input-group">
22 <span class="input-group-addon title-block-sizing">Период</span> 37 <span class="input-group-addon title-block-sizing">Период</span>
23 <input type="text" name="period_val" class="form-control" value='<?= (isset( $page->period_val ) && !empty( $page->period_val ) ? $page->period_val : '') ?>'> 38 <input type="text" name="period_val" class="form-control" value='<?= (isset( $page->period_val ) && !empty( $page->period_val ) ? $page->period_val : '') ?>'>
@@ -25,6 +40,10 @@ @@ -25,6 +40,10 @@
25 40
26 41
27 <table id="templates-list" class="table table-hover"> 42 <table id="templates-list" class="table table-hover">
  43 + <?php foreach($events as $event):?>
  44 + <tr><td id='name'><?= $event->name ?></td><td><p class = 'btn btn-primary delete-row'>Убрать из списка</p>
  45 + <input type='hidden' value='<?= $event->id ?>' name='event[]'></td></tr>
  46 + <?php endforeach;?>
28 </table> 47 </table>
29 <div class="input-group"> 48 <div class="input-group">
30 <span class="input-group-addon title-block-sizing">Введите название письма</span> 49 <span class="input-group-addon title-block-sizing">Введите название письма</span>
@@ -92,4 +111,40 @@ @@ -92,4 +111,40 @@
92 row.remove(); 111 row.remove();
93 }); 112 });
94 }); 113 });
  114 +</script>
  115 +<script>
  116 + $(function() {
  117 + $.datepicker.regional['ru'] = {
  118 + closeText: 'Закрыть',
  119 + prevText: '&#x3c;Пред',
  120 + nextText: 'След&#x3e;',
  121 + currentText: 'Сегодня',
  122 + monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь',
  123 + 'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
  124 + monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн',
  125 + 'Июл','Авг','Сен','Окт','Ноя','Дек'],
  126 + dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'],
  127 + dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'],
  128 + dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'],
  129 + dateFormat: 'dd.mm.yy',
  130 + firstDay: 1,
  131 + isRTL: false
  132 + };
  133 + $.datepicker.setDefaults($.datepicker.regional['ru']);
  134 +
  135 + $( "#datepicker" ).datepicker({
  136 + dateFormat: "dd-mm-yy"
  137 + });
  138 +
  139 +
  140 + $('.active_field_select').each(function(){
  141 + if(this.checked){
  142 + $(this).parent('li').addClass('active');
  143 + }else {
  144 + $(this).parent('li').addClass('non_active');
  145 + }
  146 + });
  147 +
  148 + });
  149 +
95 </script> 150 </script>
96 \ No newline at end of file 151 \ No newline at end of file
src/app/tasks/EventMailTask.php
@@ -40,27 +40,42 @@ class EventMailTask extends \Phalcon\CLI\Task @@ -40,27 +40,42 @@ class EventMailTask extends \Phalcon\CLI\Task
40 40
41 foreach($projects as $project){ 41 foreach($projects as $project){
42 42
43 - $events = $this->eventByTrigger($project,'series_of_letter'); 43 +
  44 + $events = \eventInfo::getEventsByTrigger($this->modelsManager, $project->id, 'series_of_letter');
44 45
45 foreach($events as $event){ 46 foreach($events as $event){
  47 + if($event instanceof \eventInfo){
46 48
47 - if(!$event->isNew() ){  
48 - if(!$event->isRecurring()){  
49 - continue; 49 + $customers = (new customersEmailList())->findFirst("id={$event->customer_id}");
  50 +
  51 + if($customers instanceof customersEmailList){
  52 +
  53 + $eventEmail = ( new \eventEmail())->findFirst("id={$event->event_id}");
  54 + if($eventEmail instanceof eventEmail){
  55 + $eventEmail = $eventEmail->toArray();
  56 + print_r($eventEmail);
  57 + }else {
  58 + continue;
  59 + }
  60 + $template = \emailTemplates::findFirst("event_id = {$event->event_id} AND project_id = {$project->id}")->toArray();
  61 +
  62 + $this->post['name']=$customers->name;
  63 + $this->post['email']=$customers->email;
  64 + $this->post['phone']=$customers->phone;
  65 + $this->post['address']=$customers->address;
  66 +
  67 + $this->sendMailData($template,$customers->toArray(),$eventEmail,$project);
  68 +
  69 + $event->last_delivery = date("Y-m-d H:i:s");
  70 + $event->delete();
50 } 71 }
51 - }  
52 - print_r($event->toArray());  
53 72
54 - $customers = $project->findUsersByBirthday();  
55 - foreach($customers as $customer){  
56 - $this->post['name']=$customer->name;  
57 - $this->post['email']=$customer->email;  
58 - $this->post['phone']=$customer->phone;  
59 - $this->post['address']=$customer->address;  
60 - $this->sendMail($customer->toArray(),$project,$event,$event->eventEmail->toArray());  
61 - }  
62 73
  74 +
  75 +
  76 + }
63 } 77 }
  78 +
64 } 79 }
65 } 80 }
66 81
@@ -116,13 +131,13 @@ class EventMailTask extends \Phalcon\CLI\Task @@ -116,13 +131,13 @@ class EventMailTask extends \Phalcon\CLI\Task
116 } 131 }
117 } 132 }
118 133
119 - $users = $model->getSpyUsers($project, $this->modelsManager); 134 + $users = $model->getSpyUsers( $this->modelsManager, $project);
120 135
121 foreach( $users as $user){ 136 foreach( $users as $user){
122 $event_data = $model->spyTimeAfter($project, $user['id'])->toArray(); 137 $event_data = $model->spyTimeAfter($project, $user['id'])->toArray();
123 $customers = $customers_model->findFirst("id={$user['id']}"); 138 $customers = $customers_model->findFirst("id={$user['id']}");
124 139
125 - if($customers->checkEventForUser($event->id, $project->id)){ 140 + if($customers instanceof customersEmailList && $customers->checkEventForUser($event->id, $project->id)){
126 $sum = 0; 141 $sum = 0;
127 foreach($event_data as $item_one){ 142 foreach($event_data as $item_one){
128 $sum += (integer)$item_one['price']*$item_one['quantity']; 143 $sum += (integer)$item_one['price']*$item_one['quantity'];
@@ -146,7 +161,12 @@ class EventMailTask extends \Phalcon\CLI\Task @@ -146,7 +161,12 @@ class EventMailTask extends \Phalcon\CLI\Task
146 } 161 }
147 } 162 }
148 163
149 - 164 + /**
  165 + *TODO: $this->post array with dynamic data for static letters, need to change in some variable
  166 + *
  167 + *
  168 + *
  169 + **/
150 private function prepareEventData($item_data, $template){ 170 private function prepareEventData($item_data, $template){
151 171
152 if($template['text_type']=='static' ){ 172 if($template['text_type']=='static' ){
@@ -162,8 +182,9 @@ class EventMailTask extends \Phalcon\CLI\Task @@ -162,8 +182,9 @@ class EventMailTask extends \Phalcon\CLI\Task
162 182
163 } else { 183 } else {
164 184
165 - $template['text'] = $this->MyMailer->OfflineEvent->itemDynamicSet( $template, $item_data );  
166 - 185 + if( $item_data ) {
  186 + $template['text'] = $this->MyMailer->OfflineEvent->itemDynamicSet($template, $item_data);
  187 + }
167 $template['text'] = $this->MyMailer->OnlineEvent->dataSet( $template['text'], $this->post ); 188 $template['text'] = $this->MyMailer->OnlineEvent->dataSet( $template['text'], $this->post );
168 189
169 } 190 }
@@ -195,16 +216,6 @@ class EventMailTask extends \Phalcon\CLI\Task @@ -195,16 +216,6 @@ class EventMailTask extends \Phalcon\CLI\Task
195 216
196 217
197 218
198 -  
199 - public function dateEvent(){  
200 - $date = date('d.m.y');  
201 - }  
202 -  
203 - public function fieldEqualEvent(){  
204 -  
205 - }  
206 -  
207 -  
208 private function getEventInfo($event, $customers,$project){ 219 private function getEventInfo($event, $customers,$project){
209 $info = \eventInfo::findFirst("event_id = {$event->id} AND customer_id = {$customers['id']}"); 220 $info = \eventInfo::findFirst("event_id = {$event->id} AND customer_id = {$customers['id']}");
210 221
@@ -222,6 +233,14 @@ class EventMailTask extends \Phalcon\CLI\Task @@ -222,6 +233,14 @@ class EventMailTask extends \Phalcon\CLI\Task
222 } 233 }
223 234
224 235
  236 + /**
  237 + * send Email
  238 + * @params array $customers
  239 + * @params object $project
  240 + * @params object $offline_data_model
  241 + * @params array $event
  242 + * @params array $event_data
  243 + **/
225 public function sendMail($customers,$project,$offline_data_model, $event, $event_data = [] ){ 244 public function sendMail($customers,$project,$offline_data_model, $event, $event_data = [] ){
226 245
227 if($customers){ 246 if($customers){
@@ -232,33 +251,16 @@ class EventMailTask extends \Phalcon\CLI\Task @@ -232,33 +251,16 @@ class EventMailTask extends \Phalcon\CLI\Task
232 251
233 252
234 253
235 - /* if(isset($get['item_data']) && !empty($get['item_data'])){  
236 - $item_data = json_decode($get['item_data']);  
237 -  
238 - $template->text = $this->UTMParser->itemSet( $template->toArray(), $item_data );  
239 -  
240 - }*/  
241 -  
242 - $template['text'] = $this->prepareEventData($event_data, $template);  
243 -  
244 - $template['text'] = $this->UTMParser->parse($event, $template);  
245 -  
246 - $this->MyMailer->OfflineEvent->setFromName($project->name);  
247 -  
248 - $this->MyMailer->OfflineEvent->SendDelivery(new \delivery(),$template,$event,[$customers]);  
249 - 254 +// if(isset($get['item_data']) && !empty($get['item_data'])){
  255 +// $item_data = json_decode($get['item_data']);
  256 +//
  257 +// $template->text = $this->UTMParser->itemSet( $template->toArray(), $item_data );
  258 +//
  259 +// }
250 260
  261 + $this->sendMailData($template,$customers,$event,$project,$event_data);
251 262
252 $event_info->last_delivery = date("Y-m-d H:i:s"); 263 $event_info->last_delivery = date("Y-m-d H:i:s");
253 -  
254 -  
255 - if($offline_data_model->recurring_val){  
256 -  
257 - $date = new DateTime( date("Y-m-d H:i:s"));  
258 - $date->modify('+'.$offline_data_model->recurring_val.' '.$offline_data_model->recurring_val_type);  
259 - $event_info->next_delivery = $date->format("Y-m-d H:i:s");  
260 - }  
261 -  
262 $event_info->save(); 264 $event_info->save();
263 265
264 // $model = \delivery::find(); 266 // $model = \delivery::find();
@@ -273,9 +275,26 @@ class EventMailTask extends \Phalcon\CLI\Task @@ -273,9 +275,26 @@ class EventMailTask extends \Phalcon\CLI\Task
273 } 275 }
274 276
275 277
  278 + /**
  279 + * send Email
  280 + * @params array $customers
  281 + * @params object $project
  282 + * @params array $event
  283 + * @params array $event_data
  284 + * @params array $template
  285 + **/
276 286
  287 + private function sendMailData($template,$customers,$event,$project,$event_data=[])
  288 + {
  289 + $template['text'] = $this->prepareEventData($event_data, $template);
277 290
  291 + $template['text'] = $this->UTMParser->parse($event, $template);
278 292
  293 + $this->MyMailer->OfflineEvent->setFromName($project->name);
  294 +
  295 + $this->MyMailer->OfflineEvent->SendDelivery(new \delivery(),$template,$event,[$customers]);
  296 +
  297 + }
279 298
280 299
281 300
src/lib/models/eventInfo.php
@@ -14,5 +14,17 @@ class eventInfo extends \Phalcon\Mvc\Model @@ -14,5 +14,17 @@ class eventInfo extends \Phalcon\Mvc\Model
14 return "event_info"; 14 return "event_info";
15 } 15 }
16 16
  17 + static public function getEventsByTrigger($modelsManager, $project_id, $trigger){
  18 + $now = date("Y-m-d H:i:s");
17 19
  20 + $phql = "
  21 + SELECT * FROM eventInfo
  22 + WHERE project_id = $project_id
  23 + AND event_trigger='{$trigger}'
  24 + AND next_delivery <= '$now'
  25 + AND last_delivery IS NULL OR last_delivery = ''";
  26 +
  27 + return $modelsManager->executeQuery($phql);
  28 +
  29 + }
18 } 30 }
19 \ No newline at end of file 31 \ No newline at end of file
src/lib/models/seriesOfLetters.php
@@ -14,5 +14,26 @@ class seriesOfLetters extends \Phalcon\Mvc\Model @@ -14,5 +14,26 @@ class seriesOfLetters extends \Phalcon\Mvc\Model
14 return "series_of_letters"; 14 return "series_of_letters";
15 } 15 }
16 16
  17 + public function getDays(){
  18 + return [
  19 + ['val'=>'1','name'=>'понедельник'],
  20 + ['val'=>'2','name'=>'вторник'],
  21 + ['val'=>'3','name'=>'среда'],
  22 + ['val'=>'4','name'=>'четверг'],
  23 + ['val'=>'5','name'=>'пятница'],
  24 + ['val'=>'6','name'=>'суббота'],
  25 + ['val'=>'7','name'=>'воскресенье'],
  26 + ];
  27 + }
  28 + public function isActive($first_delivery,$day){
  29 + if($first_delivery==$day){
  30 + return true;
  31 + }else{
  32 + return false;
  33 + }
  34 +
  35 +
  36 + }
  37 +
17 38
18 } 39 }
19 \ No newline at end of file 40 \ No newline at end of file