use crate::{
commands::{Cli, Config, Result, current_job},
entities::NaiveDate,
jobber::{JobberCreate, JobberDelete, JobberGet},
print_tip,
};
use clap::Parser;
use color_print::cprintln;
use inquire::Confirm;
#[derive(Parser, Debug)]
pub(crate) struct CreateInvoice {
job_id: Option<usize>,
#[clap(short, long)]
subject: Option<String>,
until: Option<NaiveDate>,
}
impl CreateInvoice {
pub(crate) fn run(&self, cli: &Cli) -> Result<()> {
let config = Config::load()?;
let mut database = cli.open_database()?;
let job_id = if let Some(job_id) = &self.job_id {
*job_id
} else {
current_job(&config, &database)?
};
let invoice_no =
database.create_invoice([job_id].into_iter(), self.subject.clone(), self.until)?;
cprintln!("Successfully created invoice <s>{invoice_no}</> of job <s>{job_id}</>.",);
if database.get_job(job_id)?.work.is_empty() {
match Confirm::new(
"This job is empty now. Do you want to deleted it or continue later?",
)
.with_default(config.delete_empty_job_after_export)
.with_help_message("cancel invoice creation with ESC")
.prompt_skippable()?
{
Some(true) => {
database.delete_job(job_id, true)?;
cprintln!("Job {job_id} has been deleted.");
print_tip!(cli);
print_tip!(
cli,
"You may restore it with <s>jobber restore job {}</> at anytime.",
job_id
);
}
Some(false) => {
print_tip!(cli);
print_tip!(cli, "Job {} remains empty.", job_id);
print_tip!(
cli,
"Just continue your work with <s>jobber start -j{}</> at anytime.",
job_id
)
}
None => {
cprintln!("Database remained unchanged.");
return Ok(());
}
}
} else {
print_tip!(cli);
}
cli.close_database(database)?;
print_tip!(
cli,
"Use <s>jobber show invoice {}</> to take a look.",
invoice_no
);
print_tip!(
cli,
"Use <s>jobber export invoice {}</> to create a PDF from that invoice.",
invoice_no
);
Ok(())
}
}