1use serde::{Deserialize, Serialize};
4
5use crate::{AccountingPeriod, TypeOfDocument};
6
7use super::{
8 shared::{
9 deserialize_utils::empty_string_or_null_as_none,
10 traits::{
11 builder::JQuantsBuilder,
12 pagination::{HasPaginationKey, MergePage, Paginatable},
13 },
14 },
15 JQuantsApiClient, JQuantsPlanClient,
16};
17
18#[derive(Clone, Serialize)]
20pub struct FinancialStatementsBuilder {
21 #[serde(skip)]
22 client: JQuantsApiClient,
23
24 #[serde(skip_serializing_if = "Option::is_none")]
26 code: Option<String>,
27 #[serde(skip_serializing_if = "Option::is_none")]
29 date: Option<String>,
30
31 #[serde(skip_serializing_if = "Option::is_none")]
33 pagination_key: Option<String>,
34}
35
36impl JQuantsBuilder<FinancialStatementsResponse> for FinancialStatementsBuilder {
37 async fn send(self) -> Result<FinancialStatementsResponse, crate::JQuantsError> {
38 self.send_ref().await
39 }
40
41 async fn send_ref(&self) -> Result<FinancialStatementsResponse, crate::JQuantsError> {
42 self.client.inner.get("fins/statements", self).await
43 }
44}
45
46impl Paginatable<FinancialStatementsResponse> for FinancialStatementsBuilder {
47 fn pagination_key(mut self, pagination_key: impl Into<String>) -> Self {
48 self.pagination_key = Some(pagination_key.into());
49 self
50 }
51}
52
53impl FinancialStatementsBuilder {
54 pub(crate) fn new(client: JQuantsApiClient) -> Self {
56 Self {
57 client,
58 code: None,
59 date: None,
60 pagination_key: None,
61 }
62 }
63
64 pub fn code(mut self, code: impl Into<String>) -> Self {
66 self.code = Some(code.into());
67 self
68 }
69
70 pub fn date(mut self, date: impl Into<String>) -> Self {
72 self.date = Some(date.into());
73 self
74 }
75}
76
77pub trait FinancialStatementsApi: JQuantsPlanClient {
79 fn get_financial_statements(&self) -> FinancialStatementsBuilder {
83 FinancialStatementsBuilder::new(self.get_api_client().clone())
84 }
85}
86
87#[derive(Debug, Clone, PartialEq, Deserialize)]
91pub struct FinancialStatementsResponse {
92 pub statements: Vec<FinancialStatementItem>,
94 pub pagination_key: Option<String>,
96}
97
98impl HasPaginationKey for FinancialStatementsResponse {
99 fn get_pagination_key(&self) -> Option<&str> {
100 self.pagination_key.as_deref()
101 }
102}
103
104impl MergePage for FinancialStatementsResponse {
105 fn merge_page(
106 page: Result<Vec<Self>, crate::JQuantsError>,
107 ) -> Result<Self, crate::JQuantsError> {
108 let mut page = page?;
109 let mut merged = page.pop().unwrap();
110 for p in page {
111 merged.statements.extend(p.statements);
112 }
113 merged.pagination_key = None;
114
115 Ok(merged)
116 }
117}
118
119#[derive(Debug, Clone, PartialEq, Deserialize)]
121pub struct FinancialStatementItem {
122 #[serde(rename = "DisclosedDate")]
124 pub disclosed_date: String,
125
126 #[serde(rename = "DisclosedTime")]
128 pub disclosed_time: String,
129
130 #[serde(rename = "LocalCode")]
132 pub local_code: String,
133
134 #[serde(rename = "DisclosureNumber")]
136 pub disclosure_number: String,
137
138 #[serde(rename = "TypeOfDocument")]
140 pub type_of_document: TypeOfDocument,
141
142 #[serde(rename = "TypeOfCurrentPeriod")]
144 pub type_of_current_period: AccountingPeriod,
145
146 #[serde(rename = "CurrentPeriodStartDate")]
148 pub current_period_start_date: String,
149
150 #[serde(rename = "CurrentPeriodEndDate")]
152 pub current_period_end_date: String,
153
154 #[serde(rename = "CurrentFiscalYearStartDate")]
156 pub current_fiscal_year_start_date: String,
157
158 #[serde(rename = "CurrentFiscalYearEndDate")]
160 pub current_fiscal_year_end_date: String,
161
162 #[serde(
166 rename = "NextFiscalYearStartDate",
167 deserialize_with = "empty_string_or_null_as_none"
168 )]
169 pub next_fiscal_year_start_date: Option<String>,
170
171 #[serde(
175 rename = "NextFiscalYearEndDate",
176 deserialize_with = "empty_string_or_null_as_none"
177 )]
178 pub next_fiscal_year_end_date: Option<String>,
179
180 #[serde(rename = "NetSales")]
182 pub net_sales: String,
183
184 #[serde(rename = "OperatingProfit")]
186 pub operating_profit: String,
187
188 #[serde(rename = "OrdinaryProfit")]
190 pub ordinary_profit: String,
191
192 #[serde(rename = "Profit")]
194 pub profit: String,
195
196 #[serde(rename = "EarningsPerShare")]
198 pub earnings_per_share: String,
199
200 #[serde(rename = "DilutedEarningsPerShare")]
202 pub diluted_earnings_per_share: String,
203
204 #[serde(rename = "TotalAssets")]
206 pub total_assets: String,
207
208 #[serde(rename = "Equity")]
210 pub equity: String,
211
212 #[serde(rename = "EquityToAssetRatio")]
214 pub equity_to_asset_ratio: String,
215
216 #[serde(rename = "BookValuePerShare")]
218 pub book_value_per_share: String,
219
220 #[serde(rename = "CashFlowsFromOperatingActivities")]
222 pub cash_flows_from_operating_activities: String,
223
224 #[serde(rename = "CashFlowsFromInvestingActivities")]
226 pub cash_flows_from_investing_activities: String,
227
228 #[serde(rename = "CashFlowsFromFinancingActivities")]
230 pub cash_flows_from_financing_activities: String,
231
232 #[serde(rename = "CashAndEquivalents")]
234 pub cash_and_equivalents: String,
235
236 #[serde(rename = "ResultDividendPerShare1stQuarter")]
238 pub result_dividend_per_share_1st_quarter: String,
239
240 #[serde(rename = "ResultDividendPerShare2ndQuarter")]
242 pub result_dividend_per_share_2nd_quarter: String,
243
244 #[serde(rename = "ResultDividendPerShare3rdQuarter")]
246 pub result_dividend_per_share_3rd_quarter: String,
247
248 #[serde(rename = "ResultDividendPerShareFiscalYearEnd")]
250 pub result_dividend_per_share_fiscal_year_end: String,
251
252 #[serde(rename = "ResultDividendPerShareAnnual")]
254 pub result_dividend_per_share_annual: String,
255
256 #[serde(rename = "DistributionsPerUnit(REIT)")]
258 pub distributions_per_unit_reit: String,
259
260 #[serde(rename = "ResultTotalDividendPaidAnnual")]
262 pub result_total_dividend_paid_annual: String,
263
264 #[serde(rename = "ResultPayoutRatioAnnual")]
266 pub result_payout_ratio_annual: String,
267
268 #[serde(rename = "ForecastDividendPerShare1stQuarter")]
270 pub forecast_dividend_per_share_1st_quarter: String,
271
272 #[serde(rename = "ForecastDividendPerShare2ndQuarter")]
274 pub forecast_dividend_per_share_2nd_quarter: String,
275
276 #[serde(rename = "ForecastDividendPerShare3rdQuarter")]
278 pub forecast_dividend_per_share_3rd_quarter: String,
279
280 #[serde(rename = "ForecastDividendPerShareFiscalYearEnd")]
282 pub forecast_dividend_per_share_fiscal_year_end: String,
283
284 #[serde(rename = "ForecastDividendPerShareAnnual")]
286 pub forecast_dividend_per_share_annual: String,
287
288 #[serde(rename = "ForecastDistributionsPerUnit(REIT)")]
290 pub forecast_distributions_per_unit_reit: String,
291
292 #[serde(rename = "ForecastTotalDividendPaidAnnual")]
294 pub forecast_total_dividend_paid_annual: String,
295
296 #[serde(rename = "ForecastPayoutRatioAnnual")]
298 pub forecast_payout_ratio_annual: String,
299
300 #[serde(rename = "NextYearForecastDividendPerShare1stQuarter")]
302 pub next_year_forecast_dividend_per_share_1st_quarter: String,
303
304 #[serde(rename = "NextYearForecastDividendPerShare2ndQuarter")]
306 pub next_year_forecast_dividend_per_share_2nd_quarter: String,
307
308 #[serde(rename = "NextYearForecastDividendPerShare3rdQuarter")]
310 pub next_year_forecast_dividend_per_share_3rd_quarter: String,
311
312 #[serde(rename = "NextYearForecastDividendPerShareFiscalYearEnd")]
314 pub next_year_forecast_dividend_per_share_fiscal_year_end: String,
315
316 #[serde(rename = "NextYearForecastDividendPerShareAnnual")]
318 pub next_year_forecast_dividend_per_share_annual: String,
319
320 #[serde(rename = "NextYearForecastDistributionsPerUnit(REIT)")]
322 pub next_year_forecast_distributions_per_unit_reit: String,
323
324 #[serde(rename = "NextYearForecastPayoutRatioAnnual")]
326 pub next_year_forecast_payout_ratio_annual: String,
327
328 #[serde(rename = "ForecastNetSales2ndQuarter")]
330 pub forecast_net_sales_2nd_quarter: String,
331
332 #[serde(rename = "ForecastOperatingProfit2ndQuarter")]
334 pub forecast_operating_profit_2nd_quarter: String,
335
336 #[serde(rename = "ForecastOrdinaryProfit2ndQuarter")]
338 pub forecast_ordinary_profit_2nd_quarter: String,
339
340 #[serde(rename = "ForecastProfit2ndQuarter")]
342 pub forecast_profit_2nd_quarter: String,
343
344 #[serde(rename = "ForecastEarningsPerShare2ndQuarter")]
346 pub forecast_earnings_per_share_2nd_quarter: String,
347
348 #[serde(rename = "NextYearForecastNetSales2ndQuarter")]
350 pub next_year_forecast_net_sales_2nd_quarter: String,
351
352 #[serde(rename = "NextYearForecastOperatingProfit2ndQuarter")]
354 pub next_year_forecast_operating_profit_2nd_quarter: String,
355
356 #[serde(rename = "NextYearForecastOrdinaryProfit2ndQuarter")]
358 pub next_year_forecast_ordinary_profit_2nd_quarter: String,
359
360 #[serde(rename = "NextYearForecastProfit2ndQuarter")]
362 pub next_year_forecast_profit_2nd_quarter: String,
363
364 #[serde(rename = "NextYearForecastEarningsPerShare2ndQuarter")]
366 pub next_year_forecast_earnings_per_share_2nd_quarter: String,
367
368 #[serde(rename = "ForecastNetSales")]
370 pub forecast_net_sales: String,
371
372 #[serde(rename = "ForecastOperatingProfit")]
374 pub forecast_operating_profit: String,
375
376 #[serde(rename = "ForecastOrdinaryProfit")]
378 pub forecast_ordinary_profit: String,
379
380 #[serde(rename = "ForecastProfit")]
382 pub forecast_profit: String,
383
384 #[serde(rename = "ForecastEarningsPerShare")]
386 pub forecast_earnings_per_share: String,
387
388 #[serde(rename = "NextYearForecastNetSales")]
390 pub next_year_forecast_net_sales: String,
391
392 #[serde(rename = "NextYearForecastOperatingProfit")]
394 pub next_year_forecast_operating_profit: String,
395
396 #[serde(rename = "NextYearForecastOrdinaryProfit")]
398 pub next_year_forecast_ordinary_profit: String,
399
400 #[serde(rename = "NextYearForecastProfit")]
402 pub next_year_forecast_profit: String,
403
404 #[serde(rename = "NextYearForecastEarningsPerShare")]
406 pub next_year_forecast_earnings_per_share: String,
407
408 #[serde(rename = "MaterialChangesInSubsidiaries")]
410 pub material_changes_in_subsidiaries: String,
411
412 #[serde(
414 rename = "SignificantChangesInTheScopeOfConsolidation",
415 deserialize_with = "empty_string_or_null_as_none"
416 )]
417 pub significant_changes_in_the_scope_of_consolidation: Option<String>,
418
419 #[serde(rename = "ChangesBasedOnRevisionsOfAccountingStandard")]
421 pub changes_based_on_revisions_of_accounting_standard: String,
422
423 #[serde(rename = "ChangesOtherThanOnesBasedOnRevisionsOfAccountingStandard")]
425 pub changes_other_than_based_on_revisions_of_accounting_standard: String,
426
427 #[serde(rename = "ChangesInAccountingEstimates")]
429 pub changes_in_accounting_estimates: String,
430
431 #[serde(rename = "RetrospectiveRestatement")]
433 pub retrospective_restatement: String,
434
435 #[serde(
437 rename = "NumberOfIssuedAndOutstandingSharesAtTheEndOfFiscalYearIncludingTreasuryStock"
438 )]
439 pub number_of_issued_and_outstanding_shares_at_the_end_of_fiscal_year_including_treasury_stock:
440 String,
441
442 #[serde(rename = "NumberOfTreasuryStockAtTheEndOfFiscalYear")]
444 pub number_of_treasury_stock_at_the_end_of_fiscal_year: String,
445
446 #[serde(rename = "AverageNumberOfShares")]
448 pub average_number_of_shares: String,
449
450 #[serde(rename = "NonConsolidatedNetSales")]
452 pub non_consolidated_net_sales: String,
453
454 #[serde(rename = "NonConsolidatedOperatingProfit")]
456 pub non_consolidated_operating_profit: String,
457
458 #[serde(rename = "NonConsolidatedOrdinaryProfit")]
460 pub non_consolidated_ordinary_profit: String,
461
462 #[serde(rename = "NonConsolidatedProfit")]
464 pub non_consolidated_profit: String,
465
466 #[serde(rename = "NonConsolidatedEarningsPerShare")]
468 pub non_consolidated_earnings_per_share: String,
469
470 #[serde(rename = "NonConsolidatedTotalAssets")]
472 pub non_consolidated_total_assets: String,
473
474 #[serde(rename = "NonConsolidatedEquity")]
476 pub non_consolidated_equity: String,
477
478 #[serde(rename = "NonConsolidatedEquityToAssetRatio")]
480 pub non_consolidated_equity_to_asset_ratio: String,
481
482 #[serde(rename = "NonConsolidatedBookValuePerShare")]
484 pub non_consolidated_book_value_per_share: String,
485
486 #[serde(rename = "ForecastNonConsolidatedNetSales2ndQuarter")]
488 pub forecast_non_consolidated_net_sales_2nd_quarter: String,
489
490 #[serde(rename = "ForecastNonConsolidatedOperatingProfit2ndQuarter")]
492 pub forecast_non_consolidated_operating_profit_2nd_quarter: String,
493
494 #[serde(rename = "ForecastNonConsolidatedOrdinaryProfit2ndQuarter")]
496 pub forecast_non_consolidated_ordinary_profit_2nd_quarter: String,
497
498 #[serde(rename = "ForecastNonConsolidatedProfit2ndQuarter")]
500 pub forecast_non_consolidated_profit_2nd_quarter: String,
501
502 #[serde(rename = "ForecastNonConsolidatedEarningsPerShare2ndQuarter")]
504 pub forecast_non_consolidated_earnings_per_share_2nd_quarter: String,
505
506 #[serde(rename = "NextYearForecastNonConsolidatedNetSales2ndQuarter")]
508 pub next_year_forecast_non_consolidated_net_sales_2nd_quarter: String,
509
510 #[serde(rename = "NextYearForecastNonConsolidatedOperatingProfit2ndQuarter")]
512 pub next_year_forecast_non_consolidated_operating_profit_2nd_quarter: String,
513
514 #[serde(rename = "NextYearForecastNonConsolidatedOrdinaryProfit2ndQuarter")]
516 pub next_year_forecast_non_consolidated_ordinary_profit_2nd_quarter: String,
517
518 #[serde(rename = "NextYearForecastNonConsolidatedProfit2ndQuarter")]
520 pub next_year_forecast_non_consolidated_profit_2nd_quarter: String,
521
522 #[serde(rename = "NextYearForecastNonConsolidatedEarningsPerShare2ndQuarter")]
524 pub next_year_forecast_non_consolidated_earnings_per_share_2nd_quarter: String,
525
526 #[serde(rename = "ForecastNonConsolidatedNetSales")]
528 pub forecast_non_consolidated_net_sales: String,
529
530 #[serde(rename = "ForecastNonConsolidatedOperatingProfit")]
532 pub forecast_non_consolidated_operating_profit: String,
533
534 #[serde(rename = "ForecastNonConsolidatedOrdinaryProfit")]
536 pub forecast_non_consolidated_ordinary_profit: String,
537
538 #[serde(rename = "ForecastNonConsolidatedProfit")]
540 pub forecast_non_consolidated_profit: String,
541
542 #[serde(rename = "ForecastNonConsolidatedEarningsPerShare")]
544 pub forecast_non_consolidated_earnings_per_share: String,
545
546 #[serde(rename = "NextYearForecastNonConsolidatedNetSales")]
548 pub next_year_forecast_non_consolidated_net_sales: String,
549
550 #[serde(rename = "NextYearForecastNonConsolidatedOperatingProfit")]
552 pub next_year_forecast_non_consolidated_operating_profit: String,
553
554 #[serde(rename = "NextYearForecastNonConsolidatedOrdinaryProfit")]
556 pub next_year_forecast_non_consolidated_ordinary_profit: String,
557
558 #[serde(rename = "NextYearForecastNonConsolidatedProfit")]
560 pub next_year_forecast_non_consolidated_profit: String,
561
562 #[serde(rename = "NextYearForecastNonConsolidatedEarningsPerShare")]
564 pub next_year_forecast_non_consolidated_earnings_per_share: String,
565}
566
567#[cfg(test)]
568mod tests {
569 use super::*;
570
571 #[test]
572 fn test_deserialize_financial_statements_response() {
573 let json_data = r#"
574 {
575 "statements": [
576 {
577 "DisclosedDate": "2023-01-30",
578 "DisclosedTime": "12:00:00",
579 "LocalCode": "86970",
580 "DisclosureNumber": "20230127594871",
581 "TypeOfDocument": "3QFinancialStatements_Consolidated_IFRS",
582 "TypeOfCurrentPeriod": "3Q",
583 "CurrentPeriodStartDate": "2022-04-01",
584 "CurrentPeriodEndDate": "2022-12-31",
585 "CurrentFiscalYearStartDate": "2022-04-01",
586 "CurrentFiscalYearEndDate": "2023-03-31",
587 "NextFiscalYearStartDate": "",
588 "NextFiscalYearEndDate": "",
589 "NetSales": "100529000000",
590 "OperatingProfit": "51765000000",
591 "OrdinaryProfit": "",
592 "Profit": "35175000000",
593 "EarningsPerShare": "66.76",
594 "DilutedEarningsPerShare": "",
595 "TotalAssets": "79205861000000",
596 "Equity": "320021000000",
597 "EquityToAssetRatio": "0.004",
598 "BookValuePerShare": "",
599 "CashFlowsFromOperatingActivities": "",
600 "CashFlowsFromInvestingActivities": "",
601 "CashFlowsFromFinancingActivities": "",
602 "CashAndEquivalents": "91135000000",
603 "ResultDividendPerShare1stQuarter": "",
604 "ResultDividendPerShare2ndQuarter": "26.0",
605 "ResultDividendPerShare3rdQuarter": "",
606 "ResultDividendPerShareFiscalYearEnd": "",
607 "ResultDividendPerShareAnnual": "",
608 "DistributionsPerUnit(REIT)": "",
609 "ResultTotalDividendPaidAnnual": "",
610 "ResultPayoutRatioAnnual": "",
611 "ForecastDividendPerShare1stQuarter": "",
612 "ForecastDividendPerShare2ndQuarter": "",
613 "ForecastDividendPerShare3rdQuarter": "",
614 "ForecastDividendPerShareFiscalYearEnd": "36.0",
615 "ForecastDividendPerShareAnnual": "62.0",
616 "ForecastDistributionsPerUnit(REIT)": "",
617 "ForecastTotalDividendPaidAnnual": "",
618 "ForecastPayoutRatioAnnual": "",
619 "NextYearForecastDividendPerShare1stQuarter": "",
620 "NextYearForecastDividendPerShare2ndQuarter": "",
621 "NextYearForecastDividendPerShare3rdQuarter": "",
622 "NextYearForecastDividendPerShareFiscalYearEnd": "",
623 "NextYearForecastDividendPerShareAnnual": "",
624 "NextYearForecastDistributionsPerUnit(REIT)": "",
625 "NextYearForecastPayoutRatioAnnual": "",
626 "ForecastNetSales2ndQuarter": "",
627 "ForecastOperatingProfit2ndQuarter": "",
628 "ForecastOrdinaryProfit2ndQuarter": "",
629 "ForecastProfit2ndQuarter": "",
630 "ForecastEarningsPerShare2ndQuarter": "",
631 "NextYearForecastNetSales2ndQuarter": "",
632 "NextYearForecastOperatingProfit2ndQuarter": "",
633 "NextYearForecastOrdinaryProfit2ndQuarter": "",
634 "NextYearForecastProfit2ndQuarter": "",
635 "NextYearForecastEarningsPerShare2ndQuarter": "",
636 "ForecastNetSales": "132500000000",
637 "ForecastOperatingProfit": "65500000000",
638 "ForecastOrdinaryProfit": "",
639 "ForecastProfit": "45000000000",
640 "ForecastEarningsPerShare": "85.42",
641 "NextYearForecastNetSales": "",
642 "NextYearForecastOperatingProfit": "",
643 "NextYearForecastOrdinaryProfit": "",
644 "NextYearForecastProfit": "",
645 "NextYearForecastEarningsPerShare": "",
646 "MaterialChangesInSubsidiaries": "false",
647 "SignificantChangesInTheScopeOfConsolidation": "",
648 "ChangesBasedOnRevisionsOfAccountingStandard": "false",
649 "ChangesOtherThanOnesBasedOnRevisionsOfAccountingStandard": "false",
650 "ChangesInAccountingEstimates": "true",
651 "RetrospectiveRestatement": "",
652 "NumberOfIssuedAndOutstandingSharesAtTheEndOfFiscalYearIncludingTreasuryStock": "528578441",
653 "NumberOfTreasuryStockAtTheEndOfFiscalYear": "1861043",
654 "AverageNumberOfShares": "526874759",
655 "NonConsolidatedNetSales": "",
656 "NonConsolidatedOperatingProfit": "",
657 "NonConsolidatedOrdinaryProfit": "",
658 "NonConsolidatedProfit": "",
659 "NonConsolidatedEarningsPerShare": "",
660 "NonConsolidatedTotalAssets": "",
661 "NonConsolidatedEquity": "",
662 "NonConsolidatedEquityToAssetRatio": "",
663 "NonConsolidatedBookValuePerShare": "",
664 "ForecastNonConsolidatedNetSales2ndQuarter": "",
665 "ForecastNonConsolidatedOperatingProfit2ndQuarter": "",
666 "ForecastNonConsolidatedOrdinaryProfit2ndQuarter": "",
667 "ForecastNonConsolidatedProfit2ndQuarter": "",
668 "ForecastNonConsolidatedEarningsPerShare2ndQuarter": "",
669 "NextYearForecastNonConsolidatedNetSales2ndQuarter": "",
670 "NextYearForecastNonConsolidatedOperatingProfit2ndQuarter": "",
671 "NextYearForecastNonConsolidatedOrdinaryProfit2ndQuarter": "",
672 "NextYearForecastNonConsolidatedProfit2ndQuarter": "",
673 "NextYearForecastNonConsolidatedEarningsPerShare2ndQuarter": "",
674 "ForecastNonConsolidatedNetSales": "",
675 "ForecastNonConsolidatedOperatingProfit": "",
676 "ForecastNonConsolidatedOrdinaryProfit": "",
677 "ForecastNonConsolidatedProfit": "",
678 "ForecastNonConsolidatedEarningsPerShare": "",
679 "NextYearForecastNonConsolidatedNetSales": "",
680 "NextYearForecastNonConsolidatedOperatingProfit": "",
681 "NextYearForecastNonConsolidatedOrdinaryProfit": "",
682 "NextYearForecastNonConsolidatedProfit": "",
683 "NextYearForecastNonConsolidatedEarningsPerShare": ""
684 }
685 ],
686 "pagination_key": "value1.value2."
687 }
688 "#;
689
690 let response: FinancialStatementsResponse = serde_json::from_str(json_data).unwrap();
691 let expected_response = FinancialStatementsResponse {
692 statements: vec![FinancialStatementItem {
693 disclosed_date: "2023-01-30".to_string(),
694 disclosed_time: "12:00:00".to_string(),
695 local_code: "86970".to_string(),
696 disclosure_number: "20230127594871".to_string(),
697 type_of_document: TypeOfDocument::Q3FinancialStatementsConsolidatedIFRS,
698 type_of_current_period: AccountingPeriod::Q3,
699 current_period_start_date: "2022-04-01".to_string(),
700 current_period_end_date: "2022-12-31".to_string(),
701 current_fiscal_year_start_date: "2022-04-01".to_string(),
702 current_fiscal_year_end_date: "2023-03-31".to_string(),
703 next_fiscal_year_start_date: None,
704 next_fiscal_year_end_date: None,
705 net_sales: "100529000000".to_string(),
706 operating_profit: "51765000000".to_string(),
707 ordinary_profit: "".to_string(),
708 profit: "35175000000".to_string(),
709 earnings_per_share: "66.76".to_string(),
710 diluted_earnings_per_share: "".to_string(),
711 total_assets: "79205861000000".to_string(),
712 equity: "320021000000".to_string(),
713 equity_to_asset_ratio: "0.004".to_string(),
714 book_value_per_share: "".to_string(),
715 cash_flows_from_operating_activities: "".to_string(),
716 cash_flows_from_investing_activities: "".to_string(),
717 cash_flows_from_financing_activities: "".to_string(),
718 cash_and_equivalents: "91135000000".to_string(),
719 result_dividend_per_share_1st_quarter: "".to_string(),
720 result_dividend_per_share_2nd_quarter: "26.0".to_string(),
721 result_dividend_per_share_3rd_quarter: "".to_string(),
722 result_dividend_per_share_fiscal_year_end: "".to_string(),
723 result_dividend_per_share_annual: "".to_string(),
724 distributions_per_unit_reit: "".to_string(),
725 result_total_dividend_paid_annual: "".to_string(),
726 result_payout_ratio_annual: "".to_string(),
727 forecast_dividend_per_share_1st_quarter: "".to_string(),
728 forecast_dividend_per_share_2nd_quarter: "".to_string(),
729 forecast_dividend_per_share_3rd_quarter: "".to_string(),
730 forecast_dividend_per_share_fiscal_year_end: "36.0".to_string(),
731 forecast_dividend_per_share_annual: "62.0".to_string(),
732 forecast_distributions_per_unit_reit: "".to_string(),
733 forecast_total_dividend_paid_annual: "".to_string(),
734 forecast_payout_ratio_annual: "".to_string(),
735 next_year_forecast_dividend_per_share_1st_quarter: "".to_string(),
736 next_year_forecast_dividend_per_share_2nd_quarter: "".to_string(),
737 next_year_forecast_dividend_per_share_3rd_quarter: "".to_string(),
738 next_year_forecast_dividend_per_share_fiscal_year_end: "".to_string(),
739 next_year_forecast_dividend_per_share_annual: "".to_string(),
740 next_year_forecast_distributions_per_unit_reit: "".to_string(),
741 next_year_forecast_payout_ratio_annual: "".to_string(),
742 forecast_net_sales_2nd_quarter: "".to_string(),
743 forecast_operating_profit_2nd_quarter: "".to_string(),
744 forecast_ordinary_profit_2nd_quarter: "".to_string(),
745 forecast_profit_2nd_quarter: "".to_string(),
746 forecast_earnings_per_share_2nd_quarter: "".to_string(),
747 next_year_forecast_net_sales_2nd_quarter: "".to_string(),
748 next_year_forecast_operating_profit_2nd_quarter: "".to_string(),
749 next_year_forecast_ordinary_profit_2nd_quarter: "".to_string(),
750 next_year_forecast_profit_2nd_quarter: "".to_string(),
751 next_year_forecast_earnings_per_share_2nd_quarter: "".to_string(),
752 forecast_net_sales: "132500000000".to_string(),
753 forecast_operating_profit: "65500000000".to_string(),
754 forecast_ordinary_profit: "".to_string(),
755 forecast_profit: "45000000000".to_string(),
756 forecast_earnings_per_share: "85.42".to_string(),
757 next_year_forecast_net_sales: "".to_string(),
758 next_year_forecast_operating_profit: "".to_string(),
759 next_year_forecast_ordinary_profit: "".to_string(),
760 next_year_forecast_profit: "".to_string(),
761 next_year_forecast_earnings_per_share: "".to_string(),
762 material_changes_in_subsidiaries: "false".to_string(),
763 significant_changes_in_the_scope_of_consolidation: None,
764 changes_based_on_revisions_of_accounting_standard: "false".to_string(),
765 changes_other_than_based_on_revisions_of_accounting_standard: "false".to_string(),
766 changes_in_accounting_estimates: "true".to_string(),
767 retrospective_restatement: "".to_string(),
768 number_of_issued_and_outstanding_shares_at_the_end_of_fiscal_year_including_treasury_stock: "528578441".to_string(),
769 number_of_treasury_stock_at_the_end_of_fiscal_year: "1861043".to_string(),
770 average_number_of_shares: "526874759".to_string(),
771 non_consolidated_net_sales: "".to_string(),
772 non_consolidated_operating_profit: "".to_string(),
773 non_consolidated_ordinary_profit: "".to_string(),
774 non_consolidated_profit: "".to_string(),
775 non_consolidated_earnings_per_share: "".to_string(),
776 non_consolidated_total_assets: "".to_string(),
777 non_consolidated_equity: "".to_string(),
778 non_consolidated_equity_to_asset_ratio: "".to_string(),
779 non_consolidated_book_value_per_share: "".to_string(),
780 forecast_non_consolidated_net_sales_2nd_quarter: "".to_string(),
781 forecast_non_consolidated_operating_profit_2nd_quarter: "".to_string(),
782 forecast_non_consolidated_ordinary_profit_2nd_quarter: "".to_string(),
783 forecast_non_consolidated_profit_2nd_quarter: "".to_string(),
784 forecast_non_consolidated_earnings_per_share_2nd_quarter: "".to_string(),
785 next_year_forecast_non_consolidated_net_sales_2nd_quarter: "".to_string(),
786 next_year_forecast_non_consolidated_operating_profit_2nd_quarter: "".to_string(),
787 next_year_forecast_non_consolidated_ordinary_profit_2nd_quarter: "".to_string(),
788 next_year_forecast_non_consolidated_profit_2nd_quarter: "".to_string(),
789 next_year_forecast_non_consolidated_earnings_per_share_2nd_quarter: "".to_string(),
790 forecast_non_consolidated_net_sales: "".to_string(),
791 forecast_non_consolidated_operating_profit: "".to_string(),
792 forecast_non_consolidated_ordinary_profit: "".to_string(),
793 forecast_non_consolidated_profit: "".to_string(),
794 forecast_non_consolidated_earnings_per_share: "".to_string(),
795 next_year_forecast_non_consolidated_net_sales: "".to_string(),
796 next_year_forecast_non_consolidated_operating_profit: "".to_string(),
797 next_year_forecast_non_consolidated_ordinary_profit: "".to_string(),
798 next_year_forecast_non_consolidated_profit: "".to_string(),
799 next_year_forecast_non_consolidated_earnings_per_share: "".to_string(),
800 }],
801 pagination_key: Some("value1.value2.".to_string()),
802 };
803
804 pretty_assertions::assert_eq!(response, expected_response);
805 }
806
807 #[test]
808 fn test_deserialize_financial_statements_response_no_pagination_key() {
809 let json_data = r#"
810 {
811 "statements": [
812 {
813 "DisclosedDate": "2023-01-30",
814 "DisclosedTime": "12:00:00",
815 "LocalCode": "86970",
816 "DisclosureNumber": "20230127594871",
817 "TypeOfDocument": "3QFinancialStatements_Consolidated_IFRS",
818 "TypeOfCurrentPeriod": "3Q",
819 "CurrentPeriodStartDate": "2022-04-01",
820 "CurrentPeriodEndDate": "2022-12-31",
821 "CurrentFiscalYearStartDate": "2022-04-01",
822 "CurrentFiscalYearEndDate": "2023-03-31",
823 "NextFiscalYearStartDate": "2024-11-01",
824 "NextFiscalYearEndDate": "2024-11-01",
825 "NetSales": "100529000000",
826 "OperatingProfit": "51765000000",
827 "OrdinaryProfit": "",
828 "Profit": "35175000000",
829 "EarningsPerShare": "66.76",
830 "DilutedEarningsPerShare": "",
831 "TotalAssets": "79205861000000",
832 "Equity": "320021000000",
833 "EquityToAssetRatio": "0.004",
834 "BookValuePerShare": "",
835 "CashFlowsFromOperatingActivities": "",
836 "CashFlowsFromInvestingActivities": "",
837 "CashFlowsFromFinancingActivities": "",
838 "CashAndEquivalents": "91135000000",
839 "ResultDividendPerShare1stQuarter": "",
840 "ResultDividendPerShare2ndQuarter": "26.0",
841 "ResultDividendPerShare3rdQuarter": "",
842 "ResultDividendPerShareFiscalYearEnd": "",
843 "ResultDividendPerShareAnnual": "",
844 "DistributionsPerUnit(REIT)": "",
845 "ResultTotalDividendPaidAnnual": "",
846 "ResultPayoutRatioAnnual": "",
847 "ForecastDividendPerShare1stQuarter": "",
848 "ForecastDividendPerShare2ndQuarter": "",
849 "ForecastDividendPerShare3rdQuarter": "",
850 "ForecastDividendPerShareFiscalYearEnd": "36.0",
851 "ForecastDividendPerShareAnnual": "62.0",
852 "ForecastDistributionsPerUnit(REIT)": "",
853 "ForecastTotalDividendPaidAnnual": "",
854 "ForecastPayoutRatioAnnual": "",
855 "NextYearForecastDividendPerShare1stQuarter": "",
856 "NextYearForecastDividendPerShare2ndQuarter": "",
857 "NextYearForecastDividendPerShare3rdQuarter": "",
858 "NextYearForecastDividendPerShareFiscalYearEnd": "",
859 "NextYearForecastDividendPerShareAnnual": "",
860 "NextYearForecastDistributionsPerUnit(REIT)": "",
861 "NextYearForecastPayoutRatioAnnual": "",
862 "ForecastNetSales2ndQuarter": "",
863 "ForecastOperatingProfit2ndQuarter": "",
864 "ForecastOrdinaryProfit2ndQuarter": "",
865 "ForecastProfit2ndQuarter": "",
866 "ForecastEarningsPerShare2ndQuarter": "",
867 "NextYearForecastNetSales2ndQuarter": "",
868 "NextYearForecastOperatingProfit2ndQuarter": "",
869 "NextYearForecastOrdinaryProfit2ndQuarter": "",
870 "NextYearForecastProfit2ndQuarter": "",
871 "NextYearForecastEarningsPerShare2ndQuarter": "",
872 "ForecastNetSales": "132500000000",
873 "ForecastOperatingProfit": "65500000000",
874 "ForecastOrdinaryProfit": "",
875 "ForecastProfit": "45000000000",
876 "ForecastEarningsPerShare": "85.42",
877 "NextYearForecastNetSales": "",
878 "NextYearForecastOperatingProfit": "",
879 "NextYearForecastOrdinaryProfit": "",
880 "NextYearForecastProfit": "",
881 "NextYearForecastEarningsPerShare": "",
882 "MaterialChangesInSubsidiaries": "false",
883 "SignificantChangesInTheScopeOfConsolidation": "2024-11-01",
884 "ChangesBasedOnRevisionsOfAccountingStandard": "false",
885 "ChangesOtherThanOnesBasedOnRevisionsOfAccountingStandard": "false",
886 "ChangesInAccountingEstimates": "true",
887 "RetrospectiveRestatement": "",
888 "NumberOfIssuedAndOutstandingSharesAtTheEndOfFiscalYearIncludingTreasuryStock": "528578441",
889 "NumberOfTreasuryStockAtTheEndOfFiscalYear": "1861043",
890 "AverageNumberOfShares": "526874759",
891 "NonConsolidatedNetSales": "",
892 "NonConsolidatedOperatingProfit": "",
893 "NonConsolidatedOrdinaryProfit": "",
894 "NonConsolidatedProfit": "",
895 "NonConsolidatedEarningsPerShare": "",
896 "NonConsolidatedTotalAssets": "",
897 "NonConsolidatedEquity": "",
898 "NonConsolidatedEquityToAssetRatio": "",
899 "NonConsolidatedBookValuePerShare": "",
900 "ForecastNonConsolidatedNetSales2ndQuarter": "",
901 "ForecastNonConsolidatedOperatingProfit2ndQuarter": "",
902 "ForecastNonConsolidatedOrdinaryProfit2ndQuarter": "",
903 "ForecastNonConsolidatedProfit2ndQuarter": "",
904 "ForecastNonConsolidatedEarningsPerShare2ndQuarter": "",
905 "NextYearForecastNonConsolidatedNetSales2ndQuarter": "",
906 "NextYearForecastNonConsolidatedOperatingProfit2ndQuarter": "",
907 "NextYearForecastNonConsolidatedOrdinaryProfit2ndQuarter": "",
908 "NextYearForecastNonConsolidatedProfit2ndQuarter": "",
909 "NextYearForecastNonConsolidatedEarningsPerShare2ndQuarter": "",
910 "ForecastNonConsolidatedNetSales": "",
911 "ForecastNonConsolidatedOperatingProfit": "",
912 "ForecastNonConsolidatedOrdinaryProfit": "",
913 "ForecastNonConsolidatedProfit": "",
914 "ForecastNonConsolidatedEarningsPerShare": "",
915 "NextYearForecastNonConsolidatedNetSales": "",
916 "NextYearForecastNonConsolidatedOperatingProfit": "",
917 "NextYearForecastNonConsolidatedOrdinaryProfit": "",
918 "NextYearForecastNonConsolidatedProfit": "",
919 "NextYearForecastNonConsolidatedEarningsPerShare": ""
920 }
921 ]
922 }
923 "#;
924
925 let response: FinancialStatementsResponse = serde_json::from_str(json_data).unwrap();
926 let expected_response = FinancialStatementsResponse {
927 statements: vec![FinancialStatementItem {
928 disclosed_date: "2023-01-30".to_string(),
929 disclosed_time: "12:00:00".to_string(),
930 local_code: "86970".to_string(),
931 disclosure_number: "20230127594871".to_string(),
932 type_of_document: TypeOfDocument::Q3FinancialStatementsConsolidatedIFRS,
933 type_of_current_period: AccountingPeriod::Q3,
934 current_period_start_date: "2022-04-01".to_string(),
935 current_period_end_date: "2022-12-31".to_string(),
936 current_fiscal_year_start_date: "2022-04-01".to_string(),
937 current_fiscal_year_end_date: "2023-03-31".to_string(),
938 next_fiscal_year_start_date: Some("2024-11-01".to_string()),
939 next_fiscal_year_end_date: Some("2024-11-01".to_string()),
940 net_sales: "100529000000".to_string(),
941 operating_profit: "51765000000".to_string(),
942 ordinary_profit: "".to_string(),
943 profit: "35175000000".to_string(),
944 earnings_per_share: "66.76".to_string(),
945 diluted_earnings_per_share: "".to_string(),
946 total_assets: "79205861000000".to_string(),
947 equity: "320021000000".to_string(),
948 equity_to_asset_ratio: "0.004".to_string(),
949 book_value_per_share: "".to_string(),
950 cash_flows_from_operating_activities: "".to_string(),
951 cash_flows_from_investing_activities: "".to_string(),
952 cash_flows_from_financing_activities: "".to_string(),
953 cash_and_equivalents: "91135000000".to_string(),
954 result_dividend_per_share_1st_quarter: "".to_string(),
955 result_dividend_per_share_2nd_quarter: "26.0".to_string(),
956 result_dividend_per_share_3rd_quarter: "".to_string(),
957 result_dividend_per_share_fiscal_year_end: "".to_string(),
958 result_dividend_per_share_annual: "".to_string(),
959 distributions_per_unit_reit: "".to_string(),
960 result_total_dividend_paid_annual: "".to_string(),
961 result_payout_ratio_annual: "".to_string(),
962 forecast_dividend_per_share_1st_quarter: "".to_string(),
963 forecast_dividend_per_share_2nd_quarter: "".to_string(),
964 forecast_dividend_per_share_3rd_quarter: "".to_string(),
965 forecast_dividend_per_share_fiscal_year_end: "36.0".to_string(),
966 forecast_dividend_per_share_annual: "62.0".to_string(),
967 forecast_distributions_per_unit_reit: "".to_string(),
968 forecast_total_dividend_paid_annual: "".to_string(),
969 forecast_payout_ratio_annual: "".to_string(),
970 next_year_forecast_dividend_per_share_1st_quarter: "".to_string(),
971 next_year_forecast_dividend_per_share_2nd_quarter: "".to_string(),
972 next_year_forecast_dividend_per_share_3rd_quarter: "".to_string(),
973 next_year_forecast_dividend_per_share_fiscal_year_end: "".to_string(),
974 next_year_forecast_dividend_per_share_annual: "".to_string(),
975 next_year_forecast_distributions_per_unit_reit: "".to_string(),
976 next_year_forecast_payout_ratio_annual: "".to_string(),
977 forecast_net_sales_2nd_quarter: "".to_string(),
978 forecast_operating_profit_2nd_quarter: "".to_string(),
979 forecast_ordinary_profit_2nd_quarter: "".to_string(),
980 forecast_profit_2nd_quarter: "".to_string(),
981 forecast_earnings_per_share_2nd_quarter: "".to_string(),
982 next_year_forecast_net_sales_2nd_quarter: "".to_string(),
983 next_year_forecast_operating_profit_2nd_quarter: "".to_string(),
984 next_year_forecast_ordinary_profit_2nd_quarter: "".to_string(),
985 next_year_forecast_profit_2nd_quarter: "".to_string(),
986 next_year_forecast_earnings_per_share_2nd_quarter: "".to_string(),
987 forecast_net_sales: "132500000000".to_string(),
988 forecast_operating_profit: "65500000000".to_string(),
989 forecast_ordinary_profit: "".to_string(),
990 forecast_profit: "45000000000".to_string(),
991 forecast_earnings_per_share: "85.42".to_string(),
992 next_year_forecast_net_sales: "".to_string(),
993 next_year_forecast_operating_profit: "".to_string(),
994 next_year_forecast_ordinary_profit: "".to_string(),
995 next_year_forecast_profit: "".to_string(),
996 next_year_forecast_earnings_per_share: "".to_string(),
997 material_changes_in_subsidiaries: "false".to_string(),
998 significant_changes_in_the_scope_of_consolidation: Some("2024-11-01".to_string()),
999 changes_based_on_revisions_of_accounting_standard: "false".to_string(),
1000 changes_other_than_based_on_revisions_of_accounting_standard: "false".to_string(),
1001 changes_in_accounting_estimates: "true".to_string(),
1002 retrospective_restatement: "".to_string(),
1003 number_of_issued_and_outstanding_shares_at_the_end_of_fiscal_year_including_treasury_stock: "528578441".to_string(),
1004 number_of_treasury_stock_at_the_end_of_fiscal_year: "1861043".to_string(),
1005 average_number_of_shares: "526874759".to_string(),
1006 non_consolidated_net_sales: "".to_string(),
1007 non_consolidated_operating_profit: "".to_string(),
1008 non_consolidated_ordinary_profit: "".to_string(),
1009 non_consolidated_profit: "".to_string(),
1010 non_consolidated_earnings_per_share: "".to_string(),
1011 non_consolidated_total_assets: "".to_string(),
1012 non_consolidated_equity: "".to_string(),
1013 non_consolidated_equity_to_asset_ratio: "".to_string(),
1014 non_consolidated_book_value_per_share: "".to_string(),
1015 forecast_non_consolidated_net_sales_2nd_quarter: "".to_string(),
1016 forecast_non_consolidated_operating_profit_2nd_quarter: "".to_string(),
1017 forecast_non_consolidated_ordinary_profit_2nd_quarter: "".to_string(),
1018 forecast_non_consolidated_profit_2nd_quarter: "".to_string(),
1019 forecast_non_consolidated_earnings_per_share_2nd_quarter: "".to_string(),
1020 next_year_forecast_non_consolidated_net_sales_2nd_quarter: "".to_string(),
1021 next_year_forecast_non_consolidated_operating_profit_2nd_quarter: "".to_string(),
1022 next_year_forecast_non_consolidated_ordinary_profit_2nd_quarter: "".to_string(),
1023 next_year_forecast_non_consolidated_profit_2nd_quarter: "".to_string(),
1024 next_year_forecast_non_consolidated_earnings_per_share_2nd_quarter: "".to_string(),
1025 forecast_non_consolidated_net_sales: "".to_string(),
1026 forecast_non_consolidated_operating_profit: "".to_string(),
1027 forecast_non_consolidated_ordinary_profit: "".to_string(),
1028 forecast_non_consolidated_profit: "".to_string(),
1029 forecast_non_consolidated_earnings_per_share: "".to_string(),
1030 next_year_forecast_non_consolidated_net_sales: "".to_string(),
1031 next_year_forecast_non_consolidated_operating_profit: "".to_string(),
1032 next_year_forecast_non_consolidated_ordinary_profit: "".to_string(),
1033 next_year_forecast_non_consolidated_profit: "".to_string(),
1034 next_year_forecast_non_consolidated_earnings_per_share: "".to_string(),
1035 }],
1036 pagination_key: None,
1037 };
1038
1039 pretty_assertions::assert_eq!(response, expected_response);
1040 }
1041
1042 #[test]
1043 fn test_deserialize_financial_statements_response_no_data() {
1044 let json_data = r#"
1045 {
1046 "statements": []
1047 }
1048 "#;
1049
1050 let response: FinancialStatementsResponse = serde_json::from_str(json_data).unwrap();
1051 let expected_response = FinancialStatementsResponse {
1052 statements: vec![],
1053 pagination_key: None,
1054 };
1055
1056 pretty_assertions::assert_eq!(response, expected_response);
1057 }
1058}