vendor/kzl/kzl-framework-bundle/src/Common/KzlFrameworkStatic.php line 401

Open in your IDE?
  1. <?php
  2. namespace Kzl\FrameworkBundle\Common;
  3. use Kzl\FrameworkBundle\Repository\BaseRepository;
  4. use Kzl\JinjiKoukaBundle\Repository\EmployeeRepository;
  5. use Kzl\JinjiKoukaBundle\Repository\FileAttachmentRepository;
  6. use Symfony\Component\DependencyInjection\ContainerInterface;
  7. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  8. use Symfony\Component\Validator\Constraints as Assert;
  9. use Symfony\Component\Validator\Constraints\Collection;
  10. //use Kzl\JinjiKoukaBundle\Controller\BaseController;
  11. use Symfony\Component\Validator\ConstraintValidatorFactory;
  12. use Symfony\Component\Validator\DefaultTranslator;
  13. use Symfony\Component\Validator\Mapping\ClassMetadataFactory;
  14. use Symfony\Component\Validator\Mapping\Loader\StaticMethodLoader;
  15. use Symfony\Component\Validator\Validator;
  16. use Kzl\FrameworkBundle\Model\TenantAwareInterface;
  17. /**
  18.  * Description of JinjiKouka.
  19.  *
  20.  * @author mtisunaga@kuzilla.co.jp
  21.  */
  22. class KzlFrameworkStatic
  23. {
  24.     /**
  25.      * 役職、職群、所属のコード桁数.
  26.      */
  27.     const CODE_MAX 10;
  28.     const NAME_MAX 40;
  29.     const KANA_MAX 40;
  30.     const COMMENT_MAX 100;
  31.     /**
  32.      * 役職、職群、所属のコード.
  33.      */
  34.     const KEY_YAKUSYOKU 'yakusyoku';
  35.     const KEY_SYOKUGUN 'syokugun';
  36.     const KEY_DIVISION 'division';
  37.     const KEY_EMPLOYEE 'employee';
  38.     // /**
  39.     //  * @var ContainerInterface
  40.     //  */
  41.     /** @var ContainerInterface */
  42.     public static $container;
  43.     /**
  44.      * コンストラクタ
  45.      */
  46.     public function __construct(ContainerInterface $container)
  47.     {
  48.         $this->container $container;
  49.     }
  50.     /**
  51.      * 有効フラグ.
  52.      */
  53.     const IS_ACTIVE 1;
  54.     const NOT_ACTIOVE 0;
  55.     /**
  56.      * 有効かどうかの設定.
  57.      *
  58.      * @var type
  59.      */
  60.     public static $actives = [
  61.         self::NOT_ACTIOVE => '無効',
  62.         self::IS_ACTIVE => '有効',
  63.     ];
  64.     /** 2014/7/9 mitsunaga
  65.      * true/false.
  66.      */
  67.     const FLG_TRUE 1;
  68.     const FLG_FALSE 0;
  69.     // デフォルト表示順
  70.     const DEFAULT_POSITION 10;
  71.     /**
  72.      * ログイン方法設定.
  73.      */
  74.     const LOGIN_ONE_TIME 0;
  75.     const LOGIN_ID_PASS 1;
  76.     const LOGIN_BOTH 2;
  77.     /**
  78.      * 基本管理画面のコード設定
  79.      * 全変換の場合か、個別登録時の変換かの場合.
  80.      */
  81.     const PERSOON_CONBART 0;
  82.     const All_CONBART 1;
  83.     /**
  84.      * @var int 自己評価として扱う次数
  85.      */
  86.     const STAGE_SELF 0;
  87.     const STAGE_MIN_KOUKA 1;
  88.     /**
  89.      * 17/11/8 hagio 考課履歴閲覧設定.
  90.      */
  91.     const KOUKA_HISTORY_DISABLE 0;
  92.     const KOUKA_HISTORY_FINAL 1;
  93.     const KOUKA_HISTORY_SAME_STAGE 2;
  94.     const KOUKA_HISTORY_SELF 3;
  95.     /** 宣言目標表示対象: 同所属 */
  96.     const DECLARATION_AIM_TARGET_DIVISION 1;
  97.     const /* 宣言目標表示対象: 同役職 */
  98.           DECLARATION_AIM_TARGET_YAKUSYOKU 2;
  99.     const /* 宣言目標表示対象: 同職群 */
  100.           DECLARATION_AIM_TARGET_SYOKUGUN 3;
  101.     /**
  102.      * 宣言目標の表示対象 選択値.
  103.      *
  104.      * @var array
  105.      */
  106.     public static $declarationAimTargetList = [
  107.         self::DECLARATION_AIM_TARGET_DIVISION => '同所属の宣言目標',
  108.         self::DECLARATION_AIM_TARGET_YAKUSYOKU => '同役職の宣言目標',
  109.         self::DECLARATION_AIM_TARGET_SYOKUGUN => '同職群の宣言目標',
  110.     ];
  111.     /**
  112.      * CSVターゲット名称一覧.
  113.      *
  114.      * @var array
  115.      */
  116.     public static function getCsvTargetNameList()
  117.     {
  118.         return [
  119.             'department' => JinjiKoukaStatic::getTrans('基本情報.所属'),
  120.             'yakusyoku' => JinjiKoukaStatic::getTrans('基本情報.役職'),
  121.             'syokugun' => JinjiKoukaStatic::getTrans('基本情報.職群'),
  122.             'employee' => JinjiKoukaStatic::getTrans('基本情報.社員'),
  123.         ];
  124.     }
  125.     /**
  126.      * 自己評価かどうか.
  127.      *
  128.      * @param int $stage
  129.      *
  130.      * @return bool
  131.      */
  132.     public static function isSelfStage($stage)
  133.     {
  134.         return intval($stage) === JinjiKoukaStatic::STAGE_SELF;
  135.     }
  136.     /**
  137.      * 表示/非表示のキーと表示文字列の配列.
  138.      *
  139.      * @var array
  140.      */
  141.     public static $isActives = ['1' => '表示する''0' => '非表示'];
  142.     const ID_PATTERN '/^([_a-zA-Z0-9]|[\-\+\*\@\!\?\%\_\/\.])*$/';
  143.     // const ID_PATTERN_VALIDATE_MSG = '[%s]半角英数字と記号-+*@!?%_/.で入力してください。';
  144.     const ID_PATTERN_VALIDATE_MSG '半角英数字と記号-+*@!?%_/.で入力してください。';
  145.     /**
  146.      * 表示/非表示のキーと表示文字列の配列を取得する.
  147.      *
  148.      * @return type
  149.      */
  150.     public static function getIsActives()
  151.     {
  152.         return self::$isActives;
  153.     }
  154.     /**
  155.      * 表示/非表示の表示文字列を取得する.
  156.      *
  157.      * @param type $isActive
  158.      *
  159.      * @return string
  160.      */
  161.     public static function getIsActiveToString($isActive)
  162.     {
  163.         return isset(self::$isActives[$isActive]) ? self::$isActives[$isActive] : '';
  164.     }
  165.     /**
  166.      * 対象かどうかのフラグ文字列.
  167.      *
  168.      * @var type
  169.      */
  170.     protected static $targetFlgs = ['0' => '考課しない''1' => '考課する'];
  171.     // 14/5/23 sakamoto 項目名対応のため変更
  172. //    static protected $targetFlgs = array('0'=>'しない', '1'=>'する');
  173.     /**
  174.      * 対象かどうかのフラグと表示文字列の配列を取得する.
  175.      *
  176.      * @return type
  177.      */
  178.     public static function getTargetFlgs()
  179.     {
  180.         return self::$targetFlgs;
  181.     }
  182.     /**
  183.      * 対象かどうかのフラグのの表示文字列を取得する.
  184.      *
  185.      * @return string
  186.      */
  187.     public static function getTargetFlgToString($targetFlg)
  188.     {
  189.         return isset(self::$targetFlgs[$targetFlg]) ? self::$targetFlgs[$targetFlg] : '';
  190.     }
  191.     /**
  192.      * 有効かどうかのフラグ.
  193.      *
  194.      * @var type
  195.      */
  196.     protected static $useFlgs = [=> '無効'=> '有効'];
  197.     /**
  198.      * 有効かどうかのフラグを取得する.
  199.      *
  200.      * @return type
  201.      */
  202.     public static function getUseFlgs()
  203.     {
  204.         return self::$useFlgs;
  205.     }
  206.     /**
  207.      * 有効かどうかのフラグのを取得する.
  208.      *
  209.      * @return string
  210.      */
  211.     public static function getUseFlgToString($useFlg)
  212.     {
  213.         return isset(self::$useFlgs[$useFlg]) ? self::$useFlgs[$useFlg] : '';
  214.     }
  215.     /**
  216.      * 性別の種類の文字列.
  217.      *
  218.      * @var type
  219.      */
  220.     protected static $sex_kind = ['1' => '男''2' => '女''3' => 'その他'];
  221.     /**
  222.      * 性別を取得する.
  223.      *
  224.      * @return type
  225.      */
  226.     public static function getSexKind()
  227.     {
  228.         return self::$sex_kind;
  229.     }
  230.     /**
  231.      * 独身・既婚の文字列.
  232.      *
  233.      * @var type
  234.      */
  235.     protected static $married_kind = ['0' => '独身''1' => '既婚'];
  236.     /**
  237.      * 独身・既婚を取得する.
  238.      *
  239.      * @return type
  240.      */
  241.     public static function getMarriedKind()
  242.     {
  243.         return self::$married_kind;
  244.     }
  245.     /**
  246.      * ログイン方法名称.
  247.      */
  248.     const LOGIN_ONE_TIME_STR 'ワンタイムパスワード方式';
  249.     const LOGIN_ID_PASS_STR 'ID/パスワード方式';
  250.     const LOGIN_BOTH_STR 'ワンタイムパスワード方式とID/パスワード方式の併用';
  251.     /**
  252.      * ログイン方式の配列.
  253.      *
  254.      * @var type
  255.      */
  256.     public static $login_select = [
  257.         self::LOGIN_ONE_TIME => self::LOGIN_ONE_TIME_STR,
  258.         self::LOGIN_ID_PASS => self::LOGIN_ID_PASS_STR,
  259.     ];
  260.     /**
  261.      * ログ出力で使用
  262.      * 値が空の時に表示させる文字列
  263.      * 140710 sakamoto.
  264.      */
  265.     const LOG_EMPTT_STRING '(未設定)';
  266.     /**
  267.      * ログイン方式の配列を取得する.
  268.      *
  269.      * @return type
  270.      */
  271.     public static function getLoginSelect()
  272.     {
  273.         return self::$login_select;
  274.     }
  275.     /**
  276.      * ログイン設定方式を文字列で返す.
  277.      *
  278.      * @param type $loginSetting
  279.      */
  280.     public static function getLoginSettingToString($loginSetting)
  281.     {
  282.         return isset(self::$login_select[$loginSetting]) ? self::$login_select[$loginSetting] : '';
  283.     }
  284.     private static $_emp_dairi_users = [];
  285.     /**
  286.      * 2014/10/29 mitsunaga(代理入力方法変更に伴い移植)
  287.      * 社員TOPのログインユーザ取得メソッド.
  288.      *
  289.      * @return type
  290.      *
  291.      * @throws type
  292.      */
  293.     public static function getDairiEmployeeLoginUser($dairiId)
  294.     {
  295.         if ($dairiId) {
  296.             if (!self::inDairiPersonArray($dairiId)) {
  297.                 throw self::createNotFoundException('代理ログインに失敗しました。');
  298.             }
  299.             if (!isset(self::$_emp_dairi_users[$dairiId])) {
  300.                 self::$_emp_dairi_users[$dairiId] = self::getDoctrine()->getRepository('KzlJinjiKoukaBundle:Employee')->findOneBy(
  301.                     ['employeeCd' => $dairiId]
  302.                 );
  303.             }
  304.             return self::$_emp_dairi_users[$dairiId];
  305.         }
  306.         throw new \Exception('呼び出しエラー');
  307.     }
  308.     /**
  309.      * 値が、セッションの考課者配列(JSON形式)に格納されているかチェックする.
  310.      */
  311.     public static function inDairiPersonArray($dairiPersonId)
  312.     {
  313.         $jsonSession self::getSession()->get('dairi_person_id_json_array'null);
  314.         $array self::getArrayByJson($jsonSession);
  315.         //セッションが空だった場合、NULLで返す
  316.         if (!$array) {
  317.             return false;
  318.         }
  319.         //値がセッションに格納されているか確認
  320.         foreach ($array as $value) {
  321.             //一致すればTRUEで返す
  322.             if ($value == $dairiPersonId) {
  323.                 return true;
  324.             }
  325.         }
  326.         return false;
  327.     }
  328.     public static function generateUrl($route$parameters = [], $absolute false)
  329.     {
  330.         $tenantManager self::getTenantManager();
  331.         $tenantParameters = [
  332.             'subfolder' => $tenantManager->getSubfolder(),
  333.         ];
  334.         $parameters array_merge($parameters$tenantParameters);
  335.         return self::$container->get('router')->generate($route$parameters$absolute);
  336.     }
  337.     /**
  338.      * Returns the current request.
  339.      *
  340.      * @return Symfony\Component\HttpFoundation\Request|void The http request object
  341.      */
  342.     public static function getRequest()
  343.     {
  344.         if (self::$container->has('request_stack') && $request self::$container->get('request_stack')->getCurrentRequest()) {
  345.             return $request;
  346.         }
  347.     }
  348.     /**
  349.      * セッションオブジェクトを取得する。
  350.      *
  351.      * @return \Symfony\Component\HttpFoundation\Session\Session
  352.      */
  353.     public static function getSession()
  354.     {
  355.         if (self::$container->has('session') && $request self::$container->get('session')) {
  356.             return $request;
  357.         }
  358.     }
  359.     /**
  360.      * フラッシュメッセージを設定する.
  361.      *
  362.      * @param string $name
  363.      * @param string $value
  364.      */
  365.     public static function setFlash($name$value)
  366.     {
  367.         self::getSession()->getFlashBag()->set($name$value);
  368.     }
  369.     /**
  370.      * エラーのフラッシュメッセージを設定する.
  371.      *
  372.      * @param string $value
  373.      */
  374.     public function setFlashError($value)
  375.     {
  376.         self::setFlash('error'$value);
  377.     }
  378.     /**
  379.      * 通知のフラッシュメッセージを設定する。
  380.      *
  381.      * @param string $value
  382.      */
  383.     public function setFlashNotice($value)
  384.     {
  385.         self::setFlash('notice'$value);
  386.     }
  387.     // ----- Symfony\Bundle\FrameworkBundle\Controller\Controller を参考に実装-----
  388.     /**
  389.      * Shortcut to return the Doctrine Registry service.
  390.      *
  391.      * @return \Doctrine\Bundle\DoctrineBundle\Registry;
  392.      *
  393.      * @throws \LogicException If DoctrineBundle is not available
  394.      */
  395.     public static function getDoctrine()
  396.     {
  397.         if (!self::$container->has('doctrine')) {
  398.             throw new \LogicException('The DoctrineBundle is not installed in your application.');
  399.         }
  400.         return self::$container->get('doctrine');
  401.     }
  402.     // ----- $this->getDoctrine を参考に BaseController のtransメソッド実装-----
  403.     /**
  404.      * Translates the given message.
  405.      *
  406.      * @param string $id         The message id
  407.      * @param array  $parameters An array of parameters for the message
  408.      * @param string $domain     The domain for the message
  409.      * @param string $locale     The locale
  410.      *
  411.      * @return string The translated string
  412.      */
  413.     public static function getTrans($id, array $parameters = [], $domain 'messages'$locale null)
  414.     {
  415.         if (!self::$container->has('translator')) {
  416.             throw new \LogicException('The DoctrineBundle is not installed in your application.');
  417.         }
  418.         return self::$container->get('translator')->trans($id$parameters$domain$locale);
  419.     }
  420.     /**
  421.      * Translates the given message.
  422.      *
  423.      * @return string The translated string
  424.      */
  425. //    public static function getKzlTrans($id, array $parameters = array(), $domain = 'messages', $locale = null)
  426. //    {
  427. //        if (!self::$container->has('translator')) {
  428. //            throw new \LogicException('The DoctrineBundle is not installed in your application.');
  429. //        }
  430. //
  431. //        return self::$container->get('translator')->kzlTrans($id, $parameters, $domain, $locale);
  432. //    }
  433.     /**
  434.      * @return type
  435.      *
  436.      * @todo translationの呼び出しを修正
  437.      *
  438.      * @throws \LogicException
  439.      */
  440.     public static function getTranslator()
  441.     {
  442.         if (!self::$container->has('translator')) {
  443.             throw new \LogicException('The translatorBundle is not installed in your application.');
  444.         }
  445.         return self::$container->get('translator');
  446.     }
  447.     // -------------------------------------------------------------------------------
  448.     protected static $_kouka false;
  449.     /**
  450.      * 現在有効な考課を取得.
  451.      *
  452.      * @return false|\Kzl\JinjiKoukaBundle\Entity\Kouka|null
  453.      */
  454.     public static function getUnLockedKouka($isUser false)
  455.     {
  456.         return self::getKoukaManager()->getUnLockedKouka($isUser);
  457.     }
  458.     protected static $_aim false;
  459. //     /**
  460. //      * 現在有効な考課を取得
  461. //      * @return false|null|\Kzl\JinjiKoukaBundle\Entity\Kouka
  462. //      */
  463. //     public static function getUnLockedKouka(){
  464. //         if(false === self::$_kouka){
  465.     // //            self::$_kouka = self::getDoctrine()->getManager()->getRepository('KzlJinjiKoukaBundle:Kouka')->getUnLockedOne();
  466. //             self::$_kouka = self::getDoctrine()->getManager()->getRepository('KzlJinjiKoukaBundle:Kouka')->getLatestUnLockedOne();
  467. //         }
  468. //         return self::$_kouka;
  469. //     }
  470. //     protected static $_aim = false;
  471.     /**
  472.      * 15/6/3 (getUnlockedKouka より)
  473.      * 現在有効な考課を取得.
  474.      *
  475.      * @param bool $throwException
  476.      *
  477.      * @return \Kzl\JinjiKoukaBundle\Entity\Aim|null
  478.      */
  479.     public static function getUnLockedAim($throwException false)
  480.     {
  481.         if (false === self::$_aim) {
  482.             self::$_aim self::getDoctrine()->getManager()->getRepository('KzlJinjiKoukaBundle:Aim')->getUnLockedOne();
  483.         }
  484.         if ($throwException) {
  485.             if (self::$_aim) {
  486.                 return self::$_aim;
  487.             } else {
  488.                 throw new \Exception('unable to find aim entity unlocked.');
  489.             }
  490.         }
  491.         return self::$_aim self::$_aim null;
  492.     }
  493.     protected static $_koukaSelectList false;
  494.     /**
  495.      * セレクタに表示する現在有効な考課の選択肢を取得.
  496.      *
  497.      * @author hagio 2017/4/8
  498.      *
  499.      * @return array
  500.      */
  501.     public static function getUnLockedKoukaSelectList($isUser false)
  502.     {
  503.         if (self::$_koukaSelectList === false) {
  504.             self::$_koukaSelectList = [];
  505.             $koukaList self::getKoukaManager()->getUnLockedKoukaList($isUser);
  506.             foreach ($koukaList as $kouka) {
  507.                 $from date_format($kouka->getFrdate(), 'Y年m月d日');
  508.                 $to date_format($kouka->getTodate(), 'Y年m月d日');
  509.                 self::$_koukaSelectList[$kouka->getId()] = $kouka->getName().'('.$from.'~'.$to.')';
  510.             }
  511.         }
  512.         return self::$_koukaSelectList;
  513.         // if(false === self::$_koukaList) {
  514.         //     self::$_koukaList = self::getDoctrine()->getManager()->getRepository('KzlJinjiKoukaBundle:Kouka')->getKoukaSelectList();
  515.         // }
  516.         // return self::$_koukaList;
  517.     }
  518.     protected static $company_name false;
  519.     /**
  520.      * 現在有効な管理者の会社名を取得.
  521.      */
  522.     /*
  523.     public static function getCompanyName(){
  524.         if(false === self::$company_name){
  525.             self::$company_name = self::getDoctrine()->getManager()->getRepository('KzlJinjiKoukaBundle:SystemSetting')->getCompanyName();
  526.         }
  527.         return self::$company_name;
  528.     }
  529.     protected static $system_name = false;
  530.     /**
  531.      * 現在有効な管理者の会社名を取得
  532.      *
  533.     public static function getSystemName(){
  534.         if(false === self::$system_name){
  535.             self::$system_name = self::getDoctrine()->getManager()->getRepository('KzlJinjiKoukaBundle:SystemSetting')->getSystemName();
  536.         }
  537.         return self::$system_name;
  538.     }
  539.     protected static $company_logo = false;
  540.     /**
  541.      * 会社のロゴを取得
  542.      *
  543.     public static function getCompanyLogo(){
  544.         //if(false === self::$company_logo){
  545.             self::$company_logo = self::getDoctrine()->getManager()->getRepository('KzlJinjiKoukaBundle:FileAttachment')->getCompanyLogo();
  546.         //}
  547.         return self::$company_logo;
  548.     }
  549.     */
  550.     /**
  551.      * 添付ファイルのフォルダへのパスを取得.
  552.      *
  553.      * @return type
  554.      */
  555.     public static function getEmployeeTempFileDir()
  556.     {
  557.         return self::getKernel()->getRootDir().'/../web';
  558.     }
  559.     /**
  560.      * データフォルダのパスを取得.
  561.      *
  562.      * @return type
  563.      */
  564.     public static function getDataDir()
  565.     {
  566.         return self::getKernel()->getRootDir().'/../data';
  567.     }
  568.     public static function getKernel()
  569.     {
  570.         if (!self::$container->has('kernel')) {
  571.             throw new \LogicException('The DoctrineBundle is not installed in your application.');
  572.         }
  573.         return self::$container->get('kernel');
  574.     }
  575.     // /**
  576.     //  * @deprecated typo
  577.     //  */
  578.     // public static function getValidator()
  579.     // {
  580.     //     // if (!self::$container->has('validator')) {
  581.     //     //     throw new \LogicException('The DoctrineBundle is not installed in your application.');
  582.     //     // }
  583.     //     // return self::$container->get('validator');
  584.     // }
  585.     public static function getValidator()
  586.     {
  587.         if (!self::$container->has('validator')) {
  588.             throw new \LogicException('The DoctrineBundle is not installed in your application.');
  589.         }
  590.         return self::$container->get('validator');
  591.     }
  592.     /**
  593.      * 15/2/27 systemのcharsetを返す.
  594.      *
  595.      * @author mitsunaga
  596.      *
  597.      * @return string
  598.      */
  599.     public static function getCharset()
  600.     {
  601.         return self::getKernel()->getCharSet();
  602.     }
  603.     /**
  604.      * 空文字判定
  605.      *  true    :   値が存在しない、もしくは空文字のみ
  606.      *  false   :   値が存在する(空文字の可能性もなし).
  607.      *
  608.      * @param type $sting
  609.      *
  610.      * @return bool
  611.      */
  612.     public static function isNotValue($sting)
  613.     {
  614.         // kernel からsyfony2の文字コードを取得
  615. //        $charSet = self::getKernel()->getCharSet();
  616.         $charSet self::getCharSet();
  617.         // 全角スペースを半角スペースに変換してスペースを削除
  618.         $string trim(mb_convert_kana($sting's'$charSet));
  619.         // スペースを取り除いても値があるかどうかを返す
  620.         if ($string == '') {
  621.             return true;
  622.         }
  623.         return false;
  624.     }
  625.     /**
  626.      * ドキュメントルートを取得する.
  627.      *
  628.      * @return type
  629.      */
  630.     public static function getDocumentRoot()
  631.     {
  632.         //$pinfo = pathinfo(self::getRequest()->server->get('DOCUMENT_ROOT') . self::getRequest()->getBasePath());
  633.         //return $pinfo['dirname'].DIRECTORY_SEPARATOR.$pinfo['basename'];
  634.         return self::getRequest()->server->get('DOCUMENT_ROOT').self::getRequest()->getBasePath();
  635.         //return self::getRequest()->server->get('DOCUMENT_ROOT');
  636.     }
  637.     /*
  638.          * ファイルアップロード先ディレクトリをドキュメントルート付きで取得する
  639.          * @return string
  640.          */
  641.     public static function getUploadDir()
  642.     {
  643.         return self::getDocumentRoot().DIRECTORY_SEPARATOR.self::getUploadDirName();
  644.     }
  645.     /**
  646.      * ファイルアップロード先ディレクトリ名を取得する。
  647.      *
  648.      * @return string
  649.      */
  650.     public static function getUploadDirName()
  651.     {
  652.         //return self::getRequest()->server->get('DOCUMENT_ROOT').DIRECTORY_SEPARATOR.'uploads';
  653.         return 'uploads';
  654.     }
  655.     /** 14/04/30
  656.      * ログ出力用オブジェクトを取得する.
  657.      *
  658.      * @return \Kzl\LogBundle\Service\Logger
  659.      *
  660.      * @throws \LogicException
  661.      */
  662.     public static function getLogger()
  663.     {
  664.         if (!self::$container->has('kzl_log')) {
  665.             throw new \LogicException('The KzlLogBundle is not registered in your application.');
  666.         }
  667.         return self::$container->get('kzl_log');
  668.     }
  669.     // バリデーション関係 ↓ ============================================
  670.     private static $_validator;
  671.     /**
  672.      * バリデータを取得.
  673.      *
  674.      * @return \Kzl\JinjiKoukaBundle\Controller\Validator
  675.      */
  676.     private static function createValidator()
  677.     {
  678.         if (null === self::$_validator) {
  679.             self::$_validator = new Validator(
  680.                 new ClassMetadataFactory(new StaticMethodLoader()),
  681.                 new ConstraintValidatorFactory(),
  682.                 new DefaultTranslator()
  683.             );
  684.         }
  685.         return self::$_validator;
  686.     }
  687.     /**
  688.      * 最大文字バリデーション.
  689.      *
  690.      * @param int $maxLength
  691.      *
  692.      * @return Assert\Length
  693.      */
  694.     private static function getAssertMaxLength($maxLength)
  695.     {
  696.         return new Assert\Length([
  697.            'maxMessage' => '文字数が多すぎます。 '.$maxLength.'文字以内でなければなりません。',
  698.            'max' => $maxLength,
  699.        ]);
  700.     }
  701.     /**
  702.      * 必須バリデーション.
  703.      *
  704.      * @param string $targetName
  705.      *
  706.      * @return Assert\Length
  707.      */
  708.     private static function getAssertNotBlank($targetName 'この項目')
  709.     {
  710.         return new Assert\NotBlank([
  711.            'message' => $targetName.'は必須です。',
  712.        ]);
  713.     }
  714.     /**
  715.      * 必須バリデ.
  716.      *
  717.      * @param string $value
  718.      * @param string $targetName
  719.      * @param string $column
  720.      *
  721.      * @return array
  722.      */
  723.     public static function validNotBlank($value$targetName$column)
  724.     {
  725.         return self::validByConstraints($column$value, [
  726.             self::getAssertNotBlank($targetName),
  727.         ]);
  728.     }
  729.     /**
  730.      * メールアドレスバリデ.
  731.      *
  732.      * @param string $value
  733.      * @param string $column
  734.      *
  735.      * @return array
  736.      */
  737.     public static function validateMail($value$column 'mail')
  738.     {
  739.         return self::validByConstraints($column$value, [
  740.             new Assert\Email([
  741.                 'message' => '有効な'.JinjiKoukaStatic::getTrans('メールアドレス').'ではありません。',
  742.             ]),
  743.         ]);
  744.     }
  745.     /**
  746.      * コードバリデ.
  747.      *
  748.      * @param string $value
  749.      * @param string $column
  750.      *
  751.      * @return array
  752.      */
  753.     public static function validateCode($value$column 'code')
  754.     {
  755.         return self::validByConstraints($column$value, [
  756.             self::getAssertNotBlank('コード'),
  757.             self::getAssertMaxLength(self::CODE_MAX),
  758.         ]);
  759.     }
  760.     /**
  761.      * 名前バリデ.
  762.      *
  763.      * @param string $value
  764.      * @param string $column
  765.      *
  766.      * @return array
  767.      */
  768.     public static function validateName($value$column 'name')
  769.     {
  770.         return self::validByConstraints($column$value, [
  771.             self::getAssertNotBlank('名前'),
  772.             self::getAssertMaxLength(self::NAME_MAX),
  773.         ]);
  774.     }
  775.     /**
  776.      * カナバリデ.
  777.      *
  778.      * @param string $value
  779.      * @param string $column
  780.      *
  781.      * @return array
  782.      */
  783.     public static function validateKana($value$column 'kana')
  784.     {
  785.         //全角カナ、半角カナをひらがなに変換 2014/6/9 追加
  786.         $value mb_convert_kana($value'Hc''UTF-8');
  787.         return self::validByConstraints($column$value, [
  788.             new Assert\Regex([
  789.                 'pattern' => '/^([  \t\r\nぁ-んー])+$/u',
  790.                 'message' => 'ひらがなで入力して下さい。',
  791.             ]),
  792.             self::getAssertMaxLength(self::KANA_MAX),
  793.         ]);
  794.     }
  795.     /**
  796.      * バリデーション.
  797.      *
  798.      * @param string $target
  799.      * @param mixed  $value
  800.      * @param array  $constrains
  801.      *
  802.      * @return array
  803.      */
  804.     private static function validByConstraints($target$value$constrains)
  805.     {
  806.         $validator self::createValidator();
  807.         $errors $validator->validateValue(
  808.             [$target => $value], /*対象*/
  809.             new Collection([
  810.                 $target => $constrains,
  811.             ])   /*バリデーション設定*/
  812.         );
  813.         return $errors;
  814.     }
  815.     // バリデーション関係 ↑ ============================================
  816.     const CD_RANGE 10;
  817.     /**
  818.      * 値が空でなく、数字だったらTRUEを返す.
  819.      *
  820.      * @param string $cd
  821.      *
  822.      * @return bool
  823.      */
  824.     //  public static function validateCd($cd)
  825.     //  {
  826. //    // 項目マスタ対応時に修正すること
  827. //    return $cd != '' && is_numeric($cd) ;
  828.     ////    return $cd != '' && is_numeric($cd) && ( $cd < pow(10,self::CD_RANGE) ) ;
  829.     //  }
  830.     /**
  831.      *  コードが数値に変換できる場合はint型で数値にした値を返す.
  832.      *
  833.      * 14/11/07 sakamoto cd + masta(マスタ)を指定してシステム設定のコードを取得する
  834.      *
  835.      * @param type $cd
  836.      *
  837.      * @return type
  838.      */
  839.     //  public static function getNumCd($cd)
  840.     public static function getNumCd($mst$cd)
  841.     {
  842.         $cd ltrim($cd'0');
  843.         $cd ltrim($cd' ');
  844.         $cd self::getburyZero($mst$cd);
  845. //        if(is_numeric($cd)){
  846. //            return (int)$cd;
  847. //        }
  848.         return $cd;
  849.     }
  850.     public static function substrName($name)
  851.     {
  852.         return  self::substr($nameself::NAME_MAX);
  853.     }
  854.     public static function substrKana($kana)
  855.     {
  856.         return  self::substr($kanaself::KANA_MAX);
  857.     }
  858.     public static function substrComment($comment)
  859.     {
  860.         return  self::substr($commentself::COMMENT_MAX);
  861.     }
  862.     public static function substr($str$range)
  863.     {
  864. //        if($str==null) return '';
  865.         if ($str === null || $str === '') {
  866.             return '';
  867.         }
  868.         return mb_substr($str0$rangeJinjiKoukaStatic::getKernel()->getCharSet());
  869.     }
  870.     /**
  871.      * CSVで取得した項目と必要な項目の差を返す.
  872.      *
  873.      * @param type $requiredCount
  874.      *
  875.      * @return int $requiredCount -count($values)
  876.      */
  877. //    public static function compareRequiredCountAndInputCount($values,$requiredCount){
  878. //        return $requiredCount - count($values) ;
  879. //    }
  880.     public static function checkInputCount($values$object$requiredCount)
  881.     {
  882.         // objectから必要項目数を取得する
  883. //        $diff = self::compareRequiredCountAndInputCount($values, $requiredCount);
  884.         $diff count($values) - $requiredCount;
  885.         // CSVの取得項目数-必要項目数 =0 ならば何もしないでtrueを返す
  886.         if ($diff == 0) {
  887.             return true;
  888.         // CSVの必要項目数 < 取得項目数ならば項目数が多いwarningを追加 差を返す
  889.         } elseif ($diff 0) {
  890.             $object->addCsvWarningList(sprintf(\Kzl\JinjiKoukaBundle\Tools\myToolCsv::WARRNING_COUNT_TOOcount($values)));
  891.             return $diff;
  892.         // CSVの必要項目数 > 取得項目数なら 差を返す
  893.         } else {
  894. //            $object->addCsvWarningList(\Kzl\JinjiKoukaBundle\Tools\myToolCsv::WARRNING_COUNT_FEW);
  895.             return $diff;
  896.         }
  897.     }
  898. //    public static function getNoValueErrorMessage($value_name){
  899. //        return sprintf('[] %sがありません', $value_name);
  900. //    }
  901. //    }
  902. //
  903. //    /**
  904. //     * フォームを作成
  905. //     *
  906. //     * @param string|FormTypeInterface $type    The built type of the form
  907. //     * @param mixed                    $data    The initial data for the form
  908. //     * @param array                    $options Options for the form
  909. //     *
  910. //     * @return Form
  911. //     */
  912. //    public static function createForm($type, $data = null, array $options = array())
  913. //    {
  914. //        return self::$container->get('form.factory')->create($type, $data, $options);
  915. //    }
  916. //
  917.     // ---------- サービスの取得 --------------
  918.     /**
  919.      * システム管理用のサービスを取得する.
  920.      *
  921.      * @return \Kzl\JinjiKoukaBundle\Service\SystemManager
  922.      */
  923.     public static function getSystemManager()
  924.     {
  925.         return self::$container->get('kzl_system');
  926.     }
  927.     /**
  928.      *  レイアウトタイプサービスを取得する。
  929.      * キシヤ様MBOかどうかの判定用.
  930.      *
  931.      * @author kawaguchi@kuzilla.co.jp
  932.      *
  933.      * @return \Kzl\JinjiKoukaBundle\Service\LayoutType
  934.      */
  935.     public static function getLayoutType()
  936.     {
  937.         return self::$container->get('kzl_layout_type');
  938.     }
  939.     /**
  940.      * 考課取得用クラスを取得する.
  941.      *
  942.      * @author mitsunaga 2017/8/9
  943.      *
  944.      * @return \Kzl\JinjiKoukaUserBundle\Service\KoukaManager
  945.      */
  946.     protected static function getKoukaManager()
  947.     {
  948.         return self::$container->get('kzl_user_kouka');
  949.     }
  950.     /**
  951.      * jsonの値を配列に変換して返す.
  952.      *
  953.      * @param string $json
  954.      *
  955.      * @return array
  956.      */
  957.     public static function getArrayByJson($json)
  958.     {
  959.         if (null === $json || '' === $json) {
  960.             return [];
  961.         }
  962.         // 15/6/11 mtisuanga nullが帰るケースがあって不愉快なので修正
  963.         $array json_decode($jsontrue);
  964.         return is_array($array) ? $array : [];
  965. //        return json_decode($json, true);
  966.     }
  967.     /**
  968.      * 配列からjsonにエンコードする.
  969.      *
  970.      * @param mixed $array
  971.      *
  972.      * @return string
  973.      */
  974.     public static function getJsonByArray($array)
  975.     {
  976.         if (!$array || !is_array($array)) {
  977.             return '';
  978.         }
  979.         return json_encode($array);
  980.     }
  981.     /**
  982.      * 権限用のサービスを取得する.
  983.      *
  984.      * @return \Kzl\HanabusaBundle\Service\SystemManager
  985.      */
  986.     public static function getRoleManager()
  987.     {
  988.         if (!self::$container->has('kzl_role')) {
  989.             throw new \LogicException('The DoctrineBundle is not installed in your application.');
  990.         }
  991.         return self::$container->get('kzl_role');
  992.     }
  993.     /**
  994.      * 社員用のサービスを取得する.
  995.      *
  996.      * @author 2015/6/16 kawaguchi@kuzilla.co.jp
  997.      *
  998.      * @return \Kzl\JinjiKoukaBundle\Service\EmployeeManager
  999.      */
  1000.     public static function getEmployeeManager()
  1001.     {
  1002.         return self::$container->get('kzl_employee');
  1003.     }
  1004.     /**
  1005.      * 2017/10/24 役職取得用クラスを取得する.
  1006.      *
  1007.      * @author aoki
  1008.      *
  1009.      * @return \Kzl\JinjiKoukaUserBundle\Service\YakusyokuManager
  1010.      */
  1011.     public static function getYakusyokuManager()
  1012.     {
  1013.         return self::$container->get('kzl_yakusyoku');
  1014.     }
  1015.     /**
  1016.      * 2017/10/24 所属取得用クラスを取得する.
  1017.      *
  1018.      * @author aoki
  1019.      *
  1020.      * @return \Kzl\JinjiKoukaUserBundle\Service\DivisionManager
  1021.      */
  1022.     public static function getDivisionManager()
  1023.     {
  1024.         return self::$container->get('kzl_division');
  1025.     }
  1026.     /**
  1027.      * @return \Kzl\JinjiKoukaBundle\Service\AimOrganizationManager
  1028.      */
  1029.     public static function getAimOrganizationManager()
  1030.     {
  1031.         return self::$container->get('kzl_aim_organization');
  1032.     }
  1033.     /**
  1034.      * 基本情報履歴用のサービスを取得する.
  1035.      *
  1036.      * @author mitsunaga 15/11/2
  1037.      *
  1038.      * @return \Kzl\JinjiKoukaBundle\Service\HistoryBaseInfoManager
  1039.      */
  1040.     public static function getHistoryBaseInfoManager()
  1041.     {
  1042.         return self::$container->get('kzl_history_base_info');
  1043.     }
  1044.     /**
  1045.      * 期間の表示文字列を作成
  1046.      * 形式)
  1047.      * ・「~」でつなげた文字列で表示
  1048.      * ・年・月はFROM/TOで重複する場合表示なし
  1049.      * ・形式例
  1050.      * FROM:2014/5/21 TO:2015/6/21「2014年5月21日~2015年6月21日」
  1051.      * FROM:2014/5/21 TO:2014/6/21「2014年5月21日~6月21日」
  1052.      * FROM:2014/6/20 TO:2014/6/21「2014年6月20日~21日」.
  1053.      *
  1054.      * @param \DateTime $fromdate
  1055.      * @param \DateTime $todate
  1056.      */
  1057.     public static function getStrPeriod($fromdate$todate)
  1058.     {
  1059.         $pattern 'Y年n月j日';
  1060.         if (!$fromdate && !$todate) {
  1061.             return '期間未設定';
  1062.         }
  1063.         //開始日の文字列を取得
  1064.         $frdateToStr self::getDateToString($fromdate$pattern'未設定');
  1065.         if ($fromdate && $todate) {
  1066.             // 年が違う場合
  1067.             if ($fromdate->format('Y') != $todate->format('Y')) {
  1068.                 $pattern 'Y年n月j日';
  1069.             // 月が違う場合
  1070.             } elseif ($fromdate->format('m') != $todate->format('m')) {
  1071.                 $pattern 'n月j日';
  1072.             // 月が同じ場合
  1073.             } else {
  1074.                 $pattern 'j日';
  1075.             }
  1076.         }
  1077.         //終了日の文字列を取得
  1078.         $todateToStr self::getDateToString($todate$pattern'未設定');
  1079.         return $frdateToStr.'~'.$todateToStr;
  1080.     }
  1081.     /**
  1082.      * 日付をY月j年j日の形でformat.
  1083.      *
  1084.      * @param type   $date
  1085.      * @param string $format   フォーマット文字列
  1086.      * @param string $dummyStr 空の場合に返す文字列
  1087.      *
  1088.      * @return string
  1089.      */
  1090.     private static function getDateToString($date$format 'Y-m-d'$dummyStr '')
  1091.     {
  1092.         if (!$date) {
  1093.             return $dummyStr;
  1094.         } else {
  1095.             return $date->format($format);
  1096.         }
  1097.     }
  1098.     /**
  1099.      * Datetime型を指定した形式で変換する.
  1100.      *
  1101.      * @return string
  1102.      */
  1103.     /* 14/11/7 mitsunaga 置換済み
  1104.     public static function getStrDatetime($date, $pattern ='Y年n月j日'){
  1105.         if(!$date){
  1106. //            return '';
  1107.             return '未設定';
  1108.         }
  1109.         return $date->format($pattern);
  1110.     }*/
  1111.     /**
  1112.      * チェックする社員リストと、実施考課の自己評価フラグ.
  1113.      */
  1114.     //配列で渡ってきたIDを元に自己評価が設定されているかチェックする  2014/6/25 nishida
  1115.     /*
  1116.     public static function HikoukaSettingCheck($array_list,$kouka){
  1117.         $self_hyouka_flg = self::getDoctrine()->getManager()->getRepository('KzlJinjiKoukaBundle:SystemSetting')->getSelfHyoukaFlg();
  1118.         $self_kouka_flg_employee= array();
  1119.         //システム設定の自己評価フラグが1の時だけ処理を行う
  1120.         if( $kouka->getSelfKoukaFlg() == 1 && $self_hyouka_flg->getIntValue() == 1 ){
  1121.             //--------------------自己評価フラグが1の考課表に紐ずいている役職・職群を持つ社員の配列を取得する-------------------------
  1122. //            //自己評価フラグが1の考課表のIDを配列で取得
  1123.             $kouka_table = self::getDoctrine()->getManager()->getRepository('KzlJinjiKoukaBundle:KoukaTable')->findSelfKoukaTable($kouka->getId());
  1124.             if(isset($kouka_table)){
  1125.                     //自己評価フラグが1の考課表を持つ、役職職群オブジェクトを取得
  1126.                     $yakusyoku_syokugun_list = self::getDoctrine()->getManager()->getRepository('KzlJinjiKoukaBundle:YakusyokuSyokugun')->findByTableIds($kouka->getId(),$kouka_table);
  1127.             }
  1128.             if(isset($yakusyoku_syokugun_list)){
  1129.                     foreach($yakusyoku_syokugun_list as $ys){
  1130.                         //自己評価フラグが1の考課表を持つ、役職職群オブジェクトから社員の配列を取得
  1131.                         //$self_kouka_flg_employee[] = self::getDoctrine()->getManager()->getRepository('KzlJinjiKoukaBundle:Employee')->findByYakusyokuSyokugun($ys->getYakusyokuId(),$ys->getSyokugunId());
  1132.                         //var_dump(self::getDoctrine()->getManager()->getRepository('KzlJinjiKoukaBundle:Employee')->findByYakusyokuSyokugun($ys->getYakusyokuId(),$ys->getSyokugunId()));
  1133.                         $self_kouka_flg_employee = array_merge($self_kouka_flg_employee, self::getDoctrine()->getManager()->getRepository('KzlJinjiKoukaBundle:Employee')->findByYakusyokuSyokugun($ys->getYakusyokuId(),$ys->getSyokugunId()));
  1134.                     }
  1135.             }
  1136.             //------------------------------------------------------------------------------------------------------------------
  1137.             //一致するものだけを摘出
  1138.                 return array_intersect($array_list,$self_kouka_flg_employee);
  1139.             }else{
  1140.                 return $array = array();
  1141.             }
  1142.     }*/
  1143.     /**
  1144.      * 2014/7/2 mitsunaga メールが送信できるかどうかの判定.
  1145.      */
  1146.     public static function canSendMail(\Kzl\JinjiKoukaBundle\Entity\Employee $emp)
  1147.     {
  1148.         // 社員有+メールありなら送信可能
  1149. //        return (null != $emp && $emp->getMail());
  1150.         if (!$emp || !$emp->getMail()) {
  1151.             return false;
  1152.         }
  1153.         // システム設定「送信チェックを行う」 + メール送信チェック結果NG なら送信不可
  1154.         if (self::getSystemManager()->doMailCheck() && $emp->getMailResult() == \Kzl\JinjiKoukaBundle\Repository\EmployeeRepository::MAIL_RESULT_WAIT) {
  1155.             return false;
  1156.         }
  1157.         return true;
  1158.     }
  1159.     /**
  1160.      * 考課者かどうか.
  1161.      */
  1162.     public static function isKoukaPerson(\Kzl\JinjiKoukaBundle\Entity\Employee $emp\Kzl\JinjiKoukaBundle\Entity\KoukaEmployee $kEmp)
  1163.     {
  1164.         if (!$emp) {
  1165.             return false;
  1166.         }
  1167.         // 1)考課者かどうか(社員=考課者設定 and 考課用社員データ=考課者設定)= true
  1168.         return $emp->getKoukaFlg() && ($kEmp && $kEmp->getKoukaFlg());
  1169.     }
  1170.     /**
  1171.      * 自己評価対象の考課対象者かどうか.
  1172.      */
  1173.     public static function isSelfKoukaEmployee(\Kzl\JinjiKoukaBundle\Entity\Employee $emp\Kzl\JinjiKoukaBundle\Entity\KoukaEmployee $kEmp, array $tables null)
  1174.     {
  1175.         if (!$emp) {
  1176.             return false;
  1177.         }
  1178.         // 1)考課対象者かどうか(社員=考課対象者設定 and 考課用社員データ=考課対象者設定)= true
  1179.         if (!$emp->getHikoukaFlg() || !($kEmp && $kEmp->getHikoukaFlg())) {
  1180.             return false;
  1181.         }
  1182.         // 2)自己評価を行うかどうか
  1183.         // TODO:引数が渡されない場合は取得処理を行うように変更したい
  1184.         if (!self::doSelfKouka($kEmp$tables)) {
  1185.             return false;
  1186.         }
  1187.         return true;
  1188.     }
  1189.     /**
  1190.      *14/08/11 sakamoto
  1191.      * システム設定、考課  個人目標を「行う」かどうか.
  1192.      */
  1193.     public static function doKoukaAimToKouka($kouka null)
  1194.     {
  1195.         if (!$kouka) {
  1196.             $kouka self::getUnLockedKouka();
  1197.         }
  1198.         // 1)システム設定=自己評価「行う」か
  1199.         if (!self::getSystemManager()->doKoukaAim()) {
  1200.             return false;
  1201.         }
  1202.         // 2)考課=自己評価「行う」か
  1203.         // 2017/5/1 kawaguchi kouka が取得できない(1レコードもない場合は、システム設定で判定)
  1204.         if ($kouka) {
  1205.             return $kouka->getAimFlg();
  1206.         }
  1207.         // ここまでくればtrue(システム設定だけで判定となる)
  1208.         return true;
  1209.     }
  1210.     /**
  1211.      *14/07/07 sakamoto
  1212.      * システム設定、考課  共に自己評価「行う」かどうか.
  1213.      */
  1214.     public static function doSelfKoukaToKouka($kouka null)
  1215.     {
  1216.         if (!$kouka) {
  1217.             $kouka self::getUnLockedKouka();
  1218.         }
  1219.         // 1)システム設定=自己評価「行う」か
  1220.         if (!self::getSystemManager()->doSelfKouka()) {
  1221.             return false;
  1222.         }
  1223.         // 2)考課=自己評価「行う」か
  1224.         // 14/12/4 mitsunaga 考課実施中以外の場合
  1225. //        return $kouka->getSelfKoukaFlg();
  1226.         return $kouka && $kouka->getSelfKoukaFlg();
  1227.     }
  1228.     /**
  1229.      * 自己評価を行う考課対象者かどうか.
  1230.      *
  1231.      * @param array $tables 対象考課表(指定があれば)
  1232.      *
  1233.      * @return bool
  1234.      *
  1235.      * 14/07/07 sakamoto システム設定、考課の判定を切り出し
  1236.      */
  1237.     public static function doSelfKouka(\Kzl\JinjiKoukaBundle\Entity\KoukaEmployee $kEmp, array $tables null)
  1238.     {
  1239.         // システム設定、考課  供に自己評価「行う」か
  1240.         //  * 14/07/07 sakamoto システム設定、考課の判定を切り出し
  1241.         if (!self::doSelfKoukaToKouka($kEmp->getKouka())) {
  1242.             return false;
  1243.         }
  1244.         // 考課対象者の考課表設定を取得
  1245.         if ($tables && is_array($tables)) {
  1246.             $koukaTable $tables;
  1247.         } elseif ($kEmp->getKoukaTables() !== false) {
  1248.             // 2017/4/28 mitsunaga koukaEmployeeからの取得
  1249.             $koukaTable $kEmp->getKoukaTables();
  1250.         } else {
  1251.             $koukaTable self::getDoctrine()->getManager()->getRepository('KzlJinjiKoukaBundle:KoukaTable')->findByKoukaEmployee($kEmp);
  1252.             if (!$koukaTable) {
  1253.                 return false;
  1254.             }
  1255.         }
  1256.         $ret false;
  1257.         foreach ($koukaTable as $t) {
  1258.             //if($kEmp->getEmployeeId() == 4) var_dump($t);
  1259.             // 複数考課表でもいずれかが「自己評価を行う」になっていればtrue
  1260.             if ($t->getSelfKoukaFlg()) {
  1261.                 $ret true;
  1262.             }
  1263.         }
  1264.         return $ret;
  1265.     }
  1266.     /**
  1267.      * 自己評価を行う考課対象者かどうか(鈴鹿医療 実績用).
  1268.      *
  1269.      * @return bool
  1270.      */
  1271.     public static function doSelfSeeds()
  1272.     {
  1273.         // システム設定 自己評価「行う」か
  1274.         return self::getSystemManager()->doSelfKouka();
  1275.     }
  1276.     /**
  1277.      * 個人目標を行う.
  1278.      *
  1279.      * @param array $tables
  1280.      *
  1281.      * @return bool
  1282.      */
  1283.     public static function doAim(\Kzl\JinjiKoukaBundle\Entity\KoukaEmployee $kEmp, array $tables null)
  1284.     {
  1285.         // システム設定、考課  供に個人目標「行う」か
  1286.         // // 15/02/26 sakamoto Koukaオブジェクトを渡す
  1287. //        if(!self::doKoukaAimToKouka()) return false;
  1288.         if (!self::doKoukaAimToKouka($kEmp->getKouka())) {
  1289.             return false;
  1290.         }
  1291.         // 考課対象者の考課表設定を取得
  1292.         if ($tables && is_array($tables)) {
  1293.             $koukaTable $tables;
  1294.         } else {
  1295.             $koukaTable self::getDoctrine()->getManager()->getRepository('KzlJinjiKoukaBundle:KoukaTable')->findByKoukaEmployee($kEmp);
  1296.             if (!count($koukaTable)) {
  1297.                 return false;
  1298.             }
  1299. //            if(!$koukaTable) return false;
  1300.         }
  1301.         $ret false;
  1302.         foreach ($koukaTable as $t) {
  1303.             //if($kEmp->getEmployeeId() == 4) var_dump($t);
  1304.             // 複数考課表でもいずれかが「個人目標」になっていればtrue
  1305.             if ($t->getAimFlg()) {
  1306.                 $ret true;
  1307.             }
  1308.         }
  1309.         return $ret;
  1310.     }
  1311.     /**
  1312.      * 社員のログイン方法を返す.
  1313.      *
  1314.      * @return int
  1315.      */
  1316.     public static function getLoginKind(\Kzl\JinjiKoukaBundle\Entity\Employee $emp)
  1317.     {
  1318.         $systemLoginSetting self::getSystemManager()->getLoginSetting();
  1319.         // 2015/7/1 start kawaguchi キシヤ様でかつMBOシステムならID/PWD方式
  1320.         if (self::getSystemManager()->isSystemKishiya() && self::getLayoutType()->isMbo()) {
  1321.             return self::LOGIN_ID_PASS;
  1322.         }
  1323.         // 2015/7/1 end
  1324.         switch ($systemLoginSetting) {
  1325.             case self::LOGIN_BOTH:
  1326.                 // ログイン方式併用なら社員の設定により判断
  1327. //                var_dump($emp->getLoginSetting());
  1328.                 return $emp->getLoginSetting();
  1329.             case self::LOGIN_ONE_TIME:
  1330.             case self::LOGIN_ID_PASS:
  1331.                 // そのまま返す
  1332.                 return $systemLoginSetting;
  1333.             default:
  1334.                 // まず無いはずだがいずれでもなければデフォルト値
  1335.                 return self::LOGIN_ONE_TIME;
  1336.         }
  1337.     }
  1338.     /** TODO: そのうちEmployeeEntityへ移植
  1339.      * IDパスワード方式で、IDorパスワードが登録されていない.
  1340.      */
  1341.     public static function isLoginKindIdPassAndHasNoDatas(\Kzl\JinjiKoukaBundle\Entity\Employee $emp)
  1342.     {
  1343.         if (self::LOGIN_ID_PASS == self::getLoginKind($emp)) {
  1344.             if (!$emp->getLoginId() || !$emp->getPassword()) {
  1345.                 return true;
  1346.             }
  1347.         }
  1348.         return false;
  1349.     }
  1350.     /** 2014/7/4 mitsunaga
  1351.      * 数値ならtrue.
  1352.      *
  1353.      * @param type $subject
  1354.      */
  1355.     public static function isNumeric($subject)
  1356.     {
  1357.         return self::isMatch('/^\d+$/'$subject);
  1358.     }
  1359.     /** 2014/7/4 mitsunaga
  1360.      * Regex一致判定.
  1361.      *
  1362.      * @param string $pattern
  1363.      * @param type   $subject
  1364.      */
  1365.     private static function isMatch($pattern$subject)
  1366.     {
  1367.         return === preg_match($pattern$subject);
  1368.     }
  1369.     /** 2014/7/7 mitsunaga
  1370.      * カラム名からオブジェクトの値を取得。カラム名からゲッター名が正しく求められなかった場合、存在しないカラムの場合などはnullを返す.
  1371.      */
  1372.     public static function getObjectsValueByColumnName($obj$colName)
  1373.     {
  1374.         // データ取得メソッド名取得
  1375.         $getter self::createGetterStrByColumnName($colName);
  1376.         // 取得失敗
  1377.         if (!$getter) {
  1378.             return null;
  1379.         }
  1380.         // メソッド存在せず
  1381.         if (!method_exists($obj$getter)) {
  1382.             return null;
  1383.         }
  1384.         return $obj->$getter();
  1385.     }
  1386.     /** 2014/7/7 mitsunaga
  1387.      * カラム名からゲッター文字列を推定して取得。(※正しいとは限らない)
  1388.      * ※'colmun_name'のようなカラム名を想定している.
  1389.      *
  1390.      * @param type $colName
  1391.      */
  1392.     private static function createGetterStrByColumnName($colName)
  1393.     {
  1394.         return self::createGetterOrSetterStrByColumnName($colNamefalse);
  1395.     }
  1396.     /** 2014/12/9
  1397.      * カラム名からオブジェクトの値を設定。カラム名からゲッター名が正しく求められなかった場合、存在しないカラムの場合などはnullを返す.
  1398.      *
  1399.      * @author mitsunaga
  1400.      */
  1401.     public static function setObjectsValueByColumnName($obj$colName$value)
  1402.     {
  1403.         // データ取得メソッド名取得
  1404.         $setter self::createSetterStrByColumnName($colName);
  1405.         // 取得失敗
  1406.         if (!$setter) {
  1407.             return false;
  1408.         }
  1409.         // メソッド存在せず
  1410.         if (!method_exists($obj$setter)) {
  1411.             return null;
  1412.         }
  1413.         return $obj->$setter($value);
  1414.     }
  1415.     /** 2014/12/9
  1416.      * カラム名からセッター文字列を推定して取得。(※正しいとは限らない)
  1417.      * ※'colmun_name'のようなカラム名を想定している.
  1418.      *
  1419.      * @author mitsunaga
  1420.      *
  1421.      * @param type $colName
  1422.      */
  1423.     private static function createSetterStrByColumnName($colName)
  1424.     {
  1425.         return self::createGetterOrSetterStrByColumnName($colNametrue);
  1426.     }
  1427.     /**
  1428.      * 14/12/9 共通化.
  1429.      *
  1430.      * @author mitsunaga
  1431.      *
  1432.      * @param type $colName
  1433.      * @param type $isSetter
  1434.      *
  1435.      * @return string
  1436.      */
  1437.     private static function createGetterOrSetterStrByColumnName($colName$isSetter)
  1438.     {
  1439.         if (!$colName) {
  1440.             return '';
  1441.         }
  1442.         // ex. 'col_naMe'
  1443.         // すべて小文字に 'col_name'
  1444.         $colName strtolower($colName);
  1445.         // 「_」で分割 'col','name'
  1446.         $names explode('_'$colName);
  1447.         // 頭文字を大文字にし、 'Col','Name'
  1448.         // 「set/get」をつけて結合  'getColName'
  1449.         $name $isSetter 'set' 'get';
  1450.         foreach ($names as $value) {
  1451.             $name .= ucfirst($value);
  1452.         }
  1453.         return $name;
  1454.     }
  1455.     private static $weekjpArray = ['日''月''火''水''木''金''土'];
  1456.     /** 2014/7/8 mitsunaga
  1457.      * 日付型を日本語の曜日名を添えた文字列で取得
  1458.      * 07月09日(水) 13:41  など.
  1459.      */
  1460.     public static function getDateStrJpWeeks($date)
  1461.     {
  1462.         if (!$date) {
  1463.             return '';
  1464.         }
  1465.         $str date_format($date'm月d日');
  1466.         $weekNum date_format($date'w');
  1467.         $str .= '('.self::$weekjpArray[$weekNum].')';
  1468.         $str .= date_format($date' H:i');
  1469.         return $str;
  1470.     }
  1471.     /**
  1472.      * Get a user from the Security Context.
  1473.      *
  1474.      * @return mixed
  1475.      *
  1476.      * @throws \LogicException If SecurityBundle is not available
  1477.      *
  1478.      * @see Symfony\Component\Security\Core\Authentication\Token\TokenInterface::getUser()
  1479.      */
  1480.     public static function getUser()
  1481.     {
  1482. //        if (!$this->container->has('security.context')) {
  1483.         // if (!self::$container->has('security.context')) {
  1484.         //     throw new \LogicException('The SecurityBundle is not registered in your application.');
  1485.         // }
  1486.         // if (null === $token = self::$container->get('security.context')->getToken()) {
  1487.         //     return;
  1488.         // }
  1489.         // if (!is_object($user = $token->getUser())) {
  1490.         //     return;
  1491.         // }
  1492.         if (!self::$container->has('security.token_storage')) {
  1493.             throw new \LogicException('The SecurityBundle is not registered in your application.');
  1494.         }
  1495.         if (null === $token self::$container->get('security.token_storage')->getToken()) {
  1496.             return;
  1497.         }
  1498.         if (!is_object($user $token->getUser())) {
  1499.             // e.g. anonymous authentication
  1500.             return;
  1501.         }
  1502.         return $user;
  1503.     }
  1504.     /** 2014/7/8 mitsunaga
  1505.      * 社員コードソート.
  1506.      *
  1507.      * @param type $a
  1508.      * @param type $b
  1509.      */
  1510.     public static function sortByEmployeeCd($a$b)
  1511.     {
  1512.         // 14/11/21 mitsunaga トリムナシの文字列を利用
  1513. //        return strnatcmp($a->getEmployeeCd(), $b->getEmployeeCd());
  1514.         return strnatcmp($a->getEmployeeCdWithoutTrim(), $b->getEmployeeCdWithoutTrim());
  1515.     }
  1516. //    public static function getKbnObject(){
  1517. //
  1518. //        //社員区分を取得
  1519. //        $resilt = self::getDoctrine()->getManager()->getRepository('KzlJinjiKoukaBundle:Kbn')->getAllKbnDataArray();
  1520. //
  1521. //        //データの並べ替えを行う
  1522. //        $array = array();
  1523. //
  1524. //        foreach ($resilt as $key => $data){
  1525. //
  1526. //            $array[$key+1] =$data;
  1527. //        }
  1528. //
  1529. //        return $array;
  1530. //
  1531. //    }
  1532.     /** 2014/7/18 mitsunaga User:PersonRegistControllerより移植
  1533.      * 自己評価かどうか.
  1534.      */
  1535.     public static function isSelfKouka($koukaPerson$koukaEmployee)
  1536.     {
  1537.         if ($koukaPerson->getKoukaId() != $koukaEmployee->getKoukaId()) {
  1538.             return false;
  1539.         }
  1540.         if ($koukaPerson->getEmployeeId() != $koukaEmployee->getEmployeeId()) {
  1541.             return false;
  1542.         }
  1543.         return true;
  1544.     }
  1545.     /** 2014/7/22 mitsunaga User:BaseControllerより
  1546.      * 代理入力かどうか.
  1547.      */
  1548.     public static function isDairi()
  1549.     {
  1550.         $req self::getRequest();
  1551.         return false !== strpos($req->attributes->get('_route'), 'dairi_')
  1552.                 || $req->get('dairiPersonId');
  1553.     }
  1554.     /** 14/7/22 mitsunaga
  1555.      * controllerクラスより.
  1556.      *
  1557.      * @param type       $message
  1558.      * @param \Exception $previous
  1559.      *
  1560.      * @return \Kzl\JinjiKoukaBundle\Common\NotFoundHttpException
  1561.      */
  1562.     public static function createNotFoundException($message 'Not Found'\Exception $previous null)
  1563.     {
  1564.         return new NotFoundHttpException($message$previous);
  1565.     }
  1566.     /** 14/7/22 mitsunaga
  1567.      * 現在日を取得.
  1568.      *
  1569.      * @return \DateTime
  1570.      */
  1571.     public static function getToday($isOnlyDate true)
  1572.     {
  1573.         $today = new \DateTime();
  1574.         if ($isOnlyDate) {
  1575.             self::getOnlyDate($today);
  1576.         }
  1577.         return $today;
  1578.     }
  1579.     /**
  1580.      * 14/10/29 mitsunaga 時刻の切捨て処理.
  1581.      *
  1582.      * @return type
  1583.      */
  1584.     public static function getOnlyDate(\DateTime $dateTime)
  1585.     {
  1586.         return $dateTime->setTime(000);
  1587.     }
  1588.     /**
  1589.      * 14/11/5 mitsunaga 現在年(西暦).
  1590.      */
  1591.     public static function getNowYear()
  1592.     {
  1593.         return date('Y');
  1594.     }
  1595.     /**
  1596.      * 0埋めするメソッド コード登録設定.
  1597.      */
  1598.     public static function getburyZero($mst$target)
  1599.     {
  1600.         if ($mst == self::KEY_YAKUSYOKU) {
  1601.             $codeSettings JinjiKoukaStatic::getSystemManager()->getYakusyokuCdSetting();
  1602.         }
  1603.         if ($mst == self::KEY_SYOKUGUN) {
  1604.             $codeSettings JinjiKoukaStatic::getSystemManager()->getSyokugunCdSetting();
  1605.         }
  1606.         if ($mst == self::KEY_DIVISION) {
  1607.             $codeSettings JinjiKoukaStatic::getSystemManager()->getDivisionCdSetting();
  1608.         }
  1609.         if ($mst == self::KEY_EMPLOYEE) {
  1610.             $codeSettings JinjiKoukaStatic::getSystemManager()->getEmployeeCdSetting();
  1611.         }
  1612.         // 14/11/21 mitsunaga 一度トリム
  1613.         $target trim($target);
  1614.         $strNum mb_strlen($target);
  1615.         // TODO: monodonminiでコードでリレーションするようになったため一旦コメントアウト
  1616.         // if ($codeSettings['KIND'] == 1) {
  1617.         //     if ($codeSettings['MAX'] > $strNum) {
  1618.         //         //数字のみだった場合は、0か空白で埋める
  1619.         //         if (self::isNumeric($target)) {
  1620.         //             if ($codeSettings['BURY'] == 1) {    //0埋め
  1621.         //                 $target = str_pad($target, $codeSettings['MAX'], '0', STR_PAD_LEFT);
  1622.         //             } else { //半角スペース埋め
  1623.         //                 $target = str_pad($target, $codeSettings['MAX'], ' ', STR_PAD_LEFT);
  1624.         //             }
  1625.         //         }
  1626.         //     }
  1627.         // }
  1628.         return $target;
  1629.     }
  1630.     /**
  1631.      * 役職/職群/所属/社員を全て取得して、0埋めして返す.
  1632.      */
  1633.     public static function getCodeConvertMst($mst)
  1634.     {
  1635.         //配列初期化
  1636.         $target = [];
  1637.         //役職
  1638.         if ($mst == self::KEY_YAKUSYOKU) {
  1639.             $target self::getDoctrine()->getManager()->getRepository('KzlJinjiKoukaBundle:Yakusyoku')->findAll();
  1640.             if ($target) {
  1641.                 foreach ($target as $value) {
  1642. //                    $yakusyokuCd = $value->getYakusyokuCd();
  1643.                     $yakusyokuCd $value->getYakusyokuCdWithoutTrim();
  1644.                     $yakusyokuCd ltrim($yakusyokuCd'0');
  1645.                     $yakusyokuCd ltrim($yakusyokuCd' ');
  1646.                     $cd self::getburyZero(self::KEY_YAKUSYOKU$yakusyokuCd);
  1647.                     $value->setYakusyokuCd($cd);
  1648.                 }
  1649.             }
  1650.         }
  1651.         //職群
  1652.         if ($mst == self::KEY_SYOKUGUN) {
  1653.             $target self::getDoctrine()->getManager()->getRepository('KzlJinjiKoukaBundle:Syokugun')->findAll();
  1654.             if ($target) {
  1655.                 foreach ($target as $value) {
  1656. //                    $syokugunCd = $value->getSyokugunCd();
  1657.                     $syokugunCd $value->getSyokugunCdWithoutTrim();
  1658.                     $syokugunCd ltrim($syokugunCd'0');
  1659.                     $syokugunCd ltrim($syokugunCd' ');
  1660.                     $cd self::getburyZero(self::KEY_SYOKUGUN$syokugunCd);
  1661.                     $value->setSyokugunCd($cd);
  1662.                 }
  1663.             }
  1664.         }
  1665.         //所属
  1666.         if ($mst == self::KEY_DIVISION) {
  1667.             $target self::getDoctrine()->getManager()->getRepository('KzlJinjiKoukaBundle:Department')->findAll();
  1668.             if ($target) {
  1669.                 foreach ($target as $value) {
  1670.                     $divisionCd $value->getDivisionCdWithoutTrim();
  1671.                     $divisionCd ltrim($divisionCd'0');
  1672.                     $divisionCd ltrim($divisionCd' ');
  1673.                     $cd self::getburyZero(self::KEY_DIVISION$divisionCd);
  1674.                     $value->setDivisionCd($cd);
  1675.                 }
  1676.             }
  1677.         }
  1678.         //社員
  1679.         if ($mst == self::KEY_EMPLOYEE) {
  1680.             $target self::getDoctrine()->getManager()->getRepository('KzlJinjiKoukaBundle:Employee')->findAll();
  1681.             if ($target) {
  1682.                 foreach ($target as $value) {
  1683. //                    $employeeCd = $value->getEmployeeCd();
  1684. //                    $employeeCd = $value->getEmployeeCd();
  1685.                     $employeeCd $value->getEmployeeCdWithoutTrim();
  1686.                     $employeeCd ltrim($employeeCd'0');
  1687.                     $employeeCd ltrim($employeeCd' ');
  1688.                     $cd self::getburyZero(self::KEY_EMPLOYEE$employeeCd);
  1689.                     $value->setEmployeeCd($cd);
  1690.                 }
  1691.             }
  1692.         }
  1693.         return $target;
  1694.     }
  1695.     /**
  1696.      * セレクト年月取得.
  1697.      *
  1698.      * @return int
  1699.      */
  1700.     public static function getSelectdata()
  1701.     {
  1702.         $now = (int) date('Y');
  1703.         $kako date('Y') - 80;
  1704.         $mirai date('Y') + 11;
  1705.         //初期値
  1706.         $dateArray['default_toshi'] = (int) date('Y');
  1707.         $dateArray['default_tuki'] = 1;
  1708.         //年
  1709.         for ($kako$kako $now; ++$kako) {
  1710.             $dateArray['toshi'][] = $kako;
  1711.         }
  1712.         for ($now 1$now $mirai; ++$now) {
  1713.             $dateArray['toshi'][] = $now;
  1714.         }
  1715.         //月
  1716.         for ($i 1$i <= 12; ++$i) {
  1717.             $dateArray['tuki'][] = $i;
  1718.         }
  1719.         return $dateArray;
  1720.     }
  1721.     /**
  1722.      * getFamilydefaultData
  1723.      * 家族構成の初期値を取得.
  1724.      */
  1725.     public static function getFamilydefaultData()
  1726.     {
  1727.         //これも変更 使わない
  1728.         $data JinjiKoukaStatic::getSelectdata();
  1729.         //続柄
  1730.         $array[EmployeeRepository::FAMILY_RELATIONSHIP] = EmployeeRepository::$RELATIONSHIP;
  1731.         //性別
  1732.         $array[EmployeeRepository::FAMILY_SEX] = EmployeeRepository::$SEX;
  1733.         //年
  1734.         $array[EmployeeRepository::FAMILY_NEN] = $data['toshi'];
  1735.         //月
  1736.         $array[EmployeeRepository::FAMILY_GETU] = $data['tuki'];
  1737.         //日
  1738.         $day = [];
  1739.         for ($i 1$i 31; ++$i) {
  1740.             $day[] = $i;
  1741.         }
  1742.         $array[EmployeeRepository::FAMILY_HI] = $day;  //もちろん変更する
  1743.         //扶養
  1744.         $array[EmployeeRepository::FAMILY_DEPENDENT] = EmployeeRepository::$DEPENDENT;
  1745.         return $array;
  1746.     }
  1747.     /**
  1748.      * 添付ファイル配列のキー : 顔写真
  1749.      */
  1750.     const TEMP_FILE_KEY_PHOTO 'photo';
  1751.     /**
  1752.      * 添付ファイル配列のキー : 添付ファイル.
  1753.      */
  1754.     const TEMP_FILE_KEY_TEMP 'temp';
  1755.     /**
  1756.      * 社員にぶら下がる顔写真・添付ファイルをそれぞれ取得
  1757.      * 配列キー:'photo' 顔写真 ・ 'temp' 添付ファイル.
  1758.      */
  1759.     public static function getEmployeesTempFiles($employeeId)
  1760.     {
  1761.         $tableName \Kzl\JinjiKoukaBundle\Repository\EmployeeRepository::TABLE_NAME;
  1762.         $EmployeeNoPhoto \Kzl\JinjiKoukaBundle\Repository\FileAttachmentRepository::EMPLOYEE_NO_PHOTO;
  1763.         // 社員にぶら下がるデータを全件取得
  1764.         $files self::getDoctrine()->getManager()->getRepository('KzlJinjiKoukaBundle:FileAttachment')->findByRelation($tableName$employeeId);
  1765.         // 顔写真・添付ファイルにわけてそれぞれ取得
  1766.         $list = [
  1767.             self::TEMP_FILE_KEY_PHOTO => null,
  1768.             self::TEMP_FILE_KEY_TEMP => [],
  1769.         ];
  1770.         foreach ($files as $file) {
  1771.             if ($file->getNo() == $EmployeeNoPhoto) {
  1772.                 $list[self::TEMP_FILE_KEY_PHOTO] = $file;
  1773.             } else {
  1774.                 $list[self::TEMP_FILE_KEY_TEMP][$file->getNo()] = $file;
  1775.             }
  1776.         }
  1777.         return $list;
  1778.     }
  1779.     /**
  1780.      * 登録されているファイルを取得して最新順にソート.
  1781.      *
  1782.      * @param type $employeeId
  1783.      */
  1784.     public static function getEmployeesTempFilesSort($employeeId)
  1785.     {
  1786.         //ファイルの取得
  1787.         $files self::getEmployeesTempFiles($employeeId);
  1788.         //最新順にソート
  1789.         if ($files[self::TEMP_FILE_KEY_TEMP]) {
  1790.             rsort($files[self::TEMP_FILE_KEY_TEMP]);
  1791.         }
  1792.         return $files;
  1793.     }
  1794.     /**
  1795.     郵便番号から住所検索
  1796.      *
  1797.      *
  1798.     @param int $zip
  1799.      * @return mixed
  1800.      */
  1801.     public static function getAddress($postal)
  1802.     {
  1803.         //郵便番号 $postal
  1804.         //ディレクトリパス
  1805.         $path self::getDataDir();
  1806.         $csvfile $path.'/postal/'.'KEN_ALL.CSV';
  1807.         $postal mb_convert_kana($postal'a''utf-8');
  1808.         $postal str_replace(['-''ー'], ''$postal);
  1809.         $tmp file_get_contents($csvfile);
  1810.         $tmp mb_convert_encoding($tmp'utf-8''sjis-win');
  1811.         $fp tmpfile();
  1812.         fwrite($fp$tmp);
  1813.         rewind($fp);
  1814.         setlocale(LC_ALL'ja_JP.UTF-8');
  1815.         $result = [];
  1816.         while (($data fgetcsv($fp0',')) !== false) {
  1817.             if ($data[2] == $postal) {
  1818.                 $result $data;
  1819.                 break;
  1820.             }
  1821.         }
  1822.         fclose($fp);
  1823.         header('Content-type:text/html; charset=utf-8');
  1824.         if (!empty($result)) {
  1825.             $pref $result[6];
  1826.             $city $result[7];
  1827.             $town $result[8];
  1828.             return '['.'"'.$pref.'"'.','.'"'.$city.'"'.','.'"'.$town.'"'.']';
  1829.         } else {
  1830.             return null;
  1831.         }
  1832.     }
  1833.     /**
  1834.      * 15/3/3.
  1835.      *
  1836.      * @author mitsuanga
  1837.      *
  1838.      * @return mixed
  1839.      */
  1840.     public static function arrayLast(array $array)
  1841.     {
  1842.         return end($array);
  1843.     }
  1844.     /**
  1845.      * tenantCdの自動セット設定
  1846.      * @param Entity $targetEntity
  1847.      * @todo 置き場所検討
  1848.      * @return mixed
  1849.      */
  1850.     public static function setTenantCd($targetEntity)
  1851.     {
  1852.         $reflect = new \ReflectionClass($targetEntity);
  1853.         if ($reflect->implementsInterface(TenantAwareInterface::class)) {
  1854.             if ($targetEntity->getTenantCd() === null) {
  1855.                 $tenantCd KzlFrameworkStatic::getTenantManager()->getTenantCd();
  1856.                 $targetEntity->setTenantCd($tenantCd);
  1857.             }
  1858.         }
  1859.     }
  1860.     /**
  1861.      * 15/6/4 (TimesStaticより)作成・更新日時の設定.
  1862.      *
  1863.      * @author mitsunaga
  1864.      *
  1865.      * @param mixed $obj
  1866.      */
  1867.     public static function setCreatedAtAndUpdatedAt($obj)
  1868.     {
  1869.         $now = new \DateTime();
  1870.         // 新規の時は作成日を設定
  1871.         if (method_exists($obj'setCreatedAt') && method_exists($obj'getCreatedAt')) {
  1872.             if (null === $obj->getCreatedAt()) {
  1873.                 $obj->setCreatedAt($now); //var_dump($now);
  1874.             }
  1875.         }
  1876.         // 更新日を設定
  1877.         if (method_exists($obj'setUpdatedAt')) {
  1878.             $obj->setUpdatedAt($now);
  1879.         }
  1880.     }
  1881.     /**
  1882.      * 更新者の設定.
  1883.      *
  1884.      * @author mitsunaga 2017/10/27
  1885.      *
  1886.      * @param mixed $obj
  1887.      */
  1888.     public static function setCreatedAndUpdatedUserId($obj$createdColName 'CreatedUserId'$updatedColName 'UpdatedUserId')
  1889.     {
  1890.         $userId self::getUser()->getId();
  1891.         // 新規の時は作成日を設定
  1892.         $getMethod 'get'.$createdColName;
  1893.         $setMethod 'set'.$createdColName;
  1894.         if (method_exists($obj$getMethod) && method_exists($obj$setMethod)) {
  1895.             if (null === $obj->$getMethod()) {
  1896.                 $obj->$setMethod($userId);
  1897.             }
  1898.         }
  1899.         // 更新日を設定
  1900.         $setMethod 'set'.$updatedColName;
  1901.         if (method_exists($obj$setMethod)) {
  1902.             $obj->$setMethod($userId);
  1903.         }
  1904.     }
  1905.     /**
  1906.      * 15/6/5
  1907.      * Entityの配列を渡して一括削除.
  1908.      *
  1909.      * @author mitsunaga
  1910.      * ※本当はentitymanagerを拡張したい
  1911.      *
  1912.      * @param array $list 対象entityの配列
  1913.      */
  1914.     public static function removeEntities(\Doctrine\ORM\EntityManager $em$list)
  1915.     {
  1916.         if (!count($list)) {
  1917.             return;
  1918.         }
  1919.         foreach ($list as $entity) {
  1920.             $em->remove($entity);
  1921.         }
  1922.         $em->flush();
  1923.     }
  1924.     /**
  1925.      * キーを指定して配列から値取得.
  1926.      *
  1927.      * @param array $array
  1928.      * @param mixed $key
  1929.      * @param mixed $nosetValue
  1930.      *
  1931.      * @return mixed
  1932.      */
  1933.     public static function getValueByArray($array$key$nosetValue null)
  1934.     {
  1935.         if (isset($array[$key])) {
  1936.             return $array[$key];
  1937.         } else {
  1938.             return $nosetValue;
  1939.         }
  1940.     }
  1941.     /**
  1942.      * 次のDNoを設定する
  1943.      * flush実行時にdNoが発行されます.
  1944.      *
  1945.      * @param $obj
  1946.      *
  1947.      * @return void
  1948.      */
  1949.     public static function setNewDNo($obj$dNoName 'dNo')
  1950.     {
  1951.         // 新規の時は作成日を設定
  1952.         $setMethod 'set'.$dNoName;
  1953.         $getMethod 'get'.$dNoName;
  1954.         if (method_exists($obj$setMethod)) {
  1955.             if ($obj->$getMethod() === null) {
  1956.                 $repository self::getDoctrine()->getManager()->getRepository(get_class($obj));
  1957.                 // BaseRepositoryにgetNextDNoが実装されているので継承しているか確認する
  1958.                 if (!is_subclass_of($repositoryBaseRepository::class)) {
  1959.                     throw new \LogicException('BaseRepositoryを継承してください。');
  1960.                 }
  1961.                 // 次のDNoを取得
  1962.                 $nextDNo $repository->getNextDNo($dNoName);
  1963.                 $obj->$setMethod($nextDNo);
  1964.             }
  1965.         }
  1966.     }
  1967.     /**
  1968.      * マルチテナント対応.
  1969.      *
  1970.      * @return TenantManager
  1971.      */
  1972.     public static function getTenantManager()
  1973.     {
  1974.         return self::$container->get('kzl_monodon_mini.services.tenant_manager');
  1975.     }
  1976.     /**
  1977.      * 文字列をキャメル形式に変換する.
  1978.      *
  1979.      * @param string $text
  1980.      *
  1981.      * @return string
  1982.      */
  1983.     public static function camelize($text)
  1984.     {
  1985.         return preg_replace_callback('/(^|_|\.)+(.)/', function ($match) { return ('.' === $match[1] ? '_' '').strtoupper($match[2]); }, $text);
  1986.     }
  1987.     // -------backup
  1988.     // //
  1989.     //
  1990.     // /**
  1991.     //  * 項目名のバリデーション情報を取得する
  1992.     //  *
  1993.     //  */
  1994.     // public static function getItemNameMaxLengthArray()
  1995.     // {
  1996.     //     $array = array();
  1997.     //
  1998.     //     $target = self::getDoctrine()->getManager()->getRepository('KzlJinjiKoukaBundle:ItemName')->findAll();
  1999.     //     if($target){
  2000.     //         foreach($target as $key => $value){
  2001.     //
  2002.     //             if($value->getMaxLength() != null){
  2003.     //                 $array[$value->getItemKey()] = $value->getMaxLength();
  2004.     //             }else{
  2005.     //                 $array[$value->getItemKey()] = 100;
  2006.     //             }
  2007.     //         }
  2008.     //         return $array;
  2009.     //     }
  2010.     //     return $array;
  2011.     // }
  2012.     //    public static function getConstraints(){
  2013.     //         if(null === self::$_constrains){
  2014.     //             self::$_constrains = array(
  2015.     //                 //メール
  2016.     //                 'mail' => new Collection(array(
  2017.     //                     'mail' => new Assert\Email(array(
  2018.     // //                    'message' =>'メールアドレスが正しくありません',
  2019.     //                     'message' =>'有効な'.JinjiKoukaStatic::getTrans('メールアドレス').'ではありません。',
  2020.     // //                    'checkMX'=>true,
  2021.     //                     ))
  2022.     //                 )),
  2023.     //                 // コード
  2024.     //                 'code' => new Collection(array(
  2025.     //                     'code' => array(
  2026.     //                         new Assert\NotBlank(array(
  2027.     // //                            'message' =>'コードは必須です',
  2028.     //                             'message' =>'コードは必須です。',
  2029.     //                         )),
  2030.     //                         new Assert\Length(array(
  2031.     // //                           'maxMessage' =>'文字数が多すぎます。 '.self::CODE_MAX.'文字以内にしてください ',
  2032.     //                            'maxMessage' =>'文字数が多すぎます。 '.self::CODE_MAX.'文字以内でなければなりません。
  2033.     //  ',
  2034.     //                          'max'=>self::CODE_MAX,
  2035.     //                         )),
  2036.     //                         )
  2037.     //                 )),
  2038.     //                 // 名前
  2039.     //                 'name' => new Collection(array(
  2040.     //                     'name' => array(
  2041.     //                         new Assert\NotBlank(array(
  2042.     // //                            'message' =>'名前は必須です',
  2043.     //                             'message' =>'名前は必須です。',
  2044.     //                         )),
  2045.     //                         new Assert\Length(array(
  2046.     // //                           'maxMessage' =>'文字数が多すぎます。 '.self::NAME_MAX.'文字以内にしてください',
  2047.     //                            'maxMessage' =>'文字数が多すぎます。 '.self::NAME_MAX.'文字以内でなければなりません。',
  2048.     //                          'max'=>self::NAME_MAX,
  2049.     //                         )),
  2050.     //                         )
  2051.     //                 )),
  2052.     //
  2053.     //                 // ふりがな
  2054.     //                 'kana' => new Collection(array(
  2055.     //                     'kana' => array(
  2056.     //                         new Assert\Regex(array(
  2057.     //                             'pattern' => '/^([  \t\r\nぁ-んー])+$/u',
  2058.     //                             'message' => 'ひらがなで入力して下さい。',
  2059.     //                         )),
  2060.     //                         new Assert\Length(array(
  2061.     //                            'maxMessage' =>'文字数が多すぎます。 '.self::KANA_MAX.'文字以内でなければなりません。',
  2062.     //                          'max'=>self::KANA_MAX,
  2063.     //                         )),
  2064.     //                         )
  2065.     //                 ))
  2066.     //
  2067.     //             );
  2068.     //         }
  2069.     //         return self::$_constrains;
  2070.     //     }
  2071.     // public static function validateCode( $value ){
  2072.     //         $validator = self::createValidator();
  2073.     //         $constraints = self::getConstraints();
  2074.     //
  2075.     //         $validations = $validator->validateValue(
  2076.     //             array('code' => $value ), /*対象*/
  2077.     //             $constraints['code']   /*バリデーション設定*/
  2078.     //           );
  2079.     //
  2080.     //         return $validations;
  2081.     // }
  2082.     // public static function validateName( $value ){
  2083.     //         $validator = self::createValidator();
  2084.     //         $constraints = self::getConstraints();
  2085.     //
  2086.     //         $validations = $validator->validateValue(
  2087.     //             array('name' => $value ), /*対象*/
  2088.     //             $constraints['name']   /*バリデーション設定*/
  2089.     //           );
  2090.     //
  2091.     //         return $validations;
  2092.     // }
  2093.     //
  2094.     // public static function validateKana( $value ){
  2095.     //
  2096.     //     //全角カナ、半角カナをひらがなに変換 2014/6/9 追加
  2097.     //     $value =  mb_convert_kana($value, 'Hc','UTF-8');
  2098.     //
  2099.     //         $validator = self::createValidator();
  2100.     //         $constraints = self::getConstraints();
  2101.     // //
  2102.     //         $validations = $validator->validateValue(
  2103.     //             array('kana' => $value ), /*対象*/
  2104.     //             $constraints['kana']   /*バリデーション設定*/
  2105.     //           );
  2106.     //
  2107.     //         return $validations;
  2108.     // }
  2109.     // 2015/11/18 mitsunaga
  2110.     // TODO: Employeeへ移植
  2111. //    // TODO: 作り直し
  2112. //    /**
  2113. //     * 年収の自動計算
  2114. //     */
  2115. //    public static function calculation($json){
  2116. //
  2117. //        //値が空なら計算しない
  2118. //        if(!$json) return false;
  2119. //        //JSON形式を配列に変換
  2120. //        $array = self::getArrayByJson($json);
  2121. //
  2122. //        $yearArray = array();
  2123. //        foreach($array as $key => $value){
  2124. //            if(!in_array($value[EmployeeRepository::AI_KEY_STOSHI], $yearArray))
  2125. //            $yearArray[] = $value[EmployeeRepository::AI_KEY_STOSHI];
  2126. //        }
  2127. //        $min = (int)min($yearArray);  //最も古い西暦
  2128. //        $max = (int)max($yearArray);  //最も新しい西暦
  2129. //        if($max < (int)date("Y")) $max = (int)date("Y");
  2130. //        $count = (int)$min;
  2131. //
  2132. //        for($count ; $count<= $max; $count++){
  2133. //            $year[] = $count;
  2134. //        }
  2135. //
  2136. //        //年収が登録されている項目には、年収を入れる
  2137. //        $nen = self::nensyu($array,$year);
  2138. //        //給与 14/11/5 mitsunaga 改修済み
  2139. //        $kyuyo = self::kyuyo($array);
  2140. //        //$kyuyo = self::kyuyo($array,$year);
  2141. //        //手当て 14/11/5 mitsunag 改修済
  2142. ////        $teate = self::teate($array,$year);
  2143. //        $teate = self::teate($array);
  2144. //        //賞与
  2145. //        $bornus = self::bornus($array,$year);
  2146. //
  2147. //        //年収として計算する、区分の年収があれば、年収を使う。なければ、給与・手当・賞与の合計を返す
  2148. //        foreach($year as $key => $value){
  2149. //            //初期化
  2150. //            $annualIncome[$value] = 0;
  2151. //            //年収があれば、年収を格納
  2152. //            if($nen[$value] !== 0){
  2153. //                $annualIncome[$value] = $nen[$value];
  2154. //            }else{
  2155. //                $nensyu = isset($kyuyo[$value]) ? $kyuyo[$value] : 0;
  2156. //                $nenTeate = isset($teate[$value]) ? $teate[$value] : 0;
  2157. //                $nenBornus = isset($bornus[$value]) ? $bornus[$value] : 0;
  2158. ////                $annualIncome[$value] = $kyuyo[$value]+$teate[$value]+$bornas[$value];
  2159. //                $annualIncome[$value] = $nensyu + $nenTeate + $nenBornus;
  2160. //            }
  2161. //
  2162. //        }
  2163. //
  2164. //        return $annualIncome;
  2165. //    }
  2166. //
  2167. //    //年収
  2168. //    private static function nensyu($array,$year){
  2169. //
  2170. //        foreach($year as $key => $value){
  2171. //            foreach($array as $keys => $values){
  2172. //
  2173. //                $nenArray[$value]=0;
  2174. //                if($value == $values[EmployeeRepository::AI_KEY_STOSHI] && $values['KBN'] == 4){
  2175. //                    $nenArray[$value] =  $values['MONEY'];
  2176. //                    break;
  2177. //                }
  2178. //            }
  2179. //        }
  2180. //        return $nenArray;
  2181. //    }
  2182. //
  2183. //    /**
  2184. //     * 14/11/5 mitsunaga 開始年月の昇順でソート
  2185. //     * @param type $a
  2186. //     * @param type $b
  2187. //     * @return int
  2188. //     */
  2189. //    public static function sortAnnualIncome($a, $b){
  2190. //        $aStYear = $a[EmployeeRepository::AI_KEY_STOSHI];
  2191. //        $bStYear = $b[EmployeeRepository::AI_KEY_STOSHI];
  2192. //        $aStMonth = $a[EmployeeRepository::AI_KEY_STUKI];
  2193. //        $bStMonth = $b[EmployeeRepository::AI_KEY_STUKI];
  2194. //         if($aStYear != $bStYear){
  2195. //            return ( $aStYear < $bStYear ) ? -1 : 1;
  2196. //        } else {
  2197. //            return ( $aStMonth < $bStMonth ) ? -1 : 1;
  2198. //        }
  2199. //        return 0;
  2200. //    }
  2201. //    /**
  2202. //     * 14/11/5 mitsunaga 給与計算(改修)
  2203. //     * @param type $annualIncomes
  2204. //     * @return type
  2205. //     */
  2206. //    public static function kyuyo($annualIncomes){
  2207. //        // 1) 終了年月の配列を作成
  2208. //        // TODO: 切り出し
  2209. //        // $array[開始年-月] = array( 'y' => year, 'm' => month );
  2210. //        $edYearMonthArray = array();
  2211. //        $beforeYm = '';
  2212. //
  2213. //        // 開始年月でソート
  2214. //        uasort($annualIncomes, array("self", 'sortAnnualIncome'));
  2215. //        foreach ($annualIncomes as $ai) {
  2216. //            // 給与のみ
  2217. //            if($ai[EmployeeRepository::AI_KEY_KBN] != EmployeeRepository::AI_KBN_SALARY) continue;
  2218. //
  2219. //            // 開始・終了年を保持
  2220. //            $stMonth = $ai[EmployeeRepository::AI_KEY_STUKI];
  2221. //            $stYear = $ai[EmployeeRepository::AI_KEY_STOSHI];
  2222. //            // 開始日がない値はエラーのため無視
  2223. //            if(!$stMonth || !$stYear) continue;
  2224. //
  2225. //            // 前の開始年月があれば、終了年月を設定する
  2226. //            if($beforeYm){
  2227. //                // 終了月の取得
  2228. //                // 開始月 - 1
  2229. //                $beforeEdMonth = $stMonth - 1;
  2230. //                if($beforeEdMonth == 0){
  2231. //                    // 開始月 = 0になったら、前の給与は前年末まで
  2232. //                    $beforeEdMonth = 12;
  2233. //                    $beforeEdYear = $stYear - 1;
  2234. //                }else{
  2235. //                    // 開始月 = 0で無ければ、次給与開始が同じ年
  2236. //                    $beforeEdYear = $stYear;
  2237. //                }
  2238. //
  2239. //                // 1つ前の給与の終了年月を設定
  2240. //                $edYearMonthArray[$beforeYm] = array(
  2241. //                    'y' => $beforeEdYear,
  2242. //                    'm' => $beforeEdMonth,
  2243. //                );
  2244. //            }
  2245. //            // 前の開始年月を保持
  2246. //            $beforeYm = $stYear.'-'.$stMonth;
  2247. //        }
  2248. //        // 一番最後のものは今年の末まで継続する
  2249. //        if($beforeYm){
  2250. //            $edYearMonthArray[$beforeYm] = array(
  2251. //                'y' => self::getNowYear(),
  2252. //                'm' => 12,
  2253. //            );
  2254. //        }
  2255. //        // 年単位の計算処理
  2256. //        $yearsKyuyoArray = array();
  2257. //        foreach ($annualIncomes as $ai) {
  2258. //            // 給与のみ
  2259. //            if($ai[EmployeeRepository::AI_KEY_KBN] != EmployeeRepository::AI_KBN_SALARY) continue;
  2260. //
  2261. //            // 開始年月
  2262. //            $sYear = $ai[EmployeeRepository::AI_KEY_STOSHI];
  2263. //            $sMonth = $ai[EmployeeRepository::AI_KEY_STUKI];
  2264. //            // 給与
  2265. //            $money = $ai[EmployeeRepository::AI_KEY_MONEY];
  2266. //            // 開始日・給与がない値はエラーのため無視
  2267. //            if(!$sYear || !$sMonth || null === $money) continue;
  2268. //
  2269. //            // 終了年月の取得。まずないはずだが、取得できなければ無視
  2270. //            $ym = $sYear.'-'.$sMonth;
  2271. //            if(!isset($edYearMonthArray[$ym]['y']) || !isset($edYearMonthArray[$ym]['m'])) continue;
  2272. //            // 終了年月
  2273. //            $eYear = $edYearMonthArray[$ym]['y'];
  2274. //            $eMonth = $edYearMonthArray[$ym]['m'];
  2275. //            if(!$eYear || !$eMonth) continue;
  2276. //
  2277. //            // [年] = 値 の形で値を集計する
  2278. //            for ($year = $sYear; $year <= $eYear; $year++) {
  2279. //                // 対象年の手当てを集計して格納
  2280. //                if(!isset($yearsKyuyoArray[$year])) $yearsKyuyoArray[$year] = 0;
  2281. //                $yearsKyuyoArray[$year] += self::calcYearsAnnualIncome($year, $sYear, $sMonth, $eYear, $eMonth, $money);
  2282. //            }
  2283. //        }
  2284. //        return $yearsKyuyoArray;
  2285. //    }
  2286. //
  2287. //    /**
  2288. //     * annualIncome一行分から、1年の給与・手当・賞与を計算する
  2289. //     */
  2290. //    private static function calcYearsAnnualIncome($year, $sYear, $sMonth, $eYear, $eMonth, $money){
  2291. //        // 1)集計開始月を設定
  2292. //        $stMonth = self::getAnuualIncomeStMonth($year, $sYear, $sMonth);
  2293. //
  2294. //        // 2)集計終了月を設定
  2295. //        $edMonth = self::getAnuualIncomeEdMonth($year, $eYear, $eMonth);
  2296. //
  2297. //        // 3) 期間 終了月 - (開始月 - 1) : 開始月も含むため
  2298. //        $syukeiMonth = $edMonth - ($stMonth - 1);
  2299. //
  2300. //        // 4) 対象年の金額を集計して返す
  2301. //        return $money * $syukeiMonth;
  2302. //    }
  2303. //
  2304. //
  2305. //    /**
  2306. //     * 開始年から判定して開始月を取得
  2307. //     * @param type $ai annual_incomeを配列に変換したもの。
  2308. //     * @return mixed
  2309. //     */
  2310. //    private static function getAnuualIncomeStMonth($year, $sYear, $sMonth){
  2311. //        // 開始年月が設定されていなければ処理エラー
  2312. //        if(!$sYear || !$sMonth) throw new \Exception('開始年月がない場合処理不可');
  2313. //
  2314. //        if($sYear == $year){
  2315. //            // 開始年 = 集計対象年 : 開始月~
  2316. //            return $sMonth;
  2317. //        } else {
  2318. //            // 開始年 != 集計対象年 : 1月~
  2319. //            return 1;
  2320. //        }
  2321. //    }
  2322. //    /**
  2323. //     * 終了年から判定して終了月を取得
  2324. //     * @param type $ai annual_incomeを配列に変換したもの。
  2325. //     * @return mixed
  2326. //     */
  2327. //    private static function getAnuualIncomeEdMonth($year, $eYear, $eMonth){
  2328. //        // 開始年月が設定されていなければ処理エラー
  2329. //        if(!$eYear || !$eMonth) throw new \Exception('終了年月がない場合処理不可');
  2330. //
  2331. //        if($eYear == $year){
  2332. //            // 終了年 = 集計対象年 : ~終了月
  2333. //            return $eMonth;
  2334. //        } else {
  2335. //            // else : ~12月
  2336. //            return 12;
  2337. //        }
  2338. //    }
  2339. //
  2340. //    /**
  2341. //     * TODO: 社員への移植・調整
  2342. //     * @param type $annualIncomes
  2343. //     * @param type $years
  2344. //     */
  2345. //    public static function teate($annualIncomes){
  2346. //        // 構造メモ
  2347. //        // $years = 年の配列
  2348. //        // $annualIncome[no] = 値;
  2349. //
  2350. //        // 年間ごとに集計
  2351. //        $yearsTeateArray = array();
  2352. //        foreach ($annualIncomes as $ai) {
  2353. //            // 手当てのみ
  2354. //            if($ai[EmployeeRepository::AI_KEY_KBN] != EmployeeRepository::AI_KBN_TEATE) continue;
  2355. //
  2356. //            $sYear = $ai[EmployeeRepository::AI_KEY_STOSHI];
  2357. //            $sMonth = $ai[EmployeeRepository::AI_KEY_STUKI];
  2358. //            $eYear = $ai[EmployeeRepository::AI_KEY_ETOSHI];
  2359. //            $eMonth = $ai[EmployeeRepository::AI_KEY_ETUKI];
  2360. //            // 開始・終了日がない値はエラーのため無視
  2361. //            if(!$sYear || !$sMonth || !$eYear || !$eMonth) continue;
  2362. //
  2363. //            // [年] = 値 の形で値を集計する
  2364. //            for ($year = $sYear; $year <= $eYear; $year++) {
  2365. //
  2366. //                // 1)集計開始月を設定
  2367. //                $stMonth = self::getAnuualIncomeStMonth($year, $sYear, $sMonth);
  2368. //
  2369. //                // 2)集計終了月を設定
  2370. //                $edMonth = self::getAnuualIncomeEdMonth($year, $eYear, $eMonth);
  2371. //
  2372. //                // 3) 期間 終了月 - (開始月 - 1) : 開始月も含むため
  2373. //                $syukeiMonth = $edMonth - ($stMonth - 1);
  2374. //
  2375. //                // 4) 対象年の手当てを集計して格納
  2376. //                if(!isset($yearsTeateArray[$year])) $yearsTeateArray[$year] = 0;
  2377. //                $yearsTeateArray[$year] += $ai[EmployeeRepository::AI_KEY_MONEY] * $syukeiMonth;
  2378. //            }
  2379. //        }
  2380. //
  2381. //        return $yearsTeateArray;
  2382. //    }
  2383. //
  2384. //    //賞与の計算
  2385. //     private static function bornus($array,$year){
  2386. //        //給与の分だけ抜き出す
  2387. //        foreach($array as $key => $value){
  2388. //            if($value['KBN'] == 3){
  2389. //                $bornasArray[$value[EmployeeRepository::AI_KEY_STOSHI]][$value[EmployeeRepository::AI_KEY_STUKI]] = $value['MONEY'];
  2390. //            }
  2391. //        }
  2392. //        foreach($year as $key => $value){
  2393. //            if(!isset($bornasArray[$value])){
  2394. //                $bornasArray[$value][1]=0;
  2395. //            }
  2396. //        }
  2397. //        //給与の分だけ抜き出す
  2398. //        foreach($bornasArray as $key => $value){
  2399. //            if(!isset($value[EmployeeRepository::Jan])) $bornasArray[$key][EmployeeRepository::Jan] = 0;
  2400. //            if(!isset($value[EmployeeRepository::Feb])) $bornasArray[$key][EmployeeRepository::Feb] = 0;
  2401. //            if(!isset($value[EmployeeRepository::Mar])) $bornasArray[$key][EmployeeRepository::Mar] = 0;
  2402. //            if(!isset($value[EmployeeRepository::Apr])) $bornasArray[$key][EmployeeRepository::Apr] = 0;
  2403. //            if(!isset($value[EmployeeRepository::May])) $bornasArray[$key][EmployeeRepository::May] = 0;
  2404. //            if(!isset($value[EmployeeRepository::Jun])) $bornasArray[$key][EmployeeRepository::Jun] = 0;
  2405. //            if(!isset($value[EmployeeRepository::Jul])) $bornasArray[$key][EmployeeRepository::Jul] = 0;
  2406. //            if(!isset($value[EmployeeRepository::Aug])) $bornasArray[$key][EmployeeRepository::Aug] = 0;
  2407. //            if(!isset($value[EmployeeRepository::Sep])) $bornasArray[$key][EmployeeRepository::Sep] = 0;
  2408. //            if(!isset($value[EmployeeRepository::Oct])) $bornasArray[$key][EmployeeRepository::Oct] = 0;
  2409. //            if(!isset($value[EmployeeRepository::Nov])) $bornasArray[$key][EmployeeRepository::Nov] = 0;
  2410. //            if(!isset($value[EmployeeRepository::Dec])) $bornasArray[$key][EmployeeRepository::Dec] = 0;
  2411. //            //キーのソート
  2412. //            ksort($bornasArray[$key]);
  2413. //        }
  2414. //        //配列を時系列で並べ替え--------------
  2415. //        ksort($bornasArray);
  2416. //
  2417. //        //$bornasKeep = '';
  2418. //        $bornas = array();
  2419. //        $total = array();
  2420. //        $keepBornas = null;
  2421. //        foreach($bornasArray as $key => $value){   //西暦ごとにループ
  2422. //            //登録されているボーナスの数を数える
  2423. //            $bornasCount = 0;
  2424. //            $bornasMoney = array();
  2425. //            foreach($value as $k => $v){
  2426. //                if($v != 0){
  2427. //                    $bornasCount++;
  2428. //                    $bornasMoney[] = $v;
  2429. //                    $keepBornas = $v;
  2430. //                }
  2431. //            }
  2432. //
  2433. //            //1つ登録されている場合、×2する
  2434. //            if($bornasCount == 1){
  2435. //                $total[$key] = $bornasMoney[0]*2;
  2436. //            //2つ以上登録されている場合は、総合計を出す
  2437. //            }elseif($bornasCount > 1){
  2438. //                $total[$key] = array_sum($bornasMoney);
  2439. //            //登録されていない場合、直近の値を取得して×2する
  2440. //            }elseif($bornasCount < 1){
  2441. //                $total[$key] = 0;
  2442. //                if($keepBornas) $total[$key] = $keepBornas*2;
  2443. //            }
  2444. //        }
  2445. //        return $total;
  2446. //    }*/
  2447. //給与の計算
  2448.     /* 2014/11/5 mitsunaga backup
  2449.     private static function kyuyo($array,$year){
  2450.         //給与の分だけ抜き出す
  2451.         foreach($array as $key => $value){
  2452.             if($value['KBN'] == 1){
  2453.                 $kyuyoArray[$value[EmployeeRepository::AI_KEY_STOSHI]][$value[EmployeeRepository::AI_KEY_STUKI]] = $value['MONEY'];
  2454.             }
  2455.         }
  2456.         foreach($year as $key => $value){
  2457.             if(!isset($kyuyoArray[$value])){
  2458.                 $kyuyoArray[$value][1]=null;
  2459.             }
  2460.         }
  2461.         //給与の分だけ抜き出す
  2462.         foreach($kyuyoArray as $key => $value){
  2463.             if(!isset($value[EmployeeRepository::Jan])) $kyuyoArray[$key][EmployeeRepository::Jan] = null;
  2464.             if(!isset($value[EmployeeRepository::Feb])) $kyuyoArray[$key][EmployeeRepository::Feb] = null;
  2465.             if(!isset($value[EmployeeRepository::Mar])) $kyuyoArray[$key][EmployeeRepository::Mar] = null;
  2466.             if(!isset($value[EmployeeRepository::Apr])) $kyuyoArray[$key][EmployeeRepository::Apr] = null;
  2467.             if(!isset($value[EmployeeRepository::May])) $kyuyoArray[$key][EmployeeRepository::May] = null;
  2468.             if(!isset($value[EmployeeRepository::Jun])) $kyuyoArray[$key][EmployeeRepository::Jun] = null;
  2469.             if(!isset($value[EmployeeRepository::Jul])) $kyuyoArray[$key][EmployeeRepository::Jul] = null;
  2470.             if(!isset($value[EmployeeRepository::Aug])) $kyuyoArray[$key][EmployeeRepository::Aug] = null;
  2471.             if(!isset($value[EmployeeRepository::Sep])) $kyuyoArray[$key][EmployeeRepository::Sep] = null;
  2472.             if(!isset($value[EmployeeRepository::Oct])) $kyuyoArray[$key][EmployeeRepository::Oct] = null;
  2473.             if(!isset($value[EmployeeRepository::Nov])) $kyuyoArray[$key][EmployeeRepository::Nov] = null;
  2474.             if(!isset($value[EmployeeRepository::Dec])) $kyuyoArray[$key][EmployeeRepository::Dec] = null;
  2475.             //キーのソート
  2476.             ksort($kyuyoArray[$key]);
  2477.         }
  2478.         //配列を時系列で並べ替え--------------
  2479.         ksort($kyuyoArray);
  2480.         $kyuyoKeep = '';
  2481.         $valueNulls = array();
  2482.         foreach($kyuyoArray as $key => $value){
  2483.             $valueNulls[$key] = true;
  2484.             foreach($value as $keys => $num){
  2485.                 //値がnullでなければ、格納
  2486.                 if($num !== null){
  2487.                     $kyuyoKeep = $num;
  2488.                     $valueNulls[$key] = false;
  2489.                 }
  2490.                 //値がnullかつ、保持している値があれば、nullを上書き
  2491.                 if($num === null && $kyuyoKeep != ''){
  2492.                     $kyuyoArray[$key][$keys] = $kyuyoKeep;
  2493.                 }
  2494.             }
  2495.         }
  2496.         //---------------------------------------------------------処理変更したい
  2497.         $first_int = 0;
  2498.         foreach($kyuyoArray as $key => $value){
  2499.             foreach($value as $keys => $num){
  2500.                 //値が0でなければ、格納
  2501.                 if($first_int === 0 && $num !== null){
  2502.                     $first_int = $num;
  2503.                     continue;
  2504.                 }
  2505.             }
  2506.         }
  2507.         foreach($kyuyoArray as $key => $value){
  2508.             if(array_sum($value) !== 0){
  2509.                 foreach($value as $keys => $num){
  2510.                     //値がnullでなければ、格納
  2511.                     if($num === null){
  2512.                         $kyuyoArray[$key][$keys] = $first_int;
  2513.                     }
  2514.                 }
  2515.             }
  2516.         }//--------------------------------------------------------------------
  2517.         //年間ごとの給与を計算する
  2518.         $beforeNensyu = 0;
  2519.         $total = array();
  2520.         foreach ($year as $y) {
  2521.             $sum = array_sum($kyuyoArray[$y]);
  2522.             if(0 === $sum && !$valueNulls[$y]){
  2523.                 $total[$y] = 0;
  2524.             } else {
  2525.                 $nensyu = array_sum($kyuyoArray[$y]);
  2526.                 $total[$y] = $nensyu;
  2527.                 $beforeNensyu = $nensyu;
  2528.             }
  2529.         }
  2530. //        foreach($kyuyoArray as $key => $value){
  2531. //            //var_dump($key);
  2532. //            $total[$key] = array_sum($value);
  2533. //        }
  2534.         return $total;
  2535.     }*/
  2536.     //年収
  2537. //    public function nensyu($array,$year){
  2538. //
  2539. //        foreach($year as $key => $value){
  2540. //            foreach($array as $keys => $values){
  2541. //
  2542. //                if($value == $values[EmployeeRepository::AI_KEY_STOSHI] && $values['KBN'] == 4){
  2543. //                    $nenArray[$value] =  $values['MONEY'];
  2544. //                    break;
  2545. //                }
  2546. //            }
  2547. //        }
  2548. //        //return $nenArray;
  2549. //    }
  2550.     //手当ての計算
  2551.     /* 14/11/5 mitsunaga backup
  2552.     public static function teate($array,$year){
  2553.         //給与の分だけ抜き出す
  2554.         foreach($array as $key => $value){
  2555.             if($value['KBN'] == 2){
  2556.                 $teateArray[] = $value;
  2557.             }
  2558.         }
  2559.         if(!isset($teateArray)) return false;
  2560.         //登録されている手当てごとに計算を行う
  2561.         foreach($teateArray as $loopIndex => $valueTeate){
  2562.             //年数表を作成
  2563.             foreach($year as $yearKey => $yearValue){
  2564.                 $teateList[$yearValue][EmployeeRepository::Jan] = 0;
  2565.                 $teateList[$yearValue][EmployeeRepository::Feb] = 0;
  2566.                 $teateList[$yearValue][EmployeeRepository::Mar] = 0;
  2567.                 $teateList[$yearValue][EmployeeRepository::Apr] = 0;
  2568.                 $teateList[$yearValue][EmployeeRepository::May] = 0;
  2569.                 $teateList[$yearValue][EmployeeRepository::Jun] = 0;
  2570.                 $teateList[$yearValue][EmployeeRepository::Jul] = 0;
  2571.                 $teateList[$yearValue][EmployeeRepository::Aug] = 0;
  2572.                 $teateList[$yearValue][EmployeeRepository::Sep] = 0;
  2573.                 $teateList[$yearValue][EmployeeRepository::Oct] = 0;
  2574.                 $teateList[$yearValue][EmployeeRepository::Nov] = 0;
  2575.                 $teateList[$yearValue][EmployeeRepository::Dec] = 0;
  2576.             }
  2577.             //開始年月を代入
  2578.             $teateList[$valueTeate[EmployeeRepository::AI_KEY_STOSHI]][$valueTeate[EmployeeRepository::AI_KEY_STUKI]] = $valueTeate['MONEY'];
  2579.             //終了年月が登録されていない場合
  2580.             if($valueTeate['ETOSHI'] == ''){
  2581.                 //年数ごとに計算
  2582.                 $stockValue = '';
  2583.                 foreach($teateList as $key => $value){
  2584.                     foreach($value as $keys => $values){
  2585.                         if($values != 0) $stockValue = $values;
  2586.                         if($stockValue != '') $teateList[$key][$keys] = $stockValue;
  2587.                     }
  2588.                 }
  2589.             //終了年月が登録されている場合
  2590.             }else{
  2591.                 //終了日時を設定
  2592.                 if($valueTeate['ETOSHI'] != '') $teateList[$valueTeate['ETOSHI']][$valueTeate['ETUKI']] = $valueTeate['MONEY'];
  2593.                 //年数ごとに計算
  2594.                 $startFlg = 0;
  2595.                 $endFlg = 0;
  2596.                 $stockValue = '';
  2597.                 foreach($teateList as $key => $value){
  2598.                     foreach($value as $keys => $values){
  2599.                         if($startFlg==1 && $values != 0){
  2600.                             $endFlg = 1;
  2601.                         }
  2602.                         if($values != 0 && $startFlg == 0){
  2603.                             $stockValue = $values;
  2604.                             $startFlg = 1;
  2605.                         }
  2606.                         if($startFlg==1 && $endFlg==0){
  2607.                             $teateList[$key][$keys] = $stockValue;
  2608.                         }
  2609.                     }
  2610.                 }
  2611.             }
  2612.             //年間ごとの給与を計算する
  2613.             foreach($teateList as $key => $value){
  2614.                 $total[$key] = array_sum($value);
  2615.             }
  2616.             //配列リストに格納
  2617.             $totalTeateList[] = $total;
  2618.         }
  2619.         //各種の手当てを、年数ごとに合計する
  2620.         foreach($totalTeateList as $key => $value){
  2621.             foreach($value as $keys => $values){
  2622.                 //初回
  2623.                 if(!isset($teateGoukei[$keys]))$teateGoukei[$keys]=0;
  2624.                 $teateGoukei[$keys] += $values;
  2625.                 }
  2626.             }
  2627.         return $teateGoukei;
  2628.     }*/
  2629. //    /**
  2630. //     * 添付ファイル配列のキー : 顔写真
  2631. //     */
  2632. //    const tempFileKeyPhoto = 'photo';
  2633. //    /**
  2634. //     * 添付ファイル配列のキー : 添付ファイル
  2635. //     */
  2636. //    const tempFileKeyTemp = 'temp';
  2637. //    /**
  2638. //     * 社員にぶら下がる顔写真・添付ファイルをそれぞれ取得
  2639. //     * 配列キー:'photo' 顔写真 ・ 'temp' 添付ファイル
  2640. //     * @param \Kzl\JinjiKoukaBundle\Entity\Employee $emp
  2641. //     */
  2642. //    public static function getEmployeesTempFiles(Employee $employee)
  2643. //    {
  2644. //        // 社員にぶら下がるデータを全件取得
  2645. //        $files = self::getDoctrine()->getManager()->getRepository('KzlJinjiKoukaBundle:FileAttachment')->findByRelation(EmployeeRepository::TABLE_NAME, $employee->getId());
  2646. //
  2647. //        // 顔写真・添付ファイルにわけてそれぞれ取得
  2648. //        $list = array(
  2649. //            self::tempFileKeyPhoto => null,
  2650. //            self::tempFileKeyTemp => array(),
  2651. //        );
  2652. //        foreach ($files as $file) {
  2653. //            if($file->getNo() == FileAttachmentRepository::EMPLOYEE_NO_PHOTO){
  2654. //                $list[self::tempFileKeyPhoto] = $file;
  2655. //            } else {
  2656. //                $list[self::tempFileKeyTemp][$file->getNo()] = $file;
  2657. //            }
  2658. //        }
  2659. //        return $list;
  2660. //    }
  2661. //     public static function ivalidityCheck($identifier){
  2662. //
  2663. //        // 社員にぶら下がるデータを全件取得
  2664. //        $result = self::getDoctrine()->getManager()->getRepository('KzlJinjiKoukaBundle:Module')->findOneByIdentifier($identifier);
  2665. //
  2666. //        return $result;
  2667. //     }
  2668. }