use serde::{Deserialize, Serialize};
use crate::filters::common::ListFilters;
use crate::filters::credit_note::CreditNoteFilter;
use crate::models::{CreditNoteReason, CreditNoteRefundStatus, PaginationParams};
#[derive(Debug, Clone)]
pub struct ListCreditNotesRequest {
pub pagination: PaginationParams,
pub filters: CreditNoteFilter,
pub search_term: Option<String>,
}
impl ListCreditNotesRequest {
pub fn new() -> Self {
Self {
pagination: PaginationParams::default(),
filters: CreditNoteFilter::default(),
search_term: None,
}
}
pub fn with_pagination(mut self, pagination: PaginationParams) -> Self {
self.pagination = pagination;
self
}
pub fn with_filters(mut self, filters: CreditNoteFilter) -> Self {
self.filters = filters;
self
}
pub fn with_search_term(mut self, term: String) -> Self {
self.search_term = Some(term);
self
}
pub fn to_query_params(&self) -> Vec<(&str, String)> {
let mut params = self.pagination.to_query_params();
params.extend(self.filters.to_query_params());
if let Some(ref term) = self.search_term {
params.push(("search_term", term.clone()));
}
params
}
}
impl Default for ListCreditNotesRequest {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone)]
pub struct GetCreditNoteRequest {
pub lago_id: String,
}
impl GetCreditNoteRequest {
pub fn new(lago_id: String) -> Self {
Self { lago_id }
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateCreditNoteItemInput {
pub fee_id: String,
pub amount_cents: i64,
}
impl CreateCreditNoteItemInput {
pub fn new(fee_id: String, amount_cents: i64) -> Self {
Self {
fee_id,
amount_cents,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateCreditNoteInput {
pub invoice_id: String,
pub reason: CreditNoteReason,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub credit_amount_cents: i64,
pub refund_amount_cents: i64,
pub items: Vec<CreateCreditNoteItemInput>,
}
impl CreateCreditNoteInput {
pub fn new(
invoice_id: String,
reason: CreditNoteReason,
credit_amount_cents: i64,
refund_amount_cents: i64,
items: Vec<CreateCreditNoteItemInput>,
) -> Self {
Self {
invoice_id,
reason,
description: None,
credit_amount_cents,
refund_amount_cents,
items,
}
}
pub fn with_description(mut self, description: String) -> Self {
self.description = Some(description);
self
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateCreditNoteRequest {
pub credit_note: CreateCreditNoteInput,
}
impl CreateCreditNoteRequest {
pub fn new(credit_note: CreateCreditNoteInput) -> Self {
Self { credit_note }
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpdateCreditNoteInput {
#[serde(skip_serializing_if = "Option::is_none")]
pub refund_status: Option<CreditNoteRefundStatus>,
}
impl UpdateCreditNoteInput {
pub fn new() -> Self {
Self {
refund_status: None,
}
}
pub fn with_refund_status(mut self, status: CreditNoteRefundStatus) -> Self {
self.refund_status = Some(status);
self
}
}
impl Default for UpdateCreditNoteInput {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpdateCreditNoteRequest {
#[serde(skip)]
pub lago_id: String,
pub credit_note: UpdateCreditNoteInput,
}
impl UpdateCreditNoteRequest {
pub fn new(lago_id: String, input: UpdateCreditNoteInput) -> Self {
Self {
lago_id,
credit_note: input,
}
}
}