feat:生物由来データ参照系の修正
This commit is contained in:
parent
13ac61c682
commit
dee3a3b1cb
@ -4,5 +4,5 @@ from src.model.db.base_db_model import BaseDBModel
|
|||||||
|
|
||||||
|
|
||||||
class PharmacyProductMasterModel(BaseDBModel):
|
class PharmacyProductMasterModel(BaseDBModel):
|
||||||
mkr_cd: Optional[str]
|
prod_pkg_cd: Optional[str]
|
||||||
mkr_cd_name: Optional[str]
|
prod_pkg_cd_name: Optional[str]
|
||||||
|
|||||||
@ -4,45 +4,37 @@ from typing import Optional
|
|||||||
from src.model.db.base_db_model import BaseDBModel
|
from src.model.db.base_db_model import BaseDBModel
|
||||||
|
|
||||||
|
|
||||||
class BioSalesLotDBModel(BaseDBModel):
|
class TrnResultDataBioLotDBModel(BaseDBModel):
|
||||||
slip_mgt_num: Optional[str]
|
if_kind: Optional[str]
|
||||||
rec_whs_cd: Optional[str]
|
account_ym: Optional[str]
|
||||||
rec_whs_sub_cd: Optional[str]
|
seq_no: Optional[int]
|
||||||
rec_whs_org_cd: Optional[str]
|
load_dt: Optional[datetime]
|
||||||
rec_comm_cd: Optional[str]
|
orig_whlslr_cd: Optional[str]
|
||||||
rec_tran_kbn: Optional[str]
|
orig_whlslr_sub_cd: Optional[str]
|
||||||
rev_hsdnymd_srk: Optional[str]
|
cls_whlslr_nm: Optional[str]
|
||||||
rec_urag_num: Optional[str]
|
edit_whlslr_org_cd: Optional[str]
|
||||||
rec_nonyu_fcl_name: Optional[str]
|
orig_slip_no: Optional[str]
|
||||||
rec_nonyu_fcl_addr: Optional[str]
|
cnvs_sales_dt: Optional[datetime]
|
||||||
rec_lot_num: Optional[str]
|
edit_deal_div_cd: Optional[str]
|
||||||
rec_ymd: Optional[str]
|
cls_deal_div_nm: Optional[str]
|
||||||
v_tran_cd: Optional[int]
|
cnvs_prod_cd: Optional[str]
|
||||||
tran_kbn_name: Optional[str]
|
orig_univ_product_cd: Optional[str]
|
||||||
v_whsorg_cd: Optional[int]
|
cls_prod_nm: Optional[str]
|
||||||
whs_org_name: Optional[str]
|
edit_endusr_cd: Optional[str]
|
||||||
v_whs_cd: Optional[int]
|
orig_endusr_nm: Optional[str]
|
||||||
whs_name: Optional[str]
|
orig_jd45_addr_txt: Optional[str]
|
||||||
nonyu_fcl_cd: Optional[str]
|
cnvs_lot_no: Optional[str]
|
||||||
product_name: Optional[str]
|
cnvs_lot_sales_qty: Optional[int]
|
||||||
whs_rep_comm_name: Optional[str]
|
expr_dt: Optional[date]
|
||||||
whs_rep_nonyu_fcl_name: Optional[str]
|
data_kbn: Optional[str]
|
||||||
whs_rep_nonyu_fcl_addr: Optional[str]
|
cnvs_inst_cd: Optional[str]
|
||||||
mkr_cd: Optional[str]
|
cls_inst_nm: Optional[str]
|
||||||
qty: Optional[int]
|
|
||||||
bef_slip_mgt_num: Optional[str]
|
|
||||||
iko_flg: Optional[str]
|
|
||||||
ins_dt: Optional[datetime]
|
|
||||||
ins_usr: Optional[str]
|
|
||||||
inst_cd: Optional[str]
|
|
||||||
inst_name_form: Optional[str]
|
|
||||||
address: Optional[str]
|
address: Optional[str]
|
||||||
tel_num: Optional[str]
|
tel_num: Optional[str]
|
||||||
data_kbn: Optional[str]
|
cnvs_whlslr_cd: Optional[str]
|
||||||
data_kind: Optional[str]
|
cnvs_depo_cd: Optional[str]
|
||||||
err_dtl_kind: Optional[str]
|
cls_depo_nm: Optional[str]
|
||||||
expr_dt: Optional[date]
|
cnvs_deal_div_cd: Optional[str]
|
||||||
|
|
||||||
|
|
||||||
class BioSalesLotCountDBModel(BaseDBModel):
|
class BioSalesLotCountDBModel(BaseDBModel):
|
||||||
count: Optional[int]
|
count: Optional[int]
|
||||||
|
|||||||
@ -9,18 +9,17 @@ from src.util.string_util import is_not_empty
|
|||||||
|
|
||||||
@sanitize
|
@sanitize
|
||||||
class BioModel(BaseModel):
|
class BioModel(BaseModel):
|
||||||
rec_whs_cd: Optional[str]
|
orig_whlslr_cd: Optional[str]
|
||||||
rec_whs_sub_cd: Optional[str]
|
orig_whlslr_sub_cd: Optional[str]
|
||||||
whs_name: Optional[str]
|
cls_whlslr_nm: Optional[str]
|
||||||
slip_org_kbn: Optional[str]
|
if_kind: Optional[str]
|
||||||
rec_ymd_from: Optional[str]
|
load_dt_from: Optional[str]
|
||||||
rec_ymd_to: Optional[str]
|
load_dt_to: Optional[str]
|
||||||
rec_lot_num: Optional[str]
|
cnvs_lot_no: Optional[str]
|
||||||
data_kbn: Optional[str]
|
result_cd: Optional[str]
|
||||||
mkr_cd: Optional[str]
|
cnvs_prod_cd: Optional[str]
|
||||||
rev_hsdnymd_srk_from: Optional[str]
|
cnvs_sales_dt_from: Optional[str]
|
||||||
rev_hsdnymd_srk_to: Optional[str]
|
cnvs_sales_dt_to: Optional[str]
|
||||||
iko_flg: Optional[str]
|
|
||||||
pageNumber: Optional[int]
|
pageNumber: Optional[int]
|
||||||
pageSize: Optional[int]
|
pageSize: Optional[int]
|
||||||
|
|
||||||
@ -29,14 +28,13 @@ class BioModel(BaseModel):
|
|||||||
cls,
|
cls,
|
||||||
ctrl_wholesaler: str = Form(None),
|
ctrl_wholesaler: str = Form(None),
|
||||||
ctrl_org_kbn: str = Form(None),
|
ctrl_org_kbn: str = Form(None),
|
||||||
ctrl_rec_ymd_from: str = Form(None),
|
ctrl_load_dt_from: str = Form(None),
|
||||||
ctrl_rec_ymd_to: str = Form(None),
|
ctrl_load_dt_to: str = Form(None),
|
||||||
ctrl_rec_lot_num: str = Form(None),
|
ctrl_cnvs_lot_no: str = Form(None),
|
||||||
ctrl_data_kbn: str = Form(None),
|
ctrl_result_cd: str = Form(None),
|
||||||
ctrl_maker_cd: str = Form(None),
|
ctrl_maker_cd: str = Form(None),
|
||||||
ctrl_rev_hsdnymd_srk_from: str = Form(None),
|
ctrl_cnvs_sales_dt_from: str = Form(None),
|
||||||
ctrl_rev_hsdnymd_srk_to: str = Form(None),
|
ctrl_cnvs_sales_dt_to: str = Form(None),
|
||||||
ikoFlg: str = Form(None),
|
|
||||||
pageNumber: int = Form(None),
|
pageNumber: int = Form(None),
|
||||||
pageSize: int = Form(None)
|
pageSize: int = Form(None)
|
||||||
):
|
):
|
||||||
@ -45,14 +43,13 @@ class BioModel(BaseModel):
|
|||||||
cls,
|
cls,
|
||||||
ctrl_wholesaler,
|
ctrl_wholesaler,
|
||||||
ctrl_org_kbn,
|
ctrl_org_kbn,
|
||||||
ctrl_rec_ymd_from,
|
ctrl_load_dt_from,
|
||||||
ctrl_rec_ymd_to,
|
ctrl_load_dt_to,
|
||||||
ctrl_rec_lot_num,
|
ctrl_cnvs_lot_no,
|
||||||
ctrl_data_kbn,
|
ctrl_result_cd,
|
||||||
ctrl_maker_cd,
|
ctrl_maker_cd,
|
||||||
ctrl_rev_hsdnymd_srk_from,
|
ctrl_cnvs_sales_dt_from,
|
||||||
ctrl_rev_hsdnymd_srk_to,
|
ctrl_cnvs_sales_dt_to,
|
||||||
ikoFlg,
|
|
||||||
pageNumber,
|
pageNumber,
|
||||||
pageSize
|
pageSize
|
||||||
)
|
)
|
||||||
@ -62,42 +59,39 @@ class BioModel(BaseModel):
|
|||||||
cls,
|
cls,
|
||||||
ctrl_wholesaler: str = Body(None),
|
ctrl_wholesaler: str = Body(None),
|
||||||
ctrl_org_kbn: str = Body(None),
|
ctrl_org_kbn: str = Body(None),
|
||||||
ctrl_rec_ymd_from: str = Body(None),
|
ctrl_load_dt_from: str = Body(None),
|
||||||
ctrl_rec_ymd_to: str = Body(None),
|
ctrl_load_dt_to: str = Body(None),
|
||||||
ctrl_rec_lot_num: str = Body(None),
|
ctrl_cnvs_lot_no: str = Body(None),
|
||||||
ctrl_data_kbn: str = Body(None),
|
ctrl_result_cd: str = Body(None),
|
||||||
ctrl_maker_cd: str = Body(None),
|
ctrl_maker_cd: str = Body(None),
|
||||||
ctrl_rev_hsdnymd_srk_from: str = Body(None),
|
ctrl_cnvs_sales_dt_from: str = Body(None),
|
||||||
ctrl_rev_hsdnymd_srk_to: str = Body(None),
|
ctrl_cnvs_sales_dt_to: str = Body(None)
|
||||||
ikoFlg: str = Body(None)
|
|
||||||
):
|
):
|
||||||
|
|
||||||
return cls.__convert_request_param(
|
return cls.__convert_request_param(
|
||||||
cls,
|
cls,
|
||||||
ctrl_wholesaler,
|
ctrl_wholesaler,
|
||||||
ctrl_org_kbn,
|
ctrl_org_kbn,
|
||||||
ctrl_rec_ymd_from,
|
ctrl_load_dt_from,
|
||||||
ctrl_rec_ymd_to,
|
ctrl_load_dt_to,
|
||||||
ctrl_rec_lot_num,
|
ctrl_cnvs_lot_no,
|
||||||
ctrl_data_kbn,
|
ctrl_result_cd,
|
||||||
ctrl_maker_cd,
|
ctrl_maker_cd,
|
||||||
ctrl_rev_hsdnymd_srk_from,
|
ctrl_cnvs_sales_dt_from,
|
||||||
ctrl_rev_hsdnymd_srk_to,
|
ctrl_cnvs_sales_dt_to
|
||||||
ikoFlg
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def __convert_request_param(
|
def __convert_request_param(
|
||||||
cls,
|
cls,
|
||||||
ctrl_wholesaler: str,
|
ctrl_wholesaler: str,
|
||||||
ctrl_org_kbn: str,
|
ctrl_org_kbn: str,
|
||||||
ctrl_rec_ymd_from: str,
|
ctrl_load_dt_from: str,
|
||||||
ctrl_rec_ymd_to: str,
|
ctrl_load_dt_to: str,
|
||||||
ctrl_rec_lot_num: str,
|
ctrl_cnvs_lot_no: str,
|
||||||
ctrl_data_kbn: str,
|
ctrl_result_cd: str,
|
||||||
ctrl_maker_cd: str,
|
ctrl_maker_cd: str,
|
||||||
ctrl_rev_hsdnymd_srk_from: str,
|
ctrl_cnvs_sales_dt_from: str,
|
||||||
ctrl_rev_hsdnymd_srk_to: str,
|
ctrl_cnvs_sales_dt_to: str,
|
||||||
ikoFlg: str,
|
|
||||||
pageNumber: int = None,
|
pageNumber: int = None,
|
||||||
pageSize: int = None
|
pageSize: int = None
|
||||||
):
|
):
|
||||||
@ -113,34 +107,33 @@ class BioModel(BaseModel):
|
|||||||
wholesaler_sub_code = wholesaler_without_name.split('-')[1]
|
wholesaler_sub_code = wholesaler_without_name.split('-')[1]
|
||||||
|
|
||||||
# 処理日
|
# 処理日
|
||||||
rec_ymd_from = None
|
load_dt_from = None
|
||||||
rec_ymd_to = None
|
load_dt_to = None
|
||||||
if is_not_empty(ctrl_rec_ymd_from):
|
if is_not_empty(ctrl_load_dt_from):
|
||||||
rec_ymd_from = ctrl_rec_ymd_from.replace('/', '')
|
load_dt_from = ctrl_load_dt_from.replace('/', '')
|
||||||
if is_not_empty(ctrl_rec_ymd_to):
|
if is_not_empty(ctrl_load_dt_to):
|
||||||
rec_ymd_to = ctrl_rec_ymd_to.replace('/', '')
|
load_dt_to = ctrl_load_dt_to.replace('/', '')
|
||||||
|
|
||||||
# 発伝年月日
|
# 発伝年月日
|
||||||
rev_hsdnymd_srk_from = None
|
cnvs_sales_dt_from = None
|
||||||
rev_hsdnymd_srk_to = None
|
cnvs_sales_dt_to = None
|
||||||
if is_not_empty(ctrl_rev_hsdnymd_srk_from):
|
if is_not_empty(ctrl_cnvs_sales_dt_from):
|
||||||
rev_hsdnymd_srk_from = ctrl_rev_hsdnymd_srk_from.replace('/', '')
|
cnvs_sales_dt_from = ctrl_cnvs_sales_dt_from.replace('/', '')
|
||||||
if is_not_empty(ctrl_rev_hsdnymd_srk_to):
|
if is_not_empty(ctrl_cnvs_sales_dt_to):
|
||||||
rev_hsdnymd_srk_to = ctrl_rev_hsdnymd_srk_to.replace('/', '')
|
cnvs_sales_dt_to = ctrl_cnvs_sales_dt_to.replace('/', '')
|
||||||
|
|
||||||
return cls(
|
return cls(
|
||||||
rec_whs_cd=wholesaler_code,
|
orig_whlslr_cd=wholesaler_code,
|
||||||
rec_whs_sub_cd=wholesaler_sub_code,
|
orig_whlslr_sub_cd=wholesaler_sub_code,
|
||||||
whs_name=wholesaler_name,
|
cls_whlslr_nm=wholesaler_name,
|
||||||
slip_org_kbn=ctrl_org_kbn,
|
if_kind=ctrl_org_kbn,
|
||||||
rec_ymd_from=rec_ymd_from,
|
load_dt_from=load_dt_from,
|
||||||
rec_ymd_to=rec_ymd_to,
|
load_dt_to=load_dt_to,
|
||||||
rec_lot_num=ctrl_rec_lot_num,
|
cnvs_lot_no=ctrl_cnvs_lot_no,
|
||||||
data_kbn=ctrl_data_kbn,
|
result_cd=ctrl_result_cd,
|
||||||
mkr_cd=ctrl_maker_cd,
|
cnvs_prod_cd=ctrl_maker_cd,
|
||||||
rev_hsdnymd_srk_from=rev_hsdnymd_srk_from,
|
cnvs_sales_dt_from=cnvs_sales_dt_from,
|
||||||
rev_hsdnymd_srk_to=rev_hsdnymd_srk_to,
|
cnvs_sales_dt_to=cnvs_sales_dt_to,
|
||||||
iko_flg=ikoFlg,
|
|
||||||
pageNumber=pageNumber,
|
pageNumber=pageNumber,
|
||||||
pageSize=pageSize
|
pageSize=pageSize
|
||||||
)
|
)
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
from src.model.db.trn_result_data_bio_lot import BioSalesLotDBModel
|
from src.model.db.trn_result_data_bio_lot import TrnResultDataBioLotDBModel
|
||||||
from src.util.sanitize import sanitize
|
from src.util.sanitize import sanitize
|
||||||
|
|
||||||
|
|
||||||
@sanitize
|
@sanitize
|
||||||
class BioDisplayModel(BioSalesLotDBModel):
|
class BioDisplayModel(TrnResultDataBioLotDBModel):
|
||||||
def __init__(self, param: BioSalesLotDBModel) -> None:
|
def __init__(self, param: TrnResultDataBioLotDBModel) -> None:
|
||||||
super().__init__(**param.model_dump())
|
super().__init__(**param.model_dump())
|
||||||
|
|||||||
@ -26,9 +26,10 @@ class BioViewModel(BaseModel):
|
|||||||
return OrderedDict(
|
return OrderedDict(
|
||||||
{
|
{
|
||||||
'': '',
|
'': '',
|
||||||
'J': 'JD-NET',
|
'1':'VAN',
|
||||||
'N': 'NHI',
|
'2':'手入力',
|
||||||
'H': '手入力'
|
'3':'VAN-Web',
|
||||||
|
'S':'SCSK-VAN'
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -36,10 +37,10 @@ class BioViewModel(BaseModel):
|
|||||||
return OrderedDict(
|
return OrderedDict(
|
||||||
{
|
{
|
||||||
'': '',
|
'': '',
|
||||||
'0': '正常',
|
'1':'正常',
|
||||||
'1': 'ロットエラー',
|
'2':'卸間転送除外対象データ',
|
||||||
'3': 'ロット不明',
|
'E':'エラー',
|
||||||
'9': 'エラー(解消済み)',
|
'D':'エラー(重複)',
|
||||||
'2': '除外'
|
'Z':'エラー(想定外)'
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@ -8,24 +8,18 @@ logger = get_logger('製品取得')
|
|||||||
class PharmacyProductMasterRepository(BaseRepository):
|
class PharmacyProductMasterRepository(BaseRepository):
|
||||||
|
|
||||||
FETCH_SQL = """\
|
FETCH_SQL = """\
|
||||||
SELECT
|
SELECT
|
||||||
t1.mkr_cd,
|
prod_pkg_cd,
|
||||||
CONCAT(IFNULL(t1.mkr_cd, ''), ' ', IFNULL(t1.mkr_inf_1, '')) AS mkr_cd_name
|
CONCAT(IFNULL(prod_pkg_cd, ''), ' ', IFNULL(prod_pkg_nm_kj, '')) AS prod_pkg_cd_name
|
||||||
FROM
|
FROM (
|
||||||
src05.phm_prd_mst_v t1
|
SELECT
|
||||||
INNER JOIN
|
*,
|
||||||
(
|
ROW_NUMBER() OVER (PARTITION BY prod_pkg_cd ORDER BY eff_start_ym DESC) AS rn
|
||||||
SELECT
|
FROM
|
||||||
prd_cd, MAX(sub_num) AS sno
|
src07.mst_prod_pkg
|
||||||
FROM
|
) AS ranked
|
||||||
src05.phm_prd_mst_v
|
WHERE
|
||||||
WHERE rec_sts_kbn <> '9'
|
rn = 1;
|
||||||
GROUP BY prd_cd
|
|
||||||
) fmv2
|
|
||||||
ON t1.prd_cd = fmv2.prd_cd AND t1.sub_num = fmv2.sno
|
|
||||||
WHERE
|
|
||||||
t1.mkr_cd IS NOT NULL
|
|
||||||
ORDER BY mkr_cd
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def fetch_all(self) -> list[PharmacyProductMasterModel]:
|
def fetch_all(self) -> list[PharmacyProductMasterModel]:
|
||||||
|
|||||||
@ -2,7 +2,7 @@ from src.db import sql_condition as condition
|
|||||||
from src.db.sql_condition import SQLCondition
|
from src.db.sql_condition import SQLCondition
|
||||||
from src.logging.get_logger import get_logger
|
from src.logging.get_logger import get_logger
|
||||||
from src.model.db.trn_result_data_bio_lot import (BioSalesLotCountDBModel,
|
from src.model.db.trn_result_data_bio_lot import (BioSalesLotCountDBModel,
|
||||||
BioSalesLotDBModel)
|
TrnResultDataBioLotDBModel)
|
||||||
from src.model.request.bio import BioModel
|
from src.model.request.bio import BioModel
|
||||||
from src.repositories.base_repository import BaseRepository
|
from src.repositories.base_repository import BaseRepository
|
||||||
from src.system_var import environment
|
from src.system_var import environment
|
||||||
@ -14,58 +14,50 @@ logger = get_logger('生物由来参照')
|
|||||||
class BioSalesLotRepository(BaseRepository):
|
class BioSalesLotRepository(BaseRepository):
|
||||||
FETCH_SQL = """\
|
FETCH_SQL = """\
|
||||||
SELECT
|
SELECT
|
||||||
data_kind,
|
if_kind,
|
||||||
slip_mgt_num,
|
account_ym,
|
||||||
rec_ymd,
|
seq_no,
|
||||||
rec_whs_cd,
|
load_dt,
|
||||||
rec_whs_sub_cd,
|
orig_whlslr_cd,
|
||||||
whs_name,
|
orig_whlslr_sub_cd,
|
||||||
rec_whs_org_cd,
|
cls_whlslr_nm,
|
||||||
rec_urag_num,
|
edit_whlslr_org_cd,
|
||||||
rev_hsdnymd_srk,
|
orig_slip_no,
|
||||||
rec_tran_kbn,
|
cnvs_sales_dt,
|
||||||
tran_kbn_name,
|
edit_deal_div_cd,
|
||||||
mkr_cd,
|
cls_deal_div_nm,
|
||||||
rec_comm_cd,
|
cnvs_prod_cd,
|
||||||
product_name,
|
orig_univ_product_cd,
|
||||||
whs_rep_comm_name,
|
cls_prod_nm,
|
||||||
nonyu_fcl_cd,
|
edit_endusr_cd,
|
||||||
rec_nonyu_fcl_name,
|
orig_endusr_nm,
|
||||||
whs_rep_nonyu_fcl_name,
|
orig_jd45_addr_txt,
|
||||||
rec_nonyu_fcl_addr,
|
cnvs_lot_no,
|
||||||
whs_rep_nonyu_fcl_addr,
|
cnvs_lot_sales_qty,
|
||||||
rec_lot_num,
|
|
||||||
qty,
|
|
||||||
expr_dt,
|
expr_dt,
|
||||||
data_kbn,
|
data_kbn,
|
||||||
err_dtl_kind,
|
cnvs_inst_cd,
|
||||||
bef_slip_mgt_num,
|
cls_inst_nm,
|
||||||
ins_usr,
|
|
||||||
ins_dt,
|
|
||||||
inst_cd,
|
|
||||||
inst_name_form,
|
|
||||||
address,
|
address,
|
||||||
tel_num,
|
tel_num,
|
||||||
-- Excel出力のため、数値型のコード値を文字列として取得(Veeva卸コード、Veeva卸組織コード、Veeva取引区分コード)
|
cnvs_whlslr_cd,
|
||||||
CAST(v_whs_cd AS CHAR) AS v_whs_cd,
|
cnvs_depo_cd,
|
||||||
CAST(v_whsorg_cd AS CHAR) AS v_whsorg_cd,
|
cls_depo_nm,
|
||||||
whs_org_name,
|
cnvs_deal_div_cd
|
||||||
CAST(v_tran_cd AS CHAR) AS v_tran_cd,
|
|
||||||
iko_flg
|
|
||||||
FROM
|
FROM
|
||||||
src07.trn_result_data_bio_lot
|
src07.trn_result_data_bio_lot
|
||||||
WHERE
|
WHERE
|
||||||
{where_clause}
|
{where_clause}
|
||||||
ORDER BY
|
ORDER BY
|
||||||
rec_whs_cd,
|
orig_whlslr_cd,
|
||||||
rec_whs_sub_cd,
|
orig_whlslr_sub_cd,
|
||||||
rev_hsdnymd_srk,
|
cnvs_sales_dt,
|
||||||
slip_mgt_num
|
orig_slip_no
|
||||||
ASC
|
ASC
|
||||||
LIMIT {limit}\
|
LIMIT {limit}\
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def fetch_many(self, parameter: BioModel) -> list[BioSalesLotDBModel]:
|
def fetch_many(self, parameter: BioModel) -> list[TrnResultDataBioLotDBModel]:
|
||||||
try:
|
try:
|
||||||
logger.debug('DB参照実行')
|
logger.debug('DB参照実行')
|
||||||
where_clause = self.__build_condition(parameter)
|
where_clause = self.__build_condition(parameter)
|
||||||
@ -74,7 +66,7 @@ class BioSalesLotRepository(BaseRepository):
|
|||||||
query = self.FETCH_SQL.format(where_clause=where_clause, limit=limit_clause)
|
query = self.FETCH_SQL.format(where_clause=where_clause, limit=limit_clause)
|
||||||
logger.debug(f'SQL: {query}')
|
logger.debug(f'SQL: {query}')
|
||||||
result = self._database.execute_select(query, parameter.model_dump())
|
result = self._database.execute_select(query, parameter.model_dump())
|
||||||
models = [BioSalesLotDBModel(**r) for r in result]
|
models = [TrnResultDataBioLotDBModel(**r) for r in result]
|
||||||
return models
|
return models
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.exception(f"DB Error : Exception={e.args}")
|
logger.exception(f"DB Error : Exception={e.args}")
|
||||||
@ -107,7 +99,7 @@ class BioSalesLotRepository(BaseRepository):
|
|||||||
) AS t\
|
) AS t\
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def fetch_count(self, parameter: BioModel) -> list[BioSalesLotDBModel]:
|
def fetch_count(self, parameter: BioModel) -> list[TrnResultDataBioLotDBModel]:
|
||||||
try:
|
try:
|
||||||
logger.debug('DB参照実行')
|
logger.debug('DB参照実行')
|
||||||
where_clause = self.__build_condition(parameter)
|
where_clause = self.__build_condition(parameter)
|
||||||
@ -130,43 +122,44 @@ class BioSalesLotRepository(BaseRepository):
|
|||||||
where_clauses.append(SQLCondition('', '', '1 = 1', literal=True))
|
where_clauses.append(SQLCondition('', '', '1 = 1', literal=True))
|
||||||
|
|
||||||
# 卸(コード/サブコード)
|
# 卸(コード/サブコード)
|
||||||
if is_not_empty(parameter.rec_whs_cd) and is_not_empty(parameter.rec_whs_sub_cd):
|
if is_not_empty(parameter.orig_whlslr_cd) and is_not_empty(parameter.orig_whlslr_sub_cd):
|
||||||
where_clauses.append(SQLCondition('rec_whs_cd', condition.EQ, 'rec_whs_cd'))
|
where_clauses.append(SQLCondition('orig_whlslr_cd', condition.EQ, 'orig_whlslr_cd'))
|
||||||
where_clauses.append(SQLCondition('rec_whs_sub_cd', condition.EQ, 'rec_whs_sub_cd'))
|
where_clauses.append(SQLCondition('orig_whlslr_sub_cd', condition.EQ, 'orig_whlslr_sub_cd'))
|
||||||
# データ種別
|
# 連携種別
|
||||||
if is_not_empty(parameter.slip_org_kbn):
|
if is_not_empty(parameter.if_kind):
|
||||||
where_clauses.append(SQLCondition('slip_org_kbn', condition.EQ, 'slip_org_kbn'))
|
where_clauses.append(SQLCondition('if_kind', condition.EQ, 'if_kind'))
|
||||||
# 処理日 開始日
|
# 処理日 開始日
|
||||||
if is_not_empty(parameter.rec_ymd_from):
|
if is_not_empty(parameter.load_dt_from):
|
||||||
where_clauses.append(SQLCondition('rec_ymd', condition.GE, 'rec_ymd_from'))
|
where_clauses.append(SQLCondition('load_dt', condition.GE, 'load_dt_from'))
|
||||||
# 処理日 終了日
|
# 処理日 終了日
|
||||||
if is_not_empty(parameter.rec_ymd_to):
|
if is_not_empty(parameter.load_dt_to):
|
||||||
where_clauses.append(SQLCondition('rec_ymd', condition.LE, 'rec_ymd_to'))
|
where_clauses.append(SQLCondition('load_dt', condition.LE, 'load_dt_to'))
|
||||||
# ロット番号
|
# ロット番号
|
||||||
if is_not_empty(parameter.rec_lot_num):
|
if is_not_empty(parameter.cnvs_lot_no):
|
||||||
rec_lot_num = parameter.rec_lot_num
|
cnvs_lot_no = parameter.cnvs_lot_no
|
||||||
# あいまい検索文字列('%')が含まれる場合は'LIKE'、でなければ'='で検索
|
# あいまい検索文字列('%')が含まれる場合は'LIKE'、でなければ'='で検索
|
||||||
rec_lot_num_comparator = condition.LIKE if '%' in rec_lot_num else condition.EQ
|
cnvs_lot_no_comparator = condition.LIKE if '%' in cnvs_lot_no else condition.EQ
|
||||||
where_clauses.append(SQLCondition('TRIM(rec_lot_num)', rec_lot_num_comparator, 'rec_lot_num'))
|
where_clauses.append(SQLCondition('TRIM(cnvs_lot_no)', cnvs_lot_no_comparator, 'cnvs_lot_no'))
|
||||||
# データ区分
|
# データ区分
|
||||||
if is_not_empty(parameter.data_kbn):
|
if is_not_empty(parameter.result_cd):
|
||||||
where_clauses.append(SQLCondition('data_kbn', condition.EQ, 'data_kbn'))
|
where_clauses.append(SQLCondition('result_cd', condition.EQ, 'result_cd'))
|
||||||
# 製品
|
# 製品
|
||||||
if is_not_empty(parameter.mkr_cd):
|
if is_not_empty(parameter.cnvs_prod_cd):
|
||||||
where_clauses.append(SQLCondition('mkr_cd', condition.EQ, 'mkr_cd'))
|
where_clauses.append(SQLCondition('cnvs_prod_cd', condition.EQ, 'cnvs_prod_cd'))
|
||||||
# 発伝年月日 開始日
|
# 発伝年月日 開始日
|
||||||
if is_not_empty(parameter.rev_hsdnymd_srk_from):
|
if is_not_empty(parameter.cnvs_sales_dt_from):
|
||||||
where_clauses.append(SQLCondition('rev_hsdnymd_srk', condition.GE, 'rev_hsdnymd_srk_from'))
|
where_clauses.append(SQLCondition('cnvs_sales_dt', condition.GE, 'cnvs_sales_dt_from'))
|
||||||
# 発伝年月日 終了日
|
# 発伝年月日 終了日
|
||||||
if is_not_empty(parameter.rev_hsdnymd_srk_to):
|
if is_not_empty(parameter.cnvs_sales_dt_to):
|
||||||
where_clauses.append(SQLCondition('rev_hsdnymd_srk', condition.LE, 'rev_hsdnymd_srk_to'))
|
where_clauses.append(SQLCondition('cnvs_sales_dt', condition.LE, 'cnvs_sales_dt_to'))
|
||||||
# 移行フラグ
|
# TODO: 削除 # 移行フラグ
|
||||||
# チェックが入っていない場合、移行対象(IKO_FLG = '*')を省く
|
# # チェックが入っていない場合、移行対象(IKO_FLG = '*')を省く
|
||||||
if parameter.iko_flg is None:
|
# if parameter.iko_flg is None:
|
||||||
where_clauses.append(SQLCondition('iko_flg', condition.IS, 'NULL', literal=True))
|
# where_clauses.append(SQLCondition('iko_flg', condition.IS, 'NULL', literal=True))
|
||||||
# 固定条件
|
# 固定条件
|
||||||
# Viewで返されるロット番号9件をNull以外で抽出
|
# ロット番号9件をNull以外で抽出
|
||||||
where_clauses.append(SQLCondition('LENGTH(TRIM(rec_lot_num))', condition.GT, '0', literal=True))
|
# 現在の仕組みだと存在有り得ないので削除
|
||||||
|
# where_clauses.append(SQLCondition('LENGTH(TRIM(cnvs_lot_no))', condition.GT, '0', literal=True))
|
||||||
|
|
||||||
where_clauses_str = ' AND '.join([condition.apply() for condition in where_clauses])
|
where_clauses_str = ' AND '.join([condition.apply() for condition in where_clauses])
|
||||||
|
|
||||||
|
|||||||
@ -20,10 +20,10 @@ class WholesalerMasterRepository(BaseRepository):
|
|||||||
ws_cd,
|
ws_cd,
|
||||||
ws_nm_kj
|
ws_nm_kj
|
||||||
FROM src07.mst_whlslr
|
FROM src07.mst_whlslr
|
||||||
WHERE src07.get_syor_date() BETWEEN start_date AND end_date
|
WHERE src07.get_syor_date() BETWEEN str_to_date(concat(eff_start_ym, '01'), '%Y%m%d') AND str_to_date(concat(eff_end_ym, '01'), '%Y%m%d')
|
||||||
) v2
|
) v2
|
||||||
ON b.ws_cd = v2.ws_cd
|
ON b.orig_whlslr_cd = v2.ws_cd
|
||||||
ORDER BY b.rec_whs_cd, b.rec_whs_sub_cd , b.whs_name DESC
|
ORDER BY b.orig_whlslr_cd, b.orig_whlslr_sub_cd , b.cls_whlslr_nm DESC
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def fetch_all(self) -> list[WholesalerMasterModel]:
|
def fetch_all(self) -> list[WholesalerMasterModel]:
|
||||||
|
|||||||
@ -43,7 +43,7 @@
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
</td>
|
</td>
|
||||||
<td>データ種別:</td>
|
<td>連携種別:</td>
|
||||||
<td class="search_tb">
|
<td class="search_tb">
|
||||||
<select class="text search_dropdown" name="ctrl_org_kbn" onChange="formBtDisabled();applySearchParam(this)" value="">
|
<select class="text search_dropdown" name="ctrl_org_kbn" onChange="formBtDisabled();applySearchParam(this)" value="">
|
||||||
{% for org_kbn_code, org_kbn_value in bio.display_org_kbn().items() %}
|
{% for org_kbn_code, org_kbn_value in bio.display_org_kbn().items() %}
|
||||||
@ -55,12 +55,12 @@
|
|||||||
</td>
|
</td>
|
||||||
<td>処理日:</td>
|
<td>処理日:</td>
|
||||||
<td colspan="2">
|
<td colspan="2">
|
||||||
<input type="text" id="shoribi_start" class="date_picker" name="ctrl_rec_ymd_from" maxlength="10"
|
<input type="text" id="shoribi_start" class="date_picker" name="ctrl_load_dt_from" maxlength="10"
|
||||||
value=""
|
value=""
|
||||||
onchange="formBtDisabled();applySearchParam(this)"
|
onchange="formBtDisabled();applySearchParam(this)"
|
||||||
>
|
>
|
||||||
~
|
~
|
||||||
<input type="text" id="shoribi_end" class="date_picker" name="ctrl_rec_ymd_to" maxlength="10"
|
<input type="text" id="shoribi_end" class="date_picker" name="ctrl_load_dt_to" maxlength="10"
|
||||||
value=""
|
value=""
|
||||||
onchange="formBtDisabled();applySearchParam(this)"
|
onchange="formBtDisabled();applySearchParam(this)"
|
||||||
>
|
>
|
||||||
@ -69,13 +69,13 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td>ロット番号:</td>
|
<td>ロット番号:</td>
|
||||||
<td class="search_tb">
|
<td class="search_tb">
|
||||||
<input class="text" type="text" id="lot_tb" name="ctrl_rec_lot_num" style="ime-mode:disabled" maxlength="10"
|
<input class="text" type="text" id="lot_tb" name="ctrl_cnvs_lot_no" style="ime-mode:disabled" maxlength="10"
|
||||||
value=""
|
value=""
|
||||||
oninput="checkSpaceForm(this); checkAimaiSearhForm(this); formBtDisabled();applySearchParam(this)">
|
oninput="checkSpaceForm(this); checkAimaiSearhForm(this); formBtDisabled();applySearchParam(this)">
|
||||||
</td>
|
</td>
|
||||||
<td>データ区分:</td>
|
<td>データ区分:</td>
|
||||||
<td class="search_tb">
|
<td class="search_tb">
|
||||||
<select class="text search_dropdown" name="ctrl_data_kbn" onchange="formBtDisabled();applySearchParam(this)">
|
<select class="text search_dropdown" name="ctrl_result_cd" onchange="formBtDisabled();applySearchParam(this)">
|
||||||
{% for data_kbn_code, data_kbn_value in bio.display_data_kbn().items() %}
|
{% for data_kbn_code, data_kbn_value in bio.display_data_kbn().items() %}
|
||||||
<option option value="{{data_kbn_value}}">
|
<option option value="{{data_kbn_value}}">
|
||||||
{{data_kbn_value}}
|
{{data_kbn_value}}
|
||||||
@ -88,8 +88,8 @@
|
|||||||
<select class="text search_dropdown" name="ctrl_maker_cd" value="" onChange="formBtDisabled();applySearchParam(this);">
|
<select class="text search_dropdown" name="ctrl_maker_cd" value="" onChange="formBtDisabled();applySearchParam(this);">
|
||||||
<option value=""></option>
|
<option value=""></option>
|
||||||
{% for phm in bio.phm_models %}
|
{% for phm in bio.phm_models %}
|
||||||
<option value="{{phm['mkr_cd']}}">
|
<option value="{{phm['prod_pkg_cd']}}">
|
||||||
{{phm['mkr_cd_name']}}
|
{{phm['prod_pkg_cd_name']}}
|
||||||
</option>
|
</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
@ -98,19 +98,17 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td>発伝年月日:</td>
|
<td>発伝年月日:</td>
|
||||||
<td colspan="3">
|
<td colspan="3">
|
||||||
<input type="text" id="hsdnymd_start" class="date_picker" name="ctrl_rev_hsdnymd_srk_from" maxlength="10"
|
<input type="text" id="hsdnymd_start" class="date_picker" name="ctrl_cnvs_sales_dt_from" maxlength="10"
|
||||||
value=""
|
value=""
|
||||||
onchange="formBtDisabled();applySearchParam(this)"
|
onchange="formBtDisabled();applySearchParam(this)"
|
||||||
>
|
>
|
||||||
~
|
~
|
||||||
<input type="text" id="hsdnymd_end" class="date_picker" name="ctrl_rev_hsdnymd_srk_to" maxlength="10"
|
<input type="text" id="hsdnymd_end" class="date_picker" name="ctrl_cnvs_sales_dt_to" maxlength="10"
|
||||||
value=""
|
value=""
|
||||||
onchange="formBtDisabled();applySearchParam(this)"
|
onchange="formBtDisabled();applySearchParam(this)"
|
||||||
>
|
>
|
||||||
</td>
|
</td>
|
||||||
<td colspan="2">
|
<td colspan="2">
|
||||||
<input type="checkbox" id="ikoFlg" name="ikoFlg" value="true" oninput="applySearchParam(this)">
|
|
||||||
<label for="ikoFlg">2017年11月以前のデータを含める</label>
|
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<input class="buttonSize" id="clear" type="button" name="clear_bt" value="クリア" onclick="clr();clearHidden('bioSearchHidden')">
|
<input class="buttonSize" id="clear" type="button" name="clear_bt" value="クリア" onclick="clr();clearHidden('bioSearchHidden')">
|
||||||
@ -133,8 +131,9 @@
|
|||||||
<table class="tablesorter search_longtextbox" _fixedhead='rows:1; cols:0;'>
|
<table class="tablesorter search_longtextbox" _fixedhead='rows:1; cols:0;'>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>データ種別</th>
|
<th>連携種別</th>
|
||||||
<th>伝票管理NO</th>
|
<th>計上年月</th>
|
||||||
|
<th>管理番号</th>
|
||||||
<th>処理日</th>
|
<th>処理日</th>
|
||||||
<th>卸コード</th>
|
<th>卸コード</th>
|
||||||
<th>卸サブコード</th>
|
<th>卸サブコード</th>
|
||||||
@ -147,29 +146,21 @@
|
|||||||
<th>製品コード</th>
|
<th>製品コード</th>
|
||||||
<th>統一商品コード</th>
|
<th>統一商品コード</th>
|
||||||
<th>商品名</th>
|
<th>商品名</th>
|
||||||
<th>卸報告商品名</th>
|
|
||||||
<th>納入先コード</th>
|
<th>納入先コード</th>
|
||||||
<th>納入先名</th>
|
<th>納入先名</th>
|
||||||
<th>卸報告納入先名</th>
|
|
||||||
<th>納入先住所</th>
|
<th>納入先住所</th>
|
||||||
<th>卸報告納入先住所</th>
|
|
||||||
<th>ロット番号</th>
|
<th>ロット番号</th>
|
||||||
<th>数量</th>
|
<th>数量</th>
|
||||||
<th>有効期限</th>
|
<th>有効期限</th>
|
||||||
<th>データ区分</th>
|
<th>データ区分</th>
|
||||||
<th>エラー詳細種別</th>
|
|
||||||
<th>訂正前伝票管理NO</th>
|
|
||||||
<th>修正者</th>
|
|
||||||
<th>修正日時</th>
|
|
||||||
<th>施設コード</th>
|
<th>施設コード</th>
|
||||||
<th>施設名</th>
|
<th>施設名</th>
|
||||||
<th>施設住所</th>
|
<th>施設住所</th>
|
||||||
<th>施設電話番号</th>
|
<th>施設電話番号</th>
|
||||||
<th>Veeva卸コード</th>
|
<th>tebra卸コード</th>
|
||||||
<th>Veeva卸組織コード</th>
|
<th>tebraデポコード</th>
|
||||||
<th>卸組織名</th>
|
<th>デポ名</th>
|
||||||
<th>Veeva取引区分コード</th>
|
<th>tebra取引区分コード</th>
|
||||||
<th>2017年11月以前データ</th>
|
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody id="result_data" class="result_data"></tbody>
|
<tbody id="result_data" class="result_data"></tbody>
|
||||||
@ -180,26 +171,24 @@
|
|||||||
<form id="search_param_hidden" name="bioSearchHidden">
|
<form id="search_param_hidden" name="bioSearchHidden">
|
||||||
<input type="hidden" name="ctrl_wholesaler" value="">
|
<input type="hidden" name="ctrl_wholesaler" value="">
|
||||||
<input type="hidden" name="ctrl_org_kbn" value="">
|
<input type="hidden" name="ctrl_org_kbn" value="">
|
||||||
<input type="hidden" name="ctrl_rec_ymd_from" value="">
|
<input type="hidden" name="ctrl_load_dt_from" value="">
|
||||||
<input type="hidden" name="ctrl_rec_ymd_to" value="">
|
<input type="hidden" name="ctrl_load_dt_to" value="">
|
||||||
<input type="hidden" name="ctrl_rec_lot_num" value="">
|
<input type="hidden" name="ctrl_cnvs_lot_no" value="">
|
||||||
<input type="hidden" name="ctrl_data_kbn" value="">
|
<input type="hidden" name="ctrl_result_cd" value="">
|
||||||
<input type="hidden" name="ctrl_maker_cd" value="">
|
<input type="hidden" name="ctrl_maker_cd" value="">
|
||||||
<input type="hidden" name="ctrl_rev_hsdnymd_srk_from" value="">
|
<input type="hidden" name="ctrl_cnvs_sales_dt_from" value="">
|
||||||
<input type="hidden" name="ctrl_rev_hsdnymd_srk_to" value="">
|
<input type="hidden" name="ctrl_cnvs_sales_dt_to" value="">
|
||||||
<input type="checkbox" name="ikoFlg" value="true" style="display: none;">
|
|
||||||
</form>
|
</form>
|
||||||
<form id="download_hidden" name="bioDownloadHidden">
|
<form id="download_hidden" name="bioDownloadHidden">
|
||||||
<input type="hidden" name="ctrl_wholesaler" value="">
|
<input type="hidden" name="ctrl_wholesaler" value="">
|
||||||
<input type="hidden" name="ctrl_org_kbn" value="">
|
<input type="hidden" name="ctrl_org_kbn" value="">
|
||||||
<input type="hidden" name="ctrl_rec_ymd_from" value="">
|
<input type="hidden" name="ctrl_load_dt_from" value="">
|
||||||
<input type="hidden" name="ctrl_rec_ymd_to" value="">
|
<input type="hidden" name="ctrl_load_dt_to" value="">
|
||||||
<input type="hidden" name="ctrl_rec_lot_num" value="">
|
<input type="hidden" name="ctrl_cnvs_lot_no" value="">
|
||||||
<input type="hidden" name="ctrl_data_kbn" value="">
|
<input type="hidden" name="ctrl_result_cd" value="">
|
||||||
<input type="hidden" name="ctrl_maker_cd" value="">
|
<input type="hidden" name="ctrl_maker_cd" value="">
|
||||||
<input type="hidden" name="ctrl_rev_hsdnymd_srk_from" value="">
|
<input type="hidden" name="ctrl_cnvs_sales_dt_from" value="">
|
||||||
<input type="hidden" name="ctrl_rev_hsdnymd_srk_to" value="">
|
<input type="hidden" name="ctrl_cnvs_sales_dt_to" value="">
|
||||||
<input type="checkbox" name="ikoFlg" value="true" style="display: none;">
|
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
@ -422,43 +411,36 @@
|
|||||||
|
|
||||||
function pagination_content(datas) {
|
function pagination_content(datas) {
|
||||||
const display_keys = [
|
const display_keys = [
|
||||||
'data_kind',
|
'if_kind',
|
||||||
'slip_mgt_num',
|
'account_ym',
|
||||||
'rec_ymd',
|
'seq_no',
|
||||||
'rec_whs_cd',
|
'load_dt',
|
||||||
'rec_whs_sub_cd',
|
'orig_whlslr_cd',
|
||||||
'whs_name',
|
'orig_whlslr_sub_cd',
|
||||||
'rec_whs_org_cd',
|
'cls_whlslr_nm',
|
||||||
'rec_urag_num',
|
'edit_whlslr_org_cd',
|
||||||
'rev_hsdnymd_srk',
|
'orig_slip_no',
|
||||||
'rec_tran_kbn',
|
'cnvs_sales_dt',
|
||||||
'tran_kbn_name',
|
'edit_deal_div_cd',
|
||||||
'mkr_cd',
|
'cls_deal_div_nm',
|
||||||
'rec_comm_cd',
|
'cnvs_prod_cd',
|
||||||
'product_name',
|
'orig_univ_product_cd',
|
||||||
'whs_rep_comm_name',
|
'cls_prod_nm',
|
||||||
'nonyu_fcl_cd',
|
'edit_endusr_cd',
|
||||||
'rec_nonyu_fcl_name',
|
'orig_endusr_nm',
|
||||||
'whs_rep_nonyu_fcl_name',
|
'orig_jd45_addr_txt',
|
||||||
'rec_nonyu_fcl_addr',
|
'cnvs_lot_no',
|
||||||
'whs_rep_nonyu_fcl_addr',
|
'cnvs_lot_sales_qty',
|
||||||
'rec_lot_num',
|
|
||||||
'qty',
|
|
||||||
'expr_dt',
|
'expr_dt',
|
||||||
'data_kbn',
|
'data_kbn',
|
||||||
'err_dtl_kind',
|
'cnvs_inst_cd',
|
||||||
'bef_slip_mgt_num',
|
'cls_inst_nm',
|
||||||
'ins_usr',
|
|
||||||
'ins_dt',
|
|
||||||
'inst_cd',
|
|
||||||
'inst_name_form',
|
|
||||||
'address',
|
'address',
|
||||||
'tel_num',
|
'tel_num',
|
||||||
'v_whs_cd',
|
'cnvs_whlslr_cd',
|
||||||
'v_whsorg_cd',
|
'cnvs_depo_cd',
|
||||||
'whs_org_name',
|
'cls_depo_nm',
|
||||||
'v_tran_cd',
|
'cnvs_deal_div_cd',
|
||||||
'iko_flg',
|
|
||||||
];
|
];
|
||||||
return datas.map(function (data) {
|
return datas.map(function (data) {
|
||||||
const td = display_keys.map((key) =>{
|
const td = display_keys.map((key) =>{
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user