<?php
/**
* 受注状況用コントローラー
*
*/
namespace App\Controller;
use App\Controller\BaseController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use App\Service\KintoneService;
use App\Service\CommonService;
use DateTime;
class OrderController extends BaseController
{
protected $kintoneService;
protected $commonService;
public function __construct(
KintoneService $kintoneService,
CommonService $commonService
)
{
parent::__construct();
$this->kintoneService = $kintoneService;
$this->commonService = $commonService;
}
/**
* @Route("/order", name="order")
*/
public function index(Request $request): Response
{
$data["date"] = $request->get('search_date', date("Y-m-d"));
$data["sort_key"] = $request->get('sort_key', "stock");
$item_codes = [];
$order_items_day = [];
$order_items_total = [];
$current_date = new DateTime($data["date"]);
$date_count = 11;
for($i=0; $i<$date_count; $i++){
$str_date = $current_date->format('Y-m-d');
$date_index[$str_date] = $i;
$last_date = $str_date;
$current_date->modify('+1 day');
}
/*
//指定日の受注データ取得
$query = sprintf('出荷予定日_0 = "%s"', $data["date"]);
$result = $this->kintoneService->requestGets('order', $query);
$records = $result["records"];
foreach($records as $record) {
$sub_table = $record["受注商品テーブル"]["value"];
foreach($sub_table as $row){
$item = $row["value"];
$item_code = $item["商品コード"]["value"];
$item_name = $item["受注商品名"]["value"];
if(preg_match("/^◆_|^運賃_|_200入|_600入| 200入| 600入/", $item_name)) continue;
if(!in_array($item_code, $item_codes)) {
$item_codes[] = $item_code;
for($i=0; $i<$date_count; $i++) $order_items_day[$item_code][$i] = 0;
$order_items_total[$item_code] = 0;
}
}
}
*/
$limit = 100;
$offset = 0;
while(1) {
//本日以降の出荷予定日のデータを取得
$query = sprintf('出荷予定日_0 >= "%s" and 出荷予定日_0 <= "%s" offset %d', $data["date"], $last_date, $offset);
$result = $this->kintoneService->requestGets('order', $query);
$records = $result["records"];
//日付ごとの出荷予定数を集計する
foreach($records as $record) {
$items = $record["受注商品テーブル"]["value"];
$shipping_date = $record["出荷予定日_0"]["value"];
$key = $date_index[ $shipping_date ];
foreach($items as $row){
$item = $row["value"];
$item_code = $item["商品コード"]["value"];
$item_name = $item["受注商品名"]["value"];
if(preg_match("/^◆_|^運賃_|_200入|_600入| 200入| 600入|手数料\_/", $item_name)) continue;
if(!in_array($item_code, $item_codes)) {
$item_codes[] = $item_code;
for($i=0; $i<$date_count; $i++) $order_items_day[$item_code][$i] = 0;
$order_items_total[$item_code] = 0;
}
$qty = $item["箱数"]["value"] ? $item["箱数"]["value"] : 0;
//日単位
if(!isset($order_items_day[$item_code])) {
for($i=0; $i<$date_count; $i++) $order_items_day[$item_code][$i] = 0;
}
$order_items_day[$item_code][$key]+= $qty;
if($key > 0) {
if(!isset($order_items_total[$item_code])) $order_items_total[$item_code] = 0;
$order_items_total[$item_code]+= $qty;
}
}
}
$offset += $limit;
if($result["totalCount"] < $offset) {
$totalCount = $result["totalCount"];
break;
}
if($offset >= 10000 ) break;
}
//在庫マスタからデータ取得
$query = sprintf('商品コード in (%s) and 手作業 not in ("レ") order by レコード番号', '"' . join('","', $item_codes) . '"');
$result = $this->kintoneService->requestGets('stock', $query);
$data["item"] = [];
foreach($result["records"] as $item) {
$category_code = $item["商品コード_大"]["value"];
$item_name = $item["商品名"]["value"];
$item_code = $item["商品コード"]["value"];
$limit = $item["最低在庫数"]["value"];
$stock = $item["在庫数"]["value"];
$unit_name = $item["最低在庫数用単位"]["value"];
$film = $item["フィルムの種類"]["value"];
$film_addr = $item["フイルム住所・棚番"]["value"];
$order_item = $order_items_day[$item_code];
$later = $order_items_total[$item_code];
$limit = $limit ? $limit : 0;
$stock = $stock ? $stock : 0;
$data["item"][$item_code] = [
"category_code" => $category_code,
"name" => $item_name,
"film" => $film,
"film_addr" => $film_addr,
"limit" => $limit,
"stock" => $stock,
"unit_name" => $unit_name,
"day0" => $order_item[0],
"day1" => $order_item[1],
"day2" => $order_item[2],
"day3" => $order_item[3],
"day4" => $order_item[4],
"day5" => $order_item[5],
"day6" => $order_item[6],
"day7" => $order_item[7],
"day8" => $order_item[8],
"day9" => $order_item[9],
"day10" => $order_item[10],
'later' => $later,
"day0_diff" => $this->checkStockDiff($limit, $stock, $order_item, 0),
'day1_diff' => $this->checkStockDiff($limit, $stock, $order_item, 1),
'day2_diff' => $this->checkStockDiff($limit, $stock, $order_item, 2),
'day3_diff' => $this->checkStockDiff($limit, $stock, $order_item, 3),
'day4_diff' => $this->checkStockDiff($limit, $stock, $order_item, 4),
'day5_diff' => $this->checkStockDiff($limit, $stock, $order_item, 5),
'day6_diff' => $this->checkStockDiff($limit, $stock, $order_item, 6),
'day7_diff' => $this->checkStockDiff($limit, $stock, $order_item, 7),
'day8_diff' => $this->checkStockDiff($limit, $stock, $order_item, 8),
'day9_diff' => $this->checkStockDiff($limit, $stock, $order_item, 9),
'day10_diff' => $this->checkStockDiff($limit, $stock, $order_item, 10),
'later_diff' => $this->checkStockDiff($limit, $stock, $order_item, 10),
];
}
// カテゴリを配列に持たす
$org_top_categories = $this->commonService->getTopCategoryList();
$top_categories = [];
foreach($this->getOriginalConfig("param", "categories") as $tmp_cate) {
foreach($org_top_categories as $key => $category){
if(preg_match("/$category/", $tmp_cate)) {
$top_categories[$tmp_cate][] = $key;
}
}
}
$search["keyword"] = $request->get('search_keyword');
$search["category_501"] = $request->get('search_category_501');
$search["category_key"] = $request->get('search_category_key');
return $this->render('order.html.twig', [
"data" => $data,
"search" => $search,
"top_categories" => $top_categories,
"json_top_categories" => json_encode($top_categories),
]);
}
static function checkStockDiff($limit, $stock, $day, $last) {
$sum = 0;
for($i=0; $i<=$last; $i++){
$sum+= $day[$i];
}
//$result = $limit - ($stock - $sum);
$result = $sum - $stock;
return $result > 0 ? $result : 0;
}
//フィールド一覧取得
/**
* @Route("/order/get_field", name="order_field")
*/
public function getOrderField() {
//$this->kintoneService->setKintoneConf('prod');
$result = $this->kintoneService->requestGetForm("order");
return $this->render('field.twig', ["title" => "受注管理", "fields" => $result["properties"]]);
}
}