use anyhow::Result;
use rust_decimal::Decimal;
use sqlx::{PgPool, Row};
use uuid::Uuid;
use backbone_orm::{company_scope, org_scope};
use crate::domain::entity::MaintenanceVisitPart;
pub const TABLE_NAME: &str = "maintenance.maintenance_visit_parts";
pub struct MaintenanceVisitPartRepository(
backbone_orm::GenericCrudRepository<MaintenanceVisitPart, backbone_orm::SoftDelete>,
);
impl std::ops::Deref for MaintenanceVisitPartRepository {
type Target = backbone_orm::GenericCrudRepository<MaintenanceVisitPart, backbone_orm::SoftDelete>;
fn deref(&self) -> &Self::Target { &self.0 }
}
impl MaintenanceVisitPartRepository {
pub fn new(pool: PgPool) -> Self {
Self(backbone_orm::GenericCrudRepository::new(pool, TABLE_NAME))
}
}
pub struct VisitPartRow {
pub id: Uuid,
pub item_id: Uuid,
pub quantity: Decimal,
}
impl MaintenanceVisitPartRepository {
pub async fn insert_part(
&self,
pool: &PgPool,
id: Uuid,
visit_id: Uuid,
item_id: Uuid,
quantity: Decimal,
) -> Result<(), sqlx::Error> {
org_scope::execute_scoped(
pool,
sqlx::query(
r#"INSERT INTO maintenance.maintenance_visit_parts
(id, visit_id, item_id, quantity, unit_cost, amount)
VALUES ($1,$2,$3,$4,0,0)"#,
)
.bind(id).bind(visit_id).bind(item_id).bind(quantity),
)
.await?;
Ok(())
}
pub async fn list_for_visit(
&self,
pool: &PgPool,
visit_id: Uuid,
) -> Result<Vec<VisitPartRow>, sqlx::Error> {
let rows = company_scope::fetch_all_rows_scoped(
pool,
sqlx::query(
"SELECT id, item_id, quantity FROM maintenance.maintenance_visit_parts WHERE visit_id=$1",
)
.bind(visit_id),
)
.await?;
Ok(rows
.iter()
.map(|r| VisitPartRow {
id: r.get("id"), item_id: r.get("item_id"), quantity: r.get("quantity"),
})
.collect())
}
pub async fn set_valuation(
&self,
pool: &PgPool,
visit_id: Uuid,
item_id: Uuid,
unit_cost: Decimal,
amount: Decimal,
) -> Result<(), sqlx::Error> {
org_scope::execute_scoped(
pool,
sqlx::query(
r#"UPDATE maintenance.maintenance_visit_parts SET unit_cost=$3, amount=$4
WHERE visit_id=$1 AND item_id=$2"#,
)
.bind(visit_id).bind(item_id).bind(unit_cost).bind(amount),
)
.await?;
Ok(())
}
}
backbone_core::impl_crud_repository!(MaintenanceVisitPartRepository, MaintenanceVisitPart, soft_delete);