From 6496d4e5a239918ab8e5ead364f76df06477ce0c Mon Sep 17 00:00:00 2001 From: ened Date: Mon, 10 Jul 2023 09:27:55 +0900 Subject: [PATCH] Working on DART api (half-time) --- .../Sources/Domestic/DART/DomesticDart.swift | 81 +- .../DART/DomesticDartBusinessReport.swift | 956 +++++++++++++++++- .../DART/DomesticDartListedCompany.swift | 391 +++++++ .../Domestic/DART/DomesticDartNotice.swift | 16 +- bin/data | 2 +- .../macos/KissMe.xcodeproj/project.pbxproj | 4 + 6 files changed, 1427 insertions(+), 23 deletions(-) create mode 100644 KissMe/Sources/Domestic/DART/DomesticDartListedCompany.swift diff --git a/KissMe/Sources/Domestic/DART/DomesticDart.swift b/KissMe/Sources/Domestic/DART/DomesticDart.swift index ba0087d..a1a0ef3 100644 --- a/KissMe/Sources/Domestic/DART/DomesticDart.swift +++ b/KissMe/Sources/Domestic/DART/DomesticDart.swift @@ -65,6 +65,83 @@ public struct DomesticDart { /// 사업보고서 case annual = "11011" } + + public enum FinancialStatementDivision: String, Codable { + /// 연결재무제표 + case consolated = "CFS" + /// 재무제표 + case one = "OFS" + } + + public enum StatementDivision: String, Codable { + /// 재무상태표 + case basis = "BS" + /// 재무상태표 - 연결 - 유동/비유동법 + case basis1 = "BS1" + /// 재무상태표 - 개별 - 유동/비유동법 + case basis2 = "BS2" + /// 재무상태표 - 연결 - 유동성배열법 + case basis3 = "BS3" + /// 재무상태표 - 개별 - 유동성배열법 + case basis4 = "BS4" + + /// 손익계산서 + case income = "IS" + /// 별개의 손익계산서 - 연결 - 기능별분류 + case income1 = "IS1" + /// 별개의 손익계산서 - 개별 - 기능별분류 + case income2 = "IS2" + /// 별개의 손익계산서 - 연결 - 성격별분류 + case income3 = "IS3" + /// 별개의 손익계산서 - 개별 - 성격별분류 + case income4 = "IS4" + + /// 포괄손익계산서 + case comprehensiveIncome = "CIS" + /// 포괄손익계산서 - 연결 - 세후 + case comprehensiveIncome1 = "CIS1" + /// 포괄손익계산서 - 개별 - 세후 + case comprehensiveIncome2 = "CIS2" + /// 포괄손익계산서 - 연결 - 세전 + case comprehensiveIncome3 = "CIS3" + /// 포괄손익계산서 - 개별 - 세전 + case comprehensiveIncome4 = "CIS4" + + /// 단일 포괄손익계산서 + case singleComprehensiveIncome = "DCIS" + /// 단일 포괄손익계산서 - 연결 - 기능별분류 - 세후포괄손익 + case singleComprehensiveIncome1 = "DCIS1" + /// 단일 포괄손익계산서 - 개별 - 기능별분류 - 세후포괄손익 + case singleComprehensiveIncome2 = "DCIS2" + /// 단일 포괄손익계산서 - 연결 - 기능별분류 - 세전 + case singleComprehensiveIncome3 = "DCIS3" + /// 단일 포괄손익계산서 - 개별 - 기능별분류 - 세전 + case singleComprehensiveIncome4 = "DCIS4" + /// 단일 포괄손익계산서 - 연결 - 성격별분류 - 세후포괄손익 + case singleComprehensiveIncome5 = "DCIS5" + /// 단일 포괄손익계산서 - 개별 - 성격별분류 - 세후포괄손익 + case singleComprehensiveIncome6 = "DCIS6" + /// 단일 포괄손익계산서 - 연결 - 성격별분류 - 세전 + case singleComprehensiveIncome7 = "DCIS7" + /// 단일 포괄손익계산서 - 개별 - 성격별분류 - 세전 + case singleComprehensiveIncome8 = "DCIS8" + + /// 현금흐름표 + case cashFlow = "CF" + /// 현금흐름표 - 연결 - 직접법 + case cashFlow1 = "CF1" + /// 현금흐름표 - 개별 - 직접법 + case cashFlow2 = "CF2" + /// 현금흐름표 - 연결 - 간접법 + case cashFlow3 = "CF3" + /// 현금흐름표 - 개별 - 간접법 + case cashFlow4 = "CF4" + + /// 자본변동표 + case changesInEquity = "SCE" + /// 자본변동표 - 연결 + case changesInEquity1 = "SCE1" + /// 자본변동표 - 개별 + case changesInEquity2 = "SCE2" + } } - - diff --git a/KissMe/Sources/Domestic/DART/DomesticDartBusinessReport.swift b/KissMe/Sources/Domestic/DART/DomesticDartBusinessReport.swift index d32451b..25af3f6 100644 --- a/KissMe/Sources/Domestic/DART/DomesticDartBusinessReport.swift +++ b/KissMe/Sources/Domestic/DART/DomesticDartBusinessReport.swift @@ -232,8 +232,8 @@ extension DomesticDart { /// 사업보고서 - 9 이사·감사 전체의 보수현황(주주총회 승인금액) /// - public struct DirectorInspectorSalaryRequest: DartBalanceRequest { - public typealias KResult = DirectorInspectorSalaryResult + public struct DirectorAuditorSalaryRequest: DartBalanceRequest { + public typealias KResult = DirectorAuditorSalaryResult public var url: String { "/api/drctrAdtAllMendngSttusGmtsckConfmAmount.json" @@ -257,8 +257,8 @@ extension DomesticDart { /// 사업보고서 - 10 이사·감사 전체의 보수현황(보수지급금액 - 유형별) /// - public struct DirectorInspectorPaidSalaryRequest: DartBalanceRequest { - public typealias KResult = DirectorInspectorPaidSalaryResult + public struct DirectorAuditorPaidSalaryRequest: DartBalanceRequest { + public typealias KResult = DirectorAuditorPaidSalaryResult public var url: String { "/api/drctrAdtAllMendngSttusMendngPymntamtTyCl.json" @@ -441,6 +441,281 @@ extension DomesticDart { public var result: KResult? = nil + public let openApiKey: String + public let corporationCode: String + public let businessYear: String + public let reportCode: ReportCode + + public init(openApiKey: String, corporationCode: String, businessYear: String, reportCode: ReportCode) { + self.openApiKey = openApiKey + self.corporationCode = corporationCode + self.businessYear = businessYear + self.reportCode = reportCode + } + } + + + /// 사업보고서 - 18 배당에 관한 사항 + /// + public struct DividendRequest: DartBalanceRequest { + public typealias KResult = DividendResult + + public var url: String { + "/api/alotMatter.json" + } + public var result: KResult? = nil + + + public let openApiKey: String + public let corporationCode: String + public let businessYear: String + public let reportCode: ReportCode + + public init(openApiKey: String, corporationCode: String, businessYear: String, reportCode: ReportCode) { + self.openApiKey = openApiKey + self.corporationCode = corporationCode + self.businessYear = businessYear + self.reportCode = reportCode + } + } + + + /// 사업보고서 - 19 자기주식 취득 및 처분 현황 + /// + public struct TreasuryStockGainDisposalRequest: DartBalanceRequest { + public typealias KResult = TreasuryStockGainDisposalResult + + public var url: String { + "/api/tesstkAcqsDspsSttus.json" + } + public var result: KResult? = nil + + + public let openApiKey: String + public let corporationCode: String + public let businessYear: String + public let reportCode: ReportCode + + public init(openApiKey: String, corporationCode: String, businessYear: String, reportCode: ReportCode) { + self.openApiKey = openApiKey + self.corporationCode = corporationCode + self.businessYear = businessYear + self.reportCode = reportCode + } + } + + + /// 사업보고서 - 20 최대주주 현황 + /// + public struct LargestStockholderRequest: DartBalanceRequest { + public typealias KResult = LargestStockholderResult + + public var url: String { + "/api/hyslrSttus.json" + } + public var result: KResult? = nil + + + public let openApiKey: String + public let corporationCode: String + public let businessYear: String + public let reportCode: ReportCode + + public init(openApiKey: String, corporationCode: String, businessYear: String, reportCode: ReportCode) { + self.openApiKey = openApiKey + self.corporationCode = corporationCode + self.businessYear = businessYear + self.reportCode = reportCode + } + } + + + /// 사업보고서 - 21 최대주주 변동현황 + /// + public struct LargestShareholderChangeRequest: DartBalanceRequest { + public typealias KResult = LargestShareholderChangeResult + + public var url: String { + "/api/hyslrChgSttus.json" + } + public var result: KResult? = nil + + + public let openApiKey: String + public let corporationCode: String + public let businessYear: String + public let reportCode: ReportCode + + public init(openApiKey: String, corporationCode: String, businessYear: String, reportCode: ReportCode) { + self.openApiKey = openApiKey + self.corporationCode = corporationCode + self.businessYear = businessYear + self.reportCode = reportCode + } + } + + + /// 사업보고서 - 22 소액주주 현황 + /// + public struct SmallShareholderRequest: DartBalanceRequest { + public typealias KResult = SmallShareholderResult + + public var url: String { + "/api/mrhlSttus.json" + } + public var result: KResult? = nil + + + public let openApiKey: String + public let corporationCode: String + public let businessYear: String + public let reportCode: ReportCode + + public init(openApiKey: String, corporationCode: String, businessYear: String, reportCode: ReportCode) { + self.openApiKey = openApiKey + self.corporationCode = corporationCode + self.businessYear = businessYear + self.reportCode = reportCode + } + } + + + /// 사업보고서 - 23 임원 현황 + /// + public struct ExecutiveRequest: DartBalanceRequest { + public typealias KResult = ExecutiveResult + + public var url: String { + "/api/exctvSttus.json" + } + public var result: KResult? = nil + + + public let openApiKey: String + public let corporationCode: String + public let businessYear: String + public let reportCode: ReportCode + + public init(openApiKey: String, corporationCode: String, businessYear: String, reportCode: ReportCode) { + self.openApiKey = openApiKey + self.corporationCode = corporationCode + self.businessYear = businessYear + self.reportCode = reportCode + } + } + + + /// 사업보고서 - 24 직원 현황 + /// + public struct EmployeeRequest: DartBalanceRequest { + public typealias KResult = EmployeeResult + + public var url: String { + "/api/empSttus.json" + } + public var result: KResult? = nil + + + public let openApiKey: String + public let corporationCode: String + public let businessYear: String + public let reportCode: ReportCode + + public init(openApiKey: String, corporationCode: String, businessYear: String, reportCode: ReportCode) { + self.openApiKey = openApiKey + self.corporationCode = corporationCode + self.businessYear = businessYear + self.reportCode = reportCode + } + } + + + /// 사업보고서 - 25 이사·감사의 개인별 보수 현황 + /// + public struct DirectorAuditorPersonalSalaryRequest: DartBalanceRequest { + public typealias KResult = DirectorAuditorPersonalSalaryResult + + public var url: String { + "/api/hmvAuditIndvdlBySttus.json" + } + public var result: KResult? = nil + + + public let openApiKey: String + public let corporationCode: String + public let businessYear: String + public let reportCode: ReportCode + + public init(openApiKey: String, corporationCode: String, businessYear: String, reportCode: ReportCode) { + self.openApiKey = openApiKey + self.corporationCode = corporationCode + self.businessYear = businessYear + self.reportCode = reportCode + } + } + + + /// 사업보고서 - 26 이사·감사 전체의 보수현황 + /// + public struct DirectorAuditorAllSalaryRequest: DartBalanceRequest { + public typealias KResult = DirectorAuditorAllSalaryResult + + public var url: String { + "/api/hmvAuditAllSttus.json" + } + public var result: KResult? = nil + + + public let openApiKey: String + public let corporationCode: String + public let businessYear: String + public let reportCode: ReportCode + + public init(openApiKey: String, corporationCode: String, businessYear: String, reportCode: ReportCode) { + self.openApiKey = openApiKey + self.corporationCode = corporationCode + self.businessYear = businessYear + self.reportCode = reportCode + } + } + + + /// 사업보고서 - 27 개인별 보수지급 금액(5억이상 상위5인) + /// + public struct IndividualTopSalaryRequest: DartBalanceRequest { + public typealias KResult = IndividualTopSalaryResult + + public var url: String { + "/api/indvdlByPay.json" + } + public var result: KResult? = nil + + + public let openApiKey: String + public let corporationCode: String + public let businessYear: String + public let reportCode: ReportCode + + public init(openApiKey: String, corporationCode: String, businessYear: String, reportCode: ReportCode) { + self.openApiKey = openApiKey + self.corporationCode = corporationCode + self.businessYear = businessYear + self.reportCode = reportCode + } + } + + + /// 사업보고서 - 28 타법인 출자현황 + /// + public struct OtherCompanyInvestmentRequest: DartBalanceRequest { + public typealias KResult = OtherCompanyInvestmentResult + + public var url: String { + "/api/otrCprInvstmntSttus.json" + } + public var result: KResult? = nil + + public let openApiKey: String public let corporationCode: String public let businessYear: String @@ -980,7 +1255,7 @@ extension DomesticDart { } - public struct DirectorInspectorSalaryResult: Codable { + public struct DirectorAuditorSalaryResult: Codable { public let result: Result public struct Result: Codable { @@ -1027,7 +1302,7 @@ extension DomesticDart { } - public struct DirectorInspectorPaidSalaryResult: Codable { + public struct DirectorAuditorPaidSalaryResult: Codable { public let result: Result public struct Result: Codable { @@ -1452,23 +1727,680 @@ extension DomesticDart { public let corporationCode: String /// 회사명 public let corporationName: String + /// 주식발행 감소일자 + public let issueDecreaseDate: String /// 발행 감소 형태 + public let issueDecreaseStyle: String /// 발행 감소 주식 종류 + public let issueDecreaseStockKind: String /// 발행 감소 수량 + public let issueDecreaseQuantity: String /// 발행 감소 주당 액면 가액 + public let issueDecreaseStockFacePrice: String /// 발행 감소 주당 가액 + public let issueDecreasePricePerStock: String private enum CodingKeys: String, CodingKey { case receiptNo = "rcept_no" case marketType = "corp_cls" case corporationCode = "corp_code" case corporationName = "corp_name" -// case = "isu_dcrs_de" -// case = "isu_dcrs_stle" -// case = "isu_dcrs_stock_knd" -// case = "isu_dcrs_qy" -// case = "isu_dcrs_mstvdv_fval_amount" -// case = "isu_dcrs_mstvdv_amount" + case issueDecreaseDate = "isu_dcrs_de" + case issueDecreaseStyle = "isu_dcrs_stle" + case issueDecreaseStockKind = "isu_dcrs_stock_knd" + case issueDecreaseQuantity = "isu_dcrs_qy" + case issueDecreaseStockFacePrice = "isu_dcrs_mstvdv_fval_amount" + case issueDecreasePricePerStock = "isu_dcrs_mstvdv_amount" + } + } + } + + + public struct DividendResult: Codable { + public let result: Result + + public struct Result: Codable { + public let status: String + public let message: String + public let list: [Item] + + private enum CodingKeys: String, CodingKey { + case status + case message + case list + } + } + + public struct Item: Codable { + /// 접수번호 + public let receiptNo: String + /// 법인구분 + public let marketType: MarketType + /// 고유번호 + public let corporationCode: String + /// 회사명 + public let corporationName: String + /// 구분 + public let seperation: String + /// 주식 종류 + public let stockKind: String + /// 당기 + public let thisTerm: String + /// 전기 + public let formerTerm: String + /// 전전기 + public let beforeFormerTerm: String + + private enum CodingKeys: String, CodingKey { + case receiptNo = "rcept_no" + case marketType = "corp_cls" + case corporationCode = "corp_code" + case corporationName = "corp_name" + case seperation = "se" + case stockKind = "stock_knd" + case thisTerm = "thstrm" + case formerTerm = "frmtrm" + case beforeFormerTerm = "lwfr" + } + } + } + + + public struct TreasuryStockGainDisposalResult: Codable { + public let result: Result + + public struct Result: Codable { + public let status: String + public let message: String + public let list: [Item] + + private enum CodingKeys: String, CodingKey { + case status + case message + case list + } + } + + public struct Item: Codable { + /// 접수번호 + public let receiptNo: String + /// 법인구분 + public let marketType: MarketType + /// 고유번호 + public let corporationCode: String + /// 회사명 + public let corporationName: String + /// 취득방법 대분류 + public let gainMethod1: String + /// 취득방법 중분류 + public let gainMethod2: String + /// 취득방법 소분류 + public let gainMethod3: String + /// 주식 종류 + public let stockKind: String + /// 기초 수량 + public let basisQuantity: String + /// 변동 수량 취득 + public let gainQuantity: String + /// 변동 수량 처분 + public let disposalQuantity: String + /// 변동 수량 소각 + public let retirementQuantity: String + /// 기말 수량 + public let termEndQuantity: String + /// 비고 + public let remark: String + + private enum CodingKeys: String, CodingKey { + case receiptNo = "rcept_no" + case marketType = "corp_cls" + case corporationCode = "corp_code" + case corporationName = "corp_name" + case gainMethod1 = "acqs_mth1" + case gainMethod2 = "acqs_mth2" + case gainMethod3 = "acqs_mth3" + case stockKind = "stock_knd" + case basisQuantity = "bsis_qy" + case gainQuantity = "change_qy_acqs" + case disposalQuantity = "change_qy_dsps" + case retirementQuantity = "change_qy_incnr" + case termEndQuantity = "trmend_qy" + case remark = "rm" + } + } + } + + + public struct LargestStockholderResult: Codable { + public let result: Result + + public struct Result: Codable { + public let status: String + public let message: String + public let list: [Item] + + private enum CodingKeys: String, CodingKey { + case status + case message + case list + } + } + + public struct Item: Codable { + /// 접수번호 + public let receiptNo: String + /// 법인구분 + public let marketType: MarketType + /// 고유번호 + public let corporationCode: String + /// 회사명 + public let corporationName: String + /// 성명 + public let name: String + /// 관계 + public let relation: String + /// 주식 종류 + public let stockKind: String + /// 기초 소유 주식 수 + public let basisOwnStockQuantity: String + /// 기초 소유 주식 지분율 + public let basisOwnStockRatio: String + /// 기말 소유 주식 수 + public let termEndOwnStockQuantity: String + /// 기말 소유 주식 지분율 + public let termEndOwnStockRatio: String + /// 비고 + public let remark: String + + private enum CodingKeys: String, CodingKey { + case receiptNo = "rcept_no" + case marketType = "corp_cls" + case corporationCode = "corp_code" + case corporationName = "corp_name" + case name = "nm" + case relation = "relate" + case stockKind = "stock_knd" + case basisOwnStockQuantity = "bsis_posesn_stock_co" + case basisOwnStockRatio = "bsis_posesn_stock_qota_rt" + case termEndOwnStockQuantity = "trmend_posesn_stock_co" + case termEndOwnStockRatio = "trmend_posesn_stock_qota_rt" + case remark = "rm" + } + } + } + + + public struct LargestShareholderChangeResult: Codable { + public let result: Result + + public struct Result: Codable { + public let status: String + public let message: String + public let list: [Item] + + private enum CodingKeys: String, CodingKey { + case status + case message + case list + } + } + + public struct Item: Codable { + /// 접수번호 + public let receiptNo: String + /// 법인구분 + public let marketType: MarketType + /// 고유번호 + public let corporationCode: String + /// 회사명 + public let corporationName: String + /// 변동일 + public let changeDate: String + /// 최대 주주 명 + public let largestShareholderName: String + /// 소유 주식 수 + public let holdingQuantity: String + /// 지분율 + public let holdingRatio: String + /// 변동 원인 + public let changeReason: String + /// 비고 + public let remark: String + + private enum CodingKeys: String, CodingKey { + case receiptNo = "rcept_no" + case marketType = "corp_cls" + case corporationCode = "corp_code" + case corporationName = "corp_name" + case changeDate = "change_on" + case largestShareholderName = "mxmm_shrholdr_nm" + case holdingQuantity = "posesn_stock_co" + case holdingRatio = "qota_rt" + case changeReason = "change_cause" + case remark = "rm" + } + } + } + + + public struct SmallShareholderResult: Codable { + public let result: Result + + public struct Result: Codable { + public let status: String + public let message: String + public let list: [Item] + + private enum CodingKeys: String, CodingKey { + case status + case message + case list + } + } + + public struct Item: Codable { + /// 접수번호 + public let receiptNo: String + /// 법인구분 + public let marketType: MarketType + /// 고유번호 + public let corporationCode: String + /// 회사명 + public let corporationName: String + /// 구분 + public let seperation: String + /// 주주수 + public let shareholderCount: String + /// 전체 주주수 + public let totalShareholderCount: String + /// 주주 비율 + public let shareholderRatio: String + /// 보유 주식수 + public let holdingQuantity: String + /// 총발행 주식수 + public let totalStockQuantity: String + /// 보유 주식 비율 + public let holdingRatio: String + + private enum CodingKeys: String, CodingKey { + case receiptNo = "rcept_no" + case marketType = "corp_cls" + case corporationCode = "corp_code" + case corporationName = "corp_name" + case seperation = "se" + case shareholderCount = "shrholdr_co" + case totalShareholderCount = "shrholdr_tot_co" + case shareholderRatio = "shrholdr_rate" + case holdingQuantity = "hold_stock_co" + case totalStockQuantity = "stock_tot_co" + case holdingRatio = "hold_stock_rate" + } + } + } + + + public struct ExecutiveResult: Codable { + public let result: Result + + public struct Result: Codable { + public let status: String + public let message: String + public let list: [Item] + + private enum CodingKeys: String, CodingKey { + case status + case message + case list + } + } + + public struct Item: Codable { + /// 접수번호 + public let receiptNo: String + /// 법인구분 + public let marketType: MarketType + /// 고유번호 + public let corporationCode: String + /// 회사명 + public let corporationName: String + /// 성명 + public let name: String + /// 성별 + public let sex: String + /// 출생 년월 + public let birthYearMonth: String + /// 직위 + public let position: String + /// 등기 임원 여부 + public let executiveRegisterd: String + /// 상근 여부 + public let fulltimeEmployed: String + /// 담당 업무 + public let chargedJob: String + /// 주요 경력 + public let majorCareer: String + /// 최대 주주 관계 + public let relationOfLargestShareholder: String + /// 재직 기간 + public let tenure: String + /// 임기 만료일 + public let tenureEndDate: String + + private enum CodingKeys: String, CodingKey { + case receiptNo = "rcept_no" + case marketType = "corp_cls" + case corporationCode = "corp_code" + case corporationName = "corp_name" + case name = "nm" + case sex = "sexdstn" + case birthYearMonth = "birth_ym" + case position = "ofcps" + case executiveRegisterd = "rgist_exctv_at" + case fulltimeEmployed = "fte_at" + case chargedJob = "chrg_job" + case majorCareer = "main_career" + case relationOfLargestShareholder = "mxmm_shrholdr_relate" + case tenure = "hffc_pd" + case tenureEndDate = "tenure_end_on" + } + } + } + + + public struct EmployeeResult: Codable { + public let result: Result + + public struct Result: Codable { + public let status: String + public let message: String + public let list: [Item] + + private enum CodingKeys: String, CodingKey { + case status + case message + case list + } + } + + public struct Item: Codable { + /// 접수번호 + public let receiptNo: String + /// 법인구분 + public let marketType: MarketType + /// 고유번호 + public let corporationCode: String + /// 회사명 + public let corporationName: String + /// 사업부문 + public let businessDivision: String + /// 성별 + public let sex: String + /// 개정 전 직원 수 정규직 + public let previousRegularEmployeeCount: String + /// 개정 전 직원 수 계약직 + public let previousContractEmployeeCount: String + /// 개정 전 직원 수 기타 + public let previousEtcEmployeeCount: String + /// 정규직 수 + public let regularEmployeeCount: String + /// 정규직 단시간 근로자 수 + public let regularShortTimeEmployeeCount: String + /// 계약직 수 + public let contractEmployeeCount: String + /// 계약직 단시간 근로자 수 + public let contractShortTimeEmployeeCount: String + /// 합계 + public let sum: String + /// 평균 근속 연수 + public let averageJobTenure: String + /// 연간 급여 총액 + public let annualTotalSalaryAmount: String + /// 1인평균 급여액 + public let averageSalaryAmount: String + /// 비고 + public let remark: String + + private enum CodingKeys: String, CodingKey { + case receiptNo = "rcept_no" + case marketType = "corp_cls" + case corporationCode = "corp_code" + case corporationName = "corp_name" + case businessDivision = "fo_bbm" + case sex = "sexdstn" + case previousRegularEmployeeCount = "reform_bfe_emp_co_rgllbr" + case previousContractEmployeeCount = "reform_bfe_emp_co_cnttk" + case previousEtcEmployeeCount = "reform_bfe_emp_co_etc" + case regularEmployeeCount = "rgllbr_co" + case regularShortTimeEmployeeCount = "rgllbr_abacpt_labrr_co" + case contractEmployeeCount = "cnttk_co" + case contractShortTimeEmployeeCount = "cnttk_abacpt_labrr_co" + case sum = "sm" + case averageJobTenure = "avrg_cnwk_sdytrn" + case annualTotalSalaryAmount = "fyer_salary_totamt" + case averageSalaryAmount = "jan_salary_am" + case remark = "rm" + } + } + } + + + public struct DirectorAuditorPersonalSalaryResult: Codable { + public let result: Result + + public struct Result: Codable { + public let status: String + public let message: String + public let list: [Item] + + private enum CodingKeys: String, CodingKey { + case status + case message + case list + } + } + + public struct Item: Codable { + /// 접수번호 + public let receiptNo: String + /// 법인구분 + public let marketType: MarketType + /// 고유번호 + public let corporationCode: String + /// 회사명 + public let corporationName: String + /// 이름 + public let name: String + /// 직위 + public let position: String + /// 보수 총액 + public let totalSalaryAmount: String + /// 보수 총액 비 포함 보수 + public let totalSalaryInclusivePayAmount: String + + private enum CodingKeys: String, CodingKey { + case receiptNo = "rcept_no" + case marketType = "corp_cls" + case corporationCode = "corp_code" + case corporationName = "corp_name" + case name = "nm" + case position = "ofcps" + case totalSalaryAmount = "mendng_totamt" + case totalSalaryInclusivePayAmount = "mendng_totamt_ct_incls_mendng" + } + } + } + + + public struct DirectorAuditorAllSalaryResult: Codable { + public let result: Result + + public struct Result: Codable { + public let status: String + public let message: String + public let list: [Item] + + private enum CodingKeys: String, CodingKey { + case status + case message + case list + } + } + + public struct Item: Codable { + /// 접수번호 + public let receiptNo: String + /// 법인구분 + public let marketType: MarketType + /// 고유번호 + public let corporationCode: String + /// 회사명 + public let corporationName: String + /// 인원수 + public let headcount: String + /// 보수총액 + public let totalPaymentAmount: String + /// 1인당 평균보수액 + public let averagePaymentAmount: String + /// 비고 + public let remark: String + + private enum CodingKeys: String, CodingKey { + case receiptNo = "rcept_no" + case marketType = "corp_cls" + case corporationCode = "corp_code" + case corporationName = "corp_name" + case headcount = "nmpr" + case totalPaymentAmount = "pymnt_totamt" + case averagePaymentAmount = "psn1_avrg_pymntamt" + case remark = "rm" + } + } + } + + + public struct IndividualTopSalaryResult: Codable { + public let result: Result + + public struct Result: Codable { + public let status: String + public let message: String + public let list: [Item] + + private enum CodingKeys: String, CodingKey { + case status + case message + case list + } + } + + public struct Item: Codable { + /// 접수번호 + public let receiptNo: String + /// 법인구분 + public let marketType: MarketType + /// 고유번호 + public let corporationCode: String + /// 회사명 + public let corporationName: String + /// 이름 + public let name: String + /// 직위 + public let position: String + /// 보수 총액 + public let totalSalaryAmount: String + /// 보수 총액 비 포함 보수 + public let totalSalaryInclusivePayAmount: String + + private enum CodingKeys: String, CodingKey { + case receiptNo = "rcept_no" + case marketType = "corp_cls" + case corporationCode = "corp_code" + case corporationName = "corp_name" + case name = "nm" + case position = "ofcps" + case totalSalaryAmount = "mendng_totamt" + case totalSalaryInclusivePayAmount = "mendng_totamt_ct_incls_mendng" + } + } + } + + + public struct OtherCompanyInvestmentResult: Codable { + public let result: Result + + public struct Result: Codable { + public let status: String + public let message: String + public let list: [Item] + + private enum CodingKeys: String, CodingKey { + case status + case message + case list + } + } + + public struct Item: Codable { + /// 접수번호 + public let receiptNo: String + /// 법인구분 + public let marketType: MarketType + /// 고유번호 + public let corporationCode: String + /// 회사명 + public let corporationName: String + /// 법인명 + public let investedCorporationName: String + /// 최초 취득 일자 + public let firstGainDate: String + /// 출자 목적 + public let investmentPurpose: String + /// 최초 취득 금액 + public let firstGainAmount: String + /// 기초 잔액 수량 + public let basisBalanceQuantity: String + /// 기초 잔액 지분율 + public let basisBalanceRatio: String + /// 기초 잔액 장부 가액 + public let basisBalanceBookAmount: String + /// 증가 감소 취득 처분 수량 + public let gainDisposalQuantity: String + /// 증가 감소 취득 처분 금액 + public let gainDisposalAmount: String + /// 증가 감소 평가 손액 + public let evaluationLostAmount: String + /// 기말 잔액 수량 + public let termEndBalanceQuantity: String + /// 기말 잔액 지분율 + public let termEndBalanceRatio: String + /// 기말 잔액 장부 가액 + public let termEndBalanceBookAmount: String + /// 최근 사업 연도 재무 현황 총 자산 + public let recentBusinessYearFinancialStatus_TotalAssets: String + /// 최근 사업 연도 재무 현황 당기 순이익 + public let recentBusinessYearFinancialStatus_NetIncomeTotal: String + + private enum CodingKeys: String, CodingKey { + case receiptNo = "rcept_no" + case marketType = "corp_cls" + case corporationCode = "corp_code" + case corporationName = "corp_name" + + case investedCorporationName = "inv_prm" + case firstGainDate = "frst_acqs_de" + case investmentPurpose = "invstmnt_purps" + case firstGainAmount = "frst_acqs_amount" + case basisBalanceQuantity = "bsis_blce_qy" + case basisBalanceRatio = "bsis_blce_qota_rt" + case basisBalanceBookAmount = "bsis_blce_acntbk_amount" + case gainDisposalQuantity = "incrs_dcrs_acqs_dsps_qy" + case gainDisposalAmount = "incrs_dcrs_acqs_dsps_amount" + case evaluationLostAmount = "incrs_dcrs_evl_lstmn" + case termEndBalanceQuantity = "trmend_blce_qy" + case termEndBalanceRatio = "trmend_blce_qota_rt" + case termEndBalanceBookAmount = "trmend_blce_acntbk_amount" + case recentBusinessYearFinancialStatus_TotalAssets = "recent_bsns_year_fnnr_sttus_tot_assets" + case recentBusinessYearFinancialStatus_NetIncomeTotal = "recent_bsns_year_fnnr_sttus_thstrm_ntpf" } } } diff --git a/KissMe/Sources/Domestic/DART/DomesticDartListedCompany.swift b/KissMe/Sources/Domestic/DART/DomesticDartListedCompany.swift new file mode 100644 index 0000000..6f82315 --- /dev/null +++ b/KissMe/Sources/Domestic/DART/DomesticDartListedCompany.swift @@ -0,0 +1,391 @@ +// +// DomesticDartListedCompany.swift +// KissMe +// +// Created by ened-book-m1 on 2023/07/10. +// + +import Foundation + + +extension DomesticDart { + + /// 상장기업 재무정보 - 1 단일회사 주요계정 + /// + public struct SingleAccountRequest: DartBalanceRequest { + public typealias KResult = AccountResult + + public var url: String { + "/api/fnlttSinglAcnt.json" + } + public var result: KResult? = nil + + + public let openApiKey: String + public let corporationCode: String + public let businessYear: String + public let reportCode: ReportCode + + public init(openApiKey: String, corporationCode: String, businessYear: String, reportCode: ReportCode) { + self.openApiKey = openApiKey + self.corporationCode = corporationCode + self.businessYear = businessYear + self.reportCode = reportCode + } + } + + + /// 상장기업 재무정보 - 2 다중회사 주요계정 + /// + public struct MultipleAccountRequest: DartBalanceRequest { + public typealias KResult = AccountResult + + public var url: String { + "/api/fnlttMultiAcnt.json" + } + public var result: KResult? = nil + + + public let openApiKey: String + public let corporationCode: String + public let businessYear: String + public let reportCode: ReportCode + + public init(openApiKey: String, corporationCode: String, businessYear: String, reportCode: ReportCode) { + self.openApiKey = openApiKey + self.corporationCode = corporationCode + self.businessYear = businessYear + self.reportCode = reportCode + } + } + + + /// 상장기업 재무정보 - 3 재무제표 원본파일(XBRL) + /// + public struct XBRLRequest: DartRequest { + public typealias KResult = Data // Zip file + + public var url: String { + "/api/fnlttXbrl.xml" + } + public var method: Method { .get } + public var header: [String : String?] { + [:] + } + public var body: [String: Any] { + return [ + "crtfc_key": openApiKey, + "rcept_no": receiptNo, + "reprt_code": reportCode.rawValue, + ] + } + public var result: KResult? = nil + + + public let openApiKey: String + public let receiptNo: String + public let reportCode: ReportCode + + public init(openApiKey: String, receiptNo: String, reportCode: ReportCode) { + self.openApiKey = openApiKey + self.receiptNo = receiptNo + self.reportCode = reportCode + } + } + + + /// 상장기업 재무정보 - 4 단일회사 전체 재무제표 + /// + public struct SingleAccountAllFinancialStatementRequest: DartRequest { + public typealias KResult = SingleAccountAllFinancialStatementResult + + public var url: String { + "/api/fnlttSinglAcntAll.json" + } + public var method: Method { .get } + public var header: [String : String?] { + [:] + } + public var body: [String: Any] { + return [ + "crtfc_key": openApiKey, + "corp_code": corporationCode, + "bsns_year": businessYear, + "reprt_code": reportCode.rawValue, + "fs_div": financialStatementDivision.rawValue + ] + } + public var result: KResult? = nil + + + public let openApiKey: String + let corporationCode: String + let businessYear: String + let reportCode: ReportCode + let financialStatementDivision: FinancialStatementDivision + + public init(openApiKey: String, corporationCode: String, businessYear: String, reportCode: ReportCode, financialStatementDivision: FinancialStatementDivision) { + self.openApiKey = openApiKey + self.corporationCode = corporationCode + self.businessYear = businessYear + self.reportCode = reportCode + self.financialStatementDivision = financialStatementDivision + } + } + + + /// 상장기업 재무정보 - 5 XBRL택사노미재무제표양식 + /// + public struct XBRLTaxonomyRequest: DartRequest { + public typealias KResult = XBRLTaxonomyResult + + public var url: String { + "/api/xbrlTaxonomy.json" + } + public var method: Method { .get } + public var header: [String : String?] { + [:] + } + public var body: [String: Any] { + return [ + "crtfc_key": openApiKey, + "sj_div": statementDivision.rawValue, + ] + } + public var result: KResult? = nil + + + public let openApiKey: String + let statementDivision: StatementDivision + + init(openApiKey: String, statementDivision: StatementDivision) { + self.openApiKey = openApiKey + self.statementDivision = statementDivision + } + } +} + + +extension DomesticDart { + + public struct AccountResult: Codable { + public let result: Result + + public struct Result: Codable { + public let status: String + public let message: String + public let list: [Item] + + private enum CodingKeys: String, CodingKey { + case status + case message + case list + } + } + + public struct Item: Codable { + /// 접수번호 + public let receiptNo: String + /// 사업연도 + public let businessYear: String + /// 종목코드 + public let productNo: String + /// 보고서 코드 + public let reportCode: ReportCode + /// 계정명 + public let accountName: String + /// 개별/연결구분 + public let financialStatementDivision: String + /// 개별/연결명 + public let financialStatementName: String + /// 재무제표구분 + public let statementDivision: StatementDivision + /// 재무제표명 + public let statementName: String + /// 당기명 + public let thisTermName: String + /// 당기일자 + public let thisTermDate: String + /// 당기금액 + public let thisTermAmount: String + /// 당기누적금액 + public let thisTermAccumulatedAmount: String + /// 전기명 + public let formerTermName: String + /// 전기일자 + public let formerTermDate: String + /// 전기금액 + public let formerTermAmount: String + /// 전기누적금액 + public let formerTermAccumulatedAmount: String + /// 전전기명 + public let beforeFormerTermName: String + /// 전전기일자 + public let beforeFormerTermDate: String + /// 전전기금액 + public let beforeFormerTermAmount: String + /// 계정과목 정렬순서 + public let order: String + /// 통화 단위 + public let currency: String + + private enum CodingKeys: String, CodingKey { + case receiptNo = "rcept_no" + case businessYear = "bsns_year" + case productNo = "stock_code" + case reportCode = "reprt_code" + case accountName = "account_nm" + case financialStatementDivision = "fs_div" + case financialStatementName = "fs_nm" + case statementDivision = "sj_div" + case statementName = "sj_nm" + case thisTermName = "thstrm_nm" + case thisTermDate = "thstrm_dt" + case thisTermAmount = "thstrm_amount" + case thisTermAccumulatedAmount = "thstrm_add_amount" + case formerTermName = "frmtrm_nm" + case formerTermDate = "frmtrm_dt" + case formerTermAmount = "frmtrm_amount" + case formerTermAccumulatedAmount = "frmtrm_add_amount" + case beforeFormerTermName = "bfefrmtrm_nm" + case beforeFormerTermDate = "bfefrmtrm_dt" + case beforeFormerTermAmount = "bfefrmtrm_amount" + case order = "ord" + case currency = "currency" + } + } + } + + + public struct SingleAccountAllFinancialStatementResult: Codable { + public let result: Result + + public struct Result: Codable { + public let status: String + public let message: String + public let list: [Item] + + private enum CodingKeys: String, CodingKey { + case status + case message + case list + } + } + + public struct Item: Codable { + /// 접수번호 + public let receiptNo: String + /// 보고서 코드 + public let reportCode: ReportCode + /// 사업연도 + public let businessYear: String + /// 고유번호 + public let corporationCode: String + /// 재무제표구분 + public let statementDivision: StatementDivision + /// 재무제표명 + public let statementName: String + /// 계정ID + public let accountId: String + /// 계정명 + public let accountName: String + /// 계정상세 + public let accountDetail: String + /// 당기명 + public let thisTermName: String + /// 당기금액 + public let thisTermAmount: String + /// 당기누적금액 + public let thisTermAccumulatedAmount: String + /// 전기명 + public let formerTermName: String + /// 전기금액 + public let formerTermAmount: String + /// 전기명(분/반기) + public let formerTermQuaterName: String + /// 전기금액(분/반기) + public let formerTermQuaterAmount: String + /// 전기누적금액 + public let formerTermAccumulatedAmount: String + /// 전전기명 + public let beforeFormerTermName: String + /// 전전기금액 + public let beforeFormerTermAmount: String + /// 계정과목 정렬순서 + public let order: String + /// 통화 단위 + public let currency: String + + private enum CodingKeys: String, CodingKey { + case receiptNo = "rcept_no" + case reportCode = "reprt_code" + case businessYear = "bsns_year" + case corporationCode = "corp_code" + case statementDivision = "sj_div" + case statementName = "sj_nm" + case accountId = "account_id" + case accountName = "account_nm" + case accountDetail = "account_detail" + case thisTermName = "thstrm_nm" + case thisTermAmount = "thstrm_amount" + case thisTermAccumulatedAmount = "thstrm_add_amount" + case formerTermName = "frmtrm_nm" + case formerTermAmount = "frmtrm_amount" + case formerTermQuaterName = "frmtrm_q_nm" + case formerTermQuaterAmount = "frmtrm_q_amount" + case formerTermAccumulatedAmount = "frmtrm_add_amount" + case beforeFormerTermName = "bfefrmtrm_nm" + case beforeFormerTermAmount = "bfefrmtrm_amount" + case order = "ord" + case currency = "currency" + } + } + } + + + public struct XBRLTaxonomyResult: Codable { + public let result: Result + + public struct Result: Codable { + public let status: String + public let message: String + public let list: [Item] + + private enum CodingKeys: String, CodingKey { + case status + case message + case list + } + } + + public struct Item: Codable { + /// 재무제표구분 + public let statementDivision: StatementDivision + /// 계정ID + public let accountId: String + /// 계정명 + public let accountName: String + /// 기준일 + public let businessDate: String + /// 한글 출력명 + public let labelKorean: String + /// 영문 출력명 + public let labelEnglish: String + /// 데이터 유형 + public let dataType: String + /// IFRS Reference + public let ifrsReference: String + + private enum CodingKeys: String, CodingKey { + case statementDivision = "sj_div" + case accountId = "account_id" + case accountName = "account_nm" + case businessDate = "bsns_de" + case labelKorean = "label_kor" + case labelEnglish = "label_eng" + case dataType = "data_tp" + case ifrsReference = "ifrs_ref" + } + } + } +} diff --git a/KissMe/Sources/Domestic/DART/DomesticDartNotice.swift b/KissMe/Sources/Domestic/DART/DomesticDartNotice.swift index 231c06f..362b3fc 100644 --- a/KissMe/Sources/Domestic/DART/DomesticDartNotice.swift +++ b/KissMe/Sources/Domestic/DART/DomesticDartNotice.swift @@ -10,7 +10,7 @@ import Foundation extension DomesticDart { - /// 공시정보 - 공시검색 + /// 공시정보 - 1 공시검색 /// public struct NoticeListRequest: DartRequest { public typealias KResult = NoticeListResult @@ -62,7 +62,7 @@ extension DomesticDart { } - /// 공시정보 - 기업개황 + /// 공시정보 - 2 기업개황 /// public struct CompanyRequest: DartRequest { public typealias KResult = CompanyResult @@ -94,7 +94,7 @@ extension DomesticDart { } - /// 공시정보 - 공시서류원본파일 + /// 공시정보 - 3 공시서류원본파일 /// public struct DocumentRequest: DartRequest { public typealias KResult = Data @@ -126,7 +126,7 @@ extension DomesticDart { } - /// 공시정보 - 고유번호 + /// 공시정보 - 4 고유번호 /// public struct CorporationCodesRequest: DartRequest { public typealias KResult = CorporationCodesResult @@ -230,7 +230,7 @@ extension DomesticDart { /// 종목명(상장사) 또는 약식명칭(기타법인) public let stockName: String /// 상장회사인 경우 주식의 종목코드 - public let productCode: String + public let productNo: String /// 대표자명 public let ceoName: String /// 법인구분 @@ -263,7 +263,7 @@ extension DomesticDart { case corporationName = "corp_name" case englishCorporationName = "corp_name_eng" case stockName = "stock_name" - case productCode = "stock_code" + case productNo = "stock_code" case ceoName = "ceo_nm" case marketType = "corp_cls" case corporationNo = "jurir_no" @@ -302,14 +302,14 @@ extension DomesticDart { /// 정식명칭 public let corporationName: String /// 종목코드 - public let productCode: String + public let productNo: String /// 최종변경일자 public let modifyDate: String private enum CodingKeys: String, CodingKey { case corporationCode = "corp_code" case corporationName = "corp_name" - case productCode = "stock_code" + case productNo = "stock_code" case modifyDate = "modify_date" } } diff --git a/bin/data b/bin/data index b0a2e70..18519a3 160000 --- a/bin/data +++ b/bin/data @@ -1 +1 @@ -Subproject commit b0a2e701b71de0d5bbdf5588116c5531879a4a9e +Subproject commit 18519a34fd921f74211813ee8aab1a00cc11149c diff --git a/projects/macos/KissMe.xcodeproj/project.pbxproj b/projects/macos/KissMe.xcodeproj/project.pbxproj index 838d66e..e9c8dff 100644 --- a/projects/macos/KissMe.xcodeproj/project.pbxproj +++ b/projects/macos/KissMe.xcodeproj/project.pbxproj @@ -43,6 +43,7 @@ 34C1BA4F2A5A603F00423D64 /* DomesticExtra.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C1BA4E2A5A603F00423D64 /* DomesticExtra.swift */; }; 34C1BA512A5A607D00423D64 /* DomesticDart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C1BA502A5A607D00423D64 /* DomesticDart.swift */; }; 34C1BA532A5A683D00423D64 /* DomesticDartBusinessReport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C1BA522A5A683D00423D64 /* DomesticDartBusinessReport.swift */; }; + 34C1BA552A5B033E00423D64 /* DomesticDartListedCompany.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C1BA542A5B033E00423D64 /* DomesticDartListedCompany.swift */; }; 34D3680F2A2AA0BE005E6756 /* PropertyIterable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D3680E2A2AA0BE005E6756 /* PropertyIterable.swift */; }; 34E7B9112A49BD2800B3AB9F /* DomesticIndex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34E7B9102A49BD2800B3AB9F /* DomesticIndex.swift */; }; 34F1900C2A41982A0068C697 /* KissIndexResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F1900B2A41982A0068C697 /* KissIndexResult.swift */; }; @@ -98,6 +99,7 @@ 34C1BA4E2A5A603F00423D64 /* DomesticExtra.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DomesticExtra.swift; sourceTree = ""; }; 34C1BA502A5A607D00423D64 /* DomesticDart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DomesticDart.swift; sourceTree = ""; }; 34C1BA522A5A683D00423D64 /* DomesticDartBusinessReport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DomesticDartBusinessReport.swift; sourceTree = ""; }; + 34C1BA542A5B033E00423D64 /* DomesticDartListedCompany.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DomesticDartListedCompany.swift; sourceTree = ""; }; 34D3680E2A2AA0BE005E6756 /* PropertyIterable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PropertyIterable.swift; sourceTree = ""; }; 34E7B9102A49BD2800B3AB9F /* DomesticIndex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DomesticIndex.swift; sourceTree = ""; }; 34F1900B2A41982A0068C697 /* KissIndexResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KissIndexResult.swift; sourceTree = ""; }; @@ -237,6 +239,7 @@ 34C1BA502A5A607D00423D64 /* DomesticDart.swift */, 34C1BA4C2A59CD3400423D64 /* DomesticDartNotice.swift */, 34C1BA522A5A683D00423D64 /* DomesticDartBusinessReport.swift */, + 34C1BA542A5B033E00423D64 /* DomesticDartListedCompany.swift */, ); path = DART; sourceTree = ""; @@ -388,6 +391,7 @@ 340A4DCE2A4EA5D8005A1FBA /* Runner.swift in Sources */, 341F5F0B2A15115400962D48 /* KissShop.swift in Sources */, 3435A7F72A35D82000D604F1 /* DomesticShortSelling.swift in Sources */, + 34C1BA552A5B033E00423D64 /* DomesticDartListedCompany.swift in Sources */, 341F5F072A14634F00962D48 /* Foundation+Extensions.swift in Sources */, 341F5F032A11A2BC00962D48 /* Credential.swift in Sources */, 341F5EB02A0A80EC00962D48 /* KissMe.docc in Sources */,