Skip to content

Commit

Permalink
fintech-fab#17 Исправления после ревью (не завершено)
Browse files Browse the repository at this point in the history
  • Loading branch information
kmarenov committed Sep 20, 2014
1 parent b4df37f commit d0f39eb
Show file tree
Hide file tree
Showing 4 changed files with 222 additions and 226 deletions.
159 changes: 159 additions & 0 deletions app/FintechFab/Components/DinnerImportMenu.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
<?php

namespace FintechFab\Components;

use Excel;
use File;
use FintechFab\Models\DinnerMenuItem;

class DinnerImportMenu
{
/**
* Импортирует файл меню в базу данных
*
* @param $url string URL файла меню
*
* @return bool Если меню успешно импортировано - true, иначе - false
*/
public static function importMenu($url)
{
$file_name = self::downloadFile($url);

if (!$file_name) {
return false;
}

$reader = Excel::load($file_name);

if (!$reader) {
return false;
}

$reader->noHeading();
$reader->ignoreEmpty();

$arr_reader = $reader->toArray();

$dates = array();

foreach ($arr_reader as $sheet) {

//берем первую строку листа, чтобы извлечь дату
$date_row = $sheet[0];

//Если первая строка листа содержит дату, то проставляем ее блюдам с этого листа
//иначе - блюдам с листа ставим все даты, собранные с предыдущих листов
if (preg_match('/\d+\.\d+/', $date_row[1], $matches) > 0) {
//год берем текущий
$current_date = date("Y-m-d", strtotime($matches[0] . '.' . date("Y")));
//добавляем текущую дату в массив дат
$dates[] = $current_date;
//импортируем лист в БД
self::importSheet($sheet, $current_date);
} //блюда с последнего листа - доступны во все дни из файла
else {
//блюда с листа сохраняем со всеми датами, которые были на предыдущих листах
foreach ($dates as $date) {
//импортируем лист в БД
self::importSheet($sheet, $date);
}
}
}

return true;
}

/**
* Скачивает файл в директорию /storage/dinner
*
* @param $url string URL файла
*
* @return string|bool Если файл успешно загружен - имя файла, иначе - false
*/
private static function downloadFile($url)
{
$curl_session = curl_init($url);

if (!$curl_session) {
return false;
}

curl_setopt($curl_session, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_session, CURLOPT_BINARYTRANSFER, true);

$file_content = curl_exec($curl_session);

curl_close($curl_session);

if (!$file_content) {
return false;
}

$path = storage_path() . '/dinner';

if (!File::exists($path)) {
File::makeDirectory($path);
}

$file_name = $path . '/menu_' . date('Y-m-d-U') . '.xls';

$is_file_saved = file_put_contents($file_name, $file_content);

if (!$is_file_saved) {
return false;
}

return $file_name;

}

/**
* Импортирует лист из excel-файла в БД
*
* @param array $sheet Лист
* @param string $date Дата, когда блюдо будет доступно для заказа
*/
private static function importSheet($sheet, $date)
{
foreach ($sheet as $row) {
//формируем массив полей для модели
$fields = self::getMenuItemFields($row, $date);

if ($fields) {
//добавляем блюдо в БД
DinnerMenuItem::create($fields);
}
}
}

/**
* Формирует массив полей для передачи в модель DinnerMenuItem
*
* @param $row_items array Ячейки строки из excel-файла
* @param $date string Дата, когда блюдо будет доступно для заказа
*
* @return array|bool Массив полей, в случае неудачи - false
*/
private static function getMenuItemFields($row_items, $date)
{
//Если какая-то из первых двух ячееек в строке пуста - значит в этой строке не блюдо
if (empty($row_items[1]) || empty($row_items[2])) {
return false;
}

$fields = [
'title' => $row_items[1],
'price' => $row_items[2],
'date' => $date,
];

//Описания может не быть
if (!empty($row_items[3])) {
$fields['description'] = $row_items[3];
}

return $fields;
}


}
100 changes: 59 additions & 41 deletions app/FintechFab/Components/MailSender.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use Config;
use Exception;
use FintechFab\Models\Role;
use Illuminate\Mail\Message;
use Mail;

