use std::path::Path;
use crate::datasets::sec::error::Result;
use crate::datasets::sec::parsers::form144::Form144;
use super::super::identity::Identities;
use super::super::provenance::Provenance;
use super::super::sinks::{write_info_row, Sinks};
use super::super::util::{
accession_from_path, format_float, person_nid_from_cik, strip_leading_zeros,
};
use super::FormReport;
pub(crate) fn emit_form144(
parsed: &Form144,
path: &Path,
sinks: &mut Sinks,
identities: &mut Identities,
extracted_at: &str,
report: &mut FormReport,
) -> Result<()> {
{
let issuer_cik = strip_leading_zeros(&parsed.issuer_cik);
let filer_cik = strip_leading_zeros(&parsed.filer_cik);
let person_nid = person_nid_from_cik(&filer_cik);
let accession = accession_from_path(path).unwrap_or_default();
let document = path
.file_name()
.and_then(|n| n.to_str())
.unwrap_or("")
.to_string();
let prov_base =
Provenance::for_filing("144", &accession, &filer_cik, &document, extracted_at);
identities.ensure_person(sinks, &person_nid, &parsed.filer_name, &filer_cik)?;
for (i, p) in parsed.planned_sales.iter().enumerate() {
let prov = prov_base.clone().with_lot(i);
let nid = format!("{}-plan-{}", accession, i);
write_info_row(
&mut sinks.planned_sale,
&[
nid.as_str(),
person_nid.as_str(),
issuer_cik.as_str(),
p.security_class.as_str(),
&format_float(p.shares),
p.approx_sale_date.as_str(),
parsed.broker_name.as_str(),
&format_float(parsed.aggregate_market_value),
"", parsed.securities_acquired_date.as_str(),
parsed.nature_of_acquisition.as_str(),
],
&prov,
)?;
report.rows_written += 1;
}
for (i, h) in parsed.historical_sales.iter().enumerate() {
let prov = prov_base.clone().with_lot(parsed.planned_sales.len() + i);
let nid = format!("{}-hist-{}", accession, i);
write_info_row(
&mut sinks.insider_transaction,
&[
nid.as_str(),
person_nid.as_str(),
issuer_cik.as_str(),
"sale", h.security_class.as_str(),
h.sale_date.as_str(),
"S", &format_float(h.shares),
"", &format_float(h.gross_proceeds),
"",
"0",
"",
"",
],
&prov,
)?;
report.rows_written += 1;
}
}
Ok(())
}