use crate::cells::{push_identity, push_money};
use crate::error::FormsError;
use crate::map::ScheduleCMap;
use crate::pdf;
use crate::verify::{verify_flat, FlatPlacement};
use btctax_core::tax::packet::ReturnHeader;
use btctax_core::tax::printed::ScheduleCLines;
use btctax_core::Usd;
const SCHEDULE_C_CLUSTERS: &[(f32, f32)] = &[(475.0, 576.0)];
const COL_AMOUNT: usize = 0;
pub fn fill_schedule_c_with_map(
lines: &ScheduleCLines,
header: &ReturnHeader,
map: &ScheduleCMap,
) -> Result<Vec<u8>, FormsError> {
let mut writes: Vec<(String, pdf::FieldValue)> = Vec::new();
let mut placements: Vec<FlatPlacement> = Vec::new();
let plan: [Usd; 7] = [
lines.line1, lines.line3, lines.line5, lines.line7, lines.line28, lines.line29, lines.line31, ];
for (ord, (cell, value)) in map.lines().iter().zip(plan).enumerate() {
push_money(
&mut writes,
&mut placements,
cell,
value,
COL_AMOUNT,
Some((0, ord as u32)),
);
}
let mut doc = pdf::load(pdf::schedule_c_pdf(map.year)?)?;
let blank_fields = pdf::collect_fields(&doc)?;
let proprietor = header.proprietor.as_ref().ok_or_else(|| {
FormsError::Geometry(
"Schedule C has no proprietor — the return names no one to file the business under"
.into(),
)
})?;
push_identity(
&mut writes,
&mut placements,
&map.identity,
&proprietor.full_name(),
&proprietor.ssn,
&blank_fields,
)?;
for (fqn, value) in [
(&map.line_a_business, lines.line_a_business.as_str()),
(&map.line_b_naics, lines.line_b_naics.as_str()),
] {
if !value.is_empty() {
writes.push((fqn.clone(), pdf::FieldValue::Text(value.to_string())));
placements.push(FlatPlacement::free(fqn.clone(), crate::cells::page_of(fqn)));
}
}
let method = if lines.line_f_accrual {
&map.method_accrual
} else {
&map.method_cash
};
writes.push((
method.field.clone(),
pdf::FieldValue::Check {
on: method.on.clone(),
},
));
placements.push(FlatPlacement::check(
method.field.clone(),
crate::cells::page_of(&method.field),
));
let index = pdf::index(&blank_fields);
pdf::drop_xfa_and_set_needappearances(&mut doc)?;
pdf::apply_writes(&mut doc, &index, &writes)?;
pdf::strip_nondeterminism(&mut doc);
let bytes = pdf::save(&mut doc)?;
let check = pdf::load(&bytes)?;
let fields = pdf::collect_fields(&check)?;
verify_flat(&check, &fields, &placements, SCHEDULE_C_CLUSTERS)?;
Ok(bytes)
}