Expand All @@ -13,6 +14,20 @@ class MailSender
private $name;
private $subject;

public static function sendDinnerReminders()
{
$role = Role::whereRole('employee')->first();
$users = $role->users;

//Рассылаем напоминания всем найденным пользователям
foreach ($users as $user) {
Mail::send('emails.dinner', array(), function ($message) use ($user) {
$message->to($user->email, $user->first_name . ' ' . $user->last_name)
->subject('Вы можете заказать обед');
});
}
}

/**
*
* @param array $data
Expand All @@ -32,47 +47,6 @@ public function doVanguardOrder(array $data)
return (0 == $cntFails);
}

/**
*
* @param array $data
*
* @return bool
*/
public function doVanguardOrderAuthor(array $data)
{
$this->initTo($data);

Mail::send('emails.replyToNewImprover', $data, function (Message $message) {
$message->to($this->to, $this->name)->subject('Принята заявка');
});

$cntFails = count(Mail::failures());

return (0 == $cntFails);
}

/**
* @param array $data
* $data['baseMessage']
* $data['themeName']
* $data['comment']
*
* @return bool
*/
public function doNoticeTheme(array $data)
{
$this->initTo($data);

Mail::send('emails.noticeThemes', $data, function (Message $message) {
$message->to($this->to, $this->name)->subject($this->subject);
});

$cntFails = count(Mail::failures());

return (0 == $cntFails);
}


/**
*
* @param $data
Expand Down Expand Up @@ -115,4 +89,48 @@ private function getNameFromTo()

return $list[0];
}

/**
*
* @param array $data
*
* @return bool
*/
public function doVanguardOrderAuthor(array $data)
{
$this->initTo($data);

Mail::send('emails.replyToNewImprover', $data, function (Message $message) {
$message->to($this->to, $this->name)->subject('Принята заявка');
});

$cntFails = count(Mail::failures());

return (0 == $cntFails);
}

/*
* Отправка напоминаний о возможности заказать обед
*/

/**
* @param array $data
* $data['baseMessage']
* $data['themeName']
* $data['comment']
*
* @return bool
*/
public function doNoticeTheme(array $data)
{
$this->initTo($data);

Mail::send('emails.noticeThemes', $data, function (Message $message) {
$message->to($this->to, $this->name)->subject($this->subject);
});

$cntFails = count(Mail::failures());

return (0 == $cntFails);
}
}
13 changes: 4 additions & 9 deletions app/commands/DinnerImportMenu.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<?php

use App\Controllers\Dinner\DinnerController;
use FintechFab\Components\DinnerImportMenu as DinnerImportMenuComponent;
use FintechFab\Components\MailSender;
use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputArgument;

Expand Down Expand Up @@ -48,14 +49,8 @@ public function fire()
// но при этом оставить возможность задать файл вручную.
$url = $this->argument('url');

// ай-яй-яй. так нельзя
// не то чтобы это совсем мерзко :-)
// но контроллер должен быть контроллером и должен обслуживать только входящие запросы из браузера
// и не может вызываться откуда либо еще,
// т.к. это создает большую неразбериху и зависимость консольной команды от http-контроллера (ужас, ужас).
// см. в проекте есть директория Components - все туда. DinnerComponent например.
if (DinnerController::importMenu($url)) {
DinnerController::sendReminders();
if (DinnerImportMenuComponent::importMenu($url)) {
MailSender::sendDinnerReminders();
$this->info('Меню успешно импортировано');
} else {
$this->error('При импорте меню произошла ошибка');
Expand Down
Loading

0 comments on commit d0f39eb

Please sign in to comment.