jobber 1.1.5-alpha

Minimalistic console work time tracker
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;

/// Create a new tag
#[derive(Parser, Debug)]
pub(crate) struct CreateInvoice {
    /// job's identifier
    job_id: Option<usize>,
    /// Overall invoice subject
    #[clap(short, long)]
    subject: Option<String>,
    /// Bill until this date
    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(true)
            .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(())
    }
}