use crate::cells::{push_identity, push_money};
use crate::error::FormsError;
use crate::map::ScheduleAMap;
use crate::pdf;
use crate::verify::{verify_flat, FlatPlacement};
use btctax_core::tax::packet::ReturnHeader;
use btctax_core::tax::printed::ScheduleALines;
use btctax_core::Usd;
const COL_AGI_INLINE: usize = 0;
const COL_MID: usize = 1;
const COL_AMOUNT: usize = 2;
const SCHEDULE_A_CLUSTERS: &[(f32, f32)] = &[(331.0, 403.0), (417.0, 489.0), (504.0, 576.0)];
pub fn fill_schedule_a_with_map(
lines: &ScheduleALines,
header: &ReturnHeader,
map: &ScheduleAMap,
) -> Result<Vec<u8>, FormsError> {
let mut writes: Vec<(String, pdf::FieldValue)> = Vec::new();
let mut placements: Vec<FlatPlacement> = Vec::new();
let plan: [(Usd, usize); 18] = [
(lines.line1, COL_MID), (lines.line2, COL_AGI_INLINE), (lines.line3, COL_MID), (lines.line4, COL_AMOUNT), (lines.line5a, COL_MID), (lines.line5b, COL_MID), (lines.line5c, COL_MID), (lines.line5d, COL_MID), (lines.line5e, COL_MID), (lines.line7, COL_AMOUNT), (lines.line8a, COL_MID), (lines.line8e, COL_MID), (lines.line10, COL_AMOUNT), (lines.line11, COL_MID), (lines.line12, COL_MID), (lines.line13, COL_MID), (lines.line14, COL_AMOUNT), (lines.line17, COL_AMOUNT), ];
for (ord, (cell, (value, col))) in map.lines().iter().zip(plan).enumerate() {
push_money(
&mut writes,
&mut placements,
cell,
value,
col,
Some((0, ord as u32)),
);
}
let mut doc = pdf::load(pdf::schedule_a_pdf(map.year)?)?;
let blank_fields = pdf::collect_fields(&doc)?;
push_identity(
&mut writes,
&mut placements,
&map.identity,
&header.name_line,
&header.taxpayer.ssn,
&blank_fields,
)?;
for (choice, on) in [
(&map.check_5a_sales_tax, lines.line5a_is_sales_tax),
(&map.check_8_mixed_use, lines.line8_mixed_use_box),
(&map.check_18_elects_smaller, lines.line18_elects_smaller),
] {
if on {
writes.push((
choice.field.clone(),
pdf::FieldValue::Check {
on: choice.on.clone(),
},
));
placements.push(FlatPlacement::check(
choice.field.clone(),
crate::cells::page_of(&choice.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_A_CLUSTERS)?;
Ok(bytes)
}