use super::MOD_PATH;
use serde::{Deserialize, Serialize};
use crate::common::attachment::AttachmentRefOrValue;
use crate::common::money::Money;
use crate::common::related_party::RelatedParty;
use crate::{DateTime, HasAttachment, HasId, HasLastUpdate, TimePeriod, Uri};
use tmflib_derive::{HasId, HasLastUpdate};
const CLASS_PATH: &str = "customer_bill";
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub enum CustomerBillRunType {
#[default]
OnCycle,
OffCycle,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub enum CustomerBillStateType {
#[default]
New,
OnHold,
Validated,
Sent,
Settled,
PartialPaid,
}
#[derive(Clone, Debug, Default, Deserialize, HasId, HasLastUpdate, Serialize)]
pub struct CustomerBill {
amount_due: Option<Money>,
bill_date: Option<DateTime>,
bill_no: String,
billing_period: TimePeriod,
category: String,
pub href: Option<Uri>,
pub id: Option<String>,
pub last_update: Option<DateTime>,
next_bill_date: DateTime,
payment_due_date: DateTime,
remaining_amount: Money,
run_type: CustomerBillRunType,
state: Option<CustomerBillStateType>,
tax_excluded_amount: Money,
tax_included_amount: Money,
pub related_party: Option<Vec<RelatedParty>>,
pub bill_document: Option<Vec<AttachmentRefOrValue>>,
}
impl CustomerBill {
pub fn new() -> CustomerBill {
let mut bill = CustomerBill::create();
bill.state = Some(CustomerBillStateType::default());
bill
}
}
impl HasAttachment for CustomerBill {
fn add(&mut self, attachment: &AttachmentRefOrValue) {
match self.bill_document.as_mut() {
Some(v) => {
v.push(attachment.clone());
}
None => {
self.bill_document = Some(vec![attachment.clone()]);
}
}
}
fn position(&self, name: impl Into<String>) -> Option<usize> {
match self.bill_document.as_ref() {
Some(v) => {
let pattern: String = name.into();
v.iter().position(|a| a.name == Some(pattern.clone()))
}
None => None,
}
}
fn find(&self, name: impl Into<String>) -> Option<&AttachmentRefOrValue> {
match self.bill_document.as_ref() {
Some(v) => {
let pattern: String = name.into();
v.iter().find(|a| a.name == Some(pattern.clone()))
}
None => None,
}
}
fn get(&self, position: usize) -> Option<AttachmentRefOrValue> {
match self.bill_document.as_ref() {
Some(v) => v.get(position).cloned(),
None => None,
}
}
fn remove(&mut self, position: usize) -> Option<AttachmentRefOrValue> {
self.bill_document.as_mut().map(|v| v.remove(position))
}
fn attachment(mut self, attachment: AttachmentRefOrValue) -> Self {
self.add(&attachment);
self
}
}