use serde::{Deserialize, Serialize};
use crate::{
codecs::NumericString,
types::{CurrencyCode, Date, Isin, Ticker},
};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct BulkStockRating {
pub symbol: Ticker,
pub date: Date,
pub rating: String,
pub discounted_cash_flow_score: Option<NumericString>,
pub return_on_equity_score: Option<NumericString>,
pub return_on_assets_score: Option<NumericString>,
pub debt_to_equity_score: Option<NumericString>,
pub price_to_earnings_score: Option<NumericString>,
pub price_to_book_score: Option<NumericString>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct BulkDcfValuation {
pub symbol: Ticker,
pub date: Date,
pub dcf: Option<NumericString>,
#[serde(rename = "Stock Price")]
pub stock_price: Option<NumericString>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct BulkFinancialScore {
pub symbol: Ticker,
#[serde(deserialize_with = "crate::codecs::empty_or_null::deserialize")]
pub reported_currency: Option<CurrencyCode>,
pub altman_z_score: Option<NumericString>,
pub piotroski_score: Option<NumericString>,
pub working_capital: Option<NumericString>,
pub total_assets: Option<NumericString>,
pub retained_earnings: Option<NumericString>,
pub ebit: Option<NumericString>,
pub market_cap: Option<NumericString>,
pub total_liabilities: Option<NumericString>,
pub revenue: Option<NumericString>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct BulkPriceTargetSummary {
pub symbol: Ticker,
pub last_month_count: Option<NumericString>,
pub last_month_avg_price_target: Option<NumericString>,
pub last_quarter_count: Option<NumericString>,
pub last_quarter_avg_price_target: Option<NumericString>,
pub last_year_count: Option<NumericString>,
pub last_year_avg_price_target: Option<NumericString>,
pub all_time_count: Option<NumericString>,
pub all_time_avg_price_target: Option<NumericString>,
pub publishers: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct BulkEtfHolding {
pub symbol: Ticker,
pub name: String,
pub shares_number: Option<NumericString>,
#[serde(deserialize_with = "crate::codecs::empty_or_null::deserialize")]
pub asset: Option<Ticker>,
pub weight_percentage: Option<NumericString>,
pub cusip: String,
#[serde(deserialize_with = "crate::codecs::empty_or_null::deserialize")]
pub isin: Option<Isin>,
pub market_value: Option<NumericString>,
pub last_updated: Date,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
#[serde(rename_all = "camelCase")]
pub struct BulkUpgradesDowngradesConsensus {
pub symbol: String,
pub strong_buy: Option<NumericString>,
pub buy: Option<NumericString>,
pub hold: Option<NumericString>,
pub sell: Option<NumericString>,
pub strong_sell: Option<NumericString>,
pub consensus: String,
}