use chrono::NaiveDateTime; use diesel::prelude::*; use juniper_codegen::{GraphQLInputObject, GraphQLObject}; use crate::models::{CompanyInfo, Customer, Task}; use crate::schema::invoices; use crate::DbConn; /// The invoice model. /// /// This model represents an invoice for a customer that contains billed tasks and through the /// tasks the registered time. #[derive(AsChangeset, Associations, Debug, GraphQLObject, Identifiable, Queryable)] #[belongs_to(CompanyInfo)] #[belongs_to(Customer)] #[table_name = "invoices"] pub struct Invoice { /// The unique identification number pub id: i32, /// The ID of the company info at the time of billing pub company_info_id: i32, /// The ID of associated customer pub customer_id: i32, /// Flag whether the invoice should include a time specification pub include_specification: bool, /// The invoice number pub number: i32, /// Flag whether the invoice has been paid pub paid: bool, /// The time of creation pub created_at: NaiveDateTime, /// The time of last update pub updated_at: NaiveDateTime, } impl Invoice { /// Returns the associated company info at the time of billing. pub fn company_info(&self, conn: &DbConn) -> QueryResult { use diesel::associations::HasTable; CompanyInfo::table() .find(self.company_info_id) .first(&**conn) } /// Returns the associated customer. pub fn customer(&self, conn: &DbConn) -> QueryResult { use diesel::associations::HasTable; Customer::table().find(self.customer_id).first(&**conn) } /// Returns the billed tasks included in the invoice. pub fn tasks(&self, conn: &DbConn) -> QueryResult> { Task::belonging_to(self).load(&**conn) } } /// The new invoice model. /// /// This model represents an new invoice for a customer that can be inserted into the database. #[derive(Debug, GraphQLInputObject, Insertable)] #[table_name = "invoices"] pub struct NewInvoice { /// The ID of the company info at the time of billing pub company_info_id: i32, /// The ID of associated customer pub customer_id: i32, /// Flag whether the invoice should include a time specification pub include_specification: bool, /// The invoice number pub number: i32, /// Flag whether the invoice has been paid pub paid: bool, }