2018-06-10 08:28:01 +00:00
|
|
|
import re
|
|
|
|
import uuid
|
2020-10-07 15:18:43 +00:00
|
|
|
|
2020-05-21 19:45:25 +00:00
|
|
|
from datetime import date, timedelta
|
2018-06-10 08:28:01 +00:00
|
|
|
from decimal import Decimal
|
2014-06-03 11:42:52 +00:00
|
|
|
from io import BytesIO
|
2020-05-17 10:08:13 +00:00
|
|
|
from typing import Optional
|
2014-02-08 09:12:57 +00:00
|
|
|
|
2020-10-07 15:18:43 +00:00
|
|
|
from fastapi import APIRouter
|
2020-05-29 20:28:17 +00:00
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
|
2020-10-07 15:18:43 +00:00
|
|
|
from ..models.master import DbSetting
|
|
|
|
from ..models.voucher import DbImage
|
2013-11-26 08:25:04 +00:00
|
|
|
|
2012-10-16 09:32:36 +00:00
|
|
|
|
2020-05-08 04:52:25 +00:00
|
|
|
router = APIRouter()
|
2013-11-26 08:25:04 +00:00
|
|
|
|
|
|
|
|
2020-05-29 20:28:17 +00:00
|
|
|
def get_lock_info(db: Session) -> (Optional[date], Optional[date]):
|
2020-05-17 10:08:13 +00:00
|
|
|
start: Optional[date]
|
|
|
|
finish: Optional[date]
|
2020-05-29 20:28:17 +00:00
|
|
|
data = db.query(DbSetting).filter(DbSetting.name == "Lock Info").first()
|
2013-11-26 08:25:04 +00:00
|
|
|
if data is None:
|
|
|
|
return None, None
|
|
|
|
|
|
|
|
data = data.data
|
2019-04-06 04:13:12 +00:00
|
|
|
if not data["Start"]["Locked"]:
|
2013-11-26 08:25:04 +00:00
|
|
|
start = None
|
2019-04-06 04:13:12 +00:00
|
|
|
elif data["Start"]["Rolling"]:
|
2020-05-17 10:08:13 +00:00
|
|
|
start: date = date.today() - timedelta(days=data["Start"]["Days"])
|
2013-11-26 08:25:04 +00:00
|
|
|
else:
|
2020-05-17 10:08:13 +00:00
|
|
|
start = data["Start"]["Date"].date()
|
2013-11-26 08:25:04 +00:00
|
|
|
|
2019-04-06 04:13:12 +00:00
|
|
|
if not data["Finish"]["Locked"]:
|
2013-11-26 08:25:04 +00:00
|
|
|
finish = None
|
2019-04-06 04:13:12 +00:00
|
|
|
elif data["Finish"]["Rolling"]:
|
2020-05-17 10:08:13 +00:00
|
|
|
finish = date.today() + timedelta(days=data["Finish"]["Days"])
|
2013-11-26 08:25:04 +00:00
|
|
|
else:
|
2020-05-17 10:08:13 +00:00
|
|
|
finish = data["Finish"]["Date"].date()
|
2013-11-26 08:25:04 +00:00
|
|
|
return start, finish
|
2014-02-08 09:12:57 +00:00
|
|
|
|
|
|
|
|
|
|
|
def to_uuid(value):
|
2020-10-07 16:59:24 +00:00
|
|
|
p = re.compile(
|
|
|
|
"^[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}$"
|
|
|
|
)
|
2014-02-08 09:12:57 +00:00
|
|
|
return uuid.UUID(value) if p.match(value) else None
|
2014-03-12 17:19:29 +00:00
|
|
|
|
2016-12-24 11:41:01 +00:00
|
|
|
|
2014-03-12 17:19:29 +00:00
|
|
|
def to_decimal(value, default=0):
|
|
|
|
import re
|
2019-04-06 04:13:12 +00:00
|
|
|
|
|
|
|
_parser = re.compile(
|
|
|
|
r""" # A numeric string consists of:
|
2014-03-12 17:19:29 +00:00
|
|
|
(?P<sign>[-+])? # an optional sign, followed by either...
|
|
|
|
(
|
|
|
|
(?=\d|\.\d) # ...a number (with at least one digit)
|
|
|
|
(?P<int>\d*) # having a (possibly empty) integer part
|
|
|
|
(\.(?P<frac>\d*))? # followed by an optional fractional part
|
|
|
|
|
|
|
|
|
(?P<signal>s)? # ...an (optionally signaling)
|
|
|
|
NaN # NaN
|
|
|
|
(?P<diag>\d*) # with (possibly empty) diagnostic info.
|
|
|
|
)
|
|
|
|
\Z
|
2019-04-06 04:13:12 +00:00
|
|
|
""",
|
|
|
|
re.VERBOSE | re.IGNORECASE,
|
|
|
|
).match
|
2014-03-12 17:19:29 +00:00
|
|
|
return Decimal(value) if _parser(value.strip()) is not None else default
|