1000, 'CM' => 900, 'D' => 500, 'CD' => 400, 'C' => 100, 'XC' => 90, 'L' => 50, 'XL' => 40, 'X' => 10, 'IX' => 9, 'V' => 5, 'IV' => 4, 'I' => 1]; foreach ($lookup as $roman => $value) { $matches = intval($integer/$value); $result .= str_repeat($roman, $matches); $integer = $integer % $value; } return $result; } public static function generateCode() { $dateCode = self::PAYMENTCODE . '/' . date('Ymd') . '/' . self::integerToRoman(date('m')). '/' . self::integerToRoman(date('d')). '/'; $lastOrder = self::select([\DB::raw('MAX(payments.number) AS last_code')]) ->where('number', 'like', $dateCode . '%') ->first(); $lastOrderCode = !empty($lastOrder) ? $lastOrder['last_code'] : null; $orderCode = $dateCode . '00001'; if ($lastOrderCode) { $lastOrderNumber = str_replace($dateCode, '', $lastOrderCode); $nextOrderNumber = sprintf('%05d', (int)$lastOrderNumber + 1); $orderCode = $dateCode . $nextOrderNumber; } if (self::_isOrderCodeExists($orderCode)) { return generateOrderCode(); } return $orderCode; } private static function _isOrderCodeExists($orderCode) { return Order::where('code', '=', $orderCode)->exists(); } }