use serde::{Deserialize, Serialize};
use crate::models::{ChargeModel, FixedChargeModel, PaginationParams};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateChargeInput {
pub billable_metric_id: String,
pub charge_model: ChargeModel,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub invoice_display_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pay_in_advance: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub invoiceable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prorated: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_amount_cents: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub properties: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub filters: Option<Vec<ChargeFilterInputValue>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tax_codes: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub regroup_paid_fees: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub applied_pricing_unit: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub accepts_target_wallet: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cascade_updates: Option<bool>,
}
impl CreateChargeInput {
pub fn new(billable_metric_id: String, charge_model: ChargeModel) -> Self {
Self {
billable_metric_id,
charge_model,
code: None,
invoice_display_name: None,
pay_in_advance: None,
invoiceable: None,
prorated: None,
min_amount_cents: None,
properties: None,
filters: None,
tax_codes: None,
regroup_paid_fees: None,
applied_pricing_unit: None,
accepts_target_wallet: None,
cascade_updates: None,
}
}
pub fn with_code(mut self, code: String) -> Self {
self.code = Some(code);
self
}
pub fn with_properties(mut self, properties: serde_json::Value) -> Self {
self.properties = Some(properties);
self
}
pub fn with_tax_codes(mut self, tax_codes: Vec<String>) -> Self {
self.tax_codes = Some(tax_codes);
self
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct UpdateChargeInput {
#[serde(skip_serializing_if = "Option::is_none")]
pub invoice_display_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pay_in_advance: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub invoiceable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prorated: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_amount_cents: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub properties: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub filters: Option<Vec<ChargeFilterInputValue>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tax_codes: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub applied_pricing_unit: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub accepts_target_wallet: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cascade_updates: Option<bool>,
}
impl UpdateChargeInput {
pub fn new() -> Self {
Self::default()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChargeFilterInputValue {
#[serde(skip_serializing_if = "Option::is_none")]
pub invoice_display_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub properties: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub values: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cascade_updates: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateFixedChargeInput {
pub add_on_id: String,
pub charge_model: FixedChargeModel,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub invoice_display_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pay_in_advance: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prorated: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub units: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub apply_units_immediately: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub properties: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tax_codes: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cascade_updates: Option<bool>,
}
impl CreateFixedChargeInput {
pub fn new(add_on_id: String, charge_model: FixedChargeModel) -> Self {
Self {
add_on_id,
charge_model,
code: None,
invoice_display_name: None,
pay_in_advance: None,
prorated: None,
units: None,
apply_units_immediately: None,
properties: None,
tax_codes: None,
cascade_updates: None,
}
}
pub fn with_code(mut self, code: String) -> Self {
self.code = Some(code);
self
}
pub fn with_units(mut self, units: f64) -> Self {
self.units = Some(units);
self
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct UpdateFixedChargeInput {
#[serde(skip_serializing_if = "Option::is_none")]
pub invoice_display_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub units: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub apply_units_immediately: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub properties: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tax_codes: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cascade_updates: Option<bool>,
}
impl UpdateFixedChargeInput {
pub fn new() -> Self {
Self::default()
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ChargeFilterInput {
#[serde(skip_serializing_if = "Option::is_none")]
pub invoice_display_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub properties: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub values: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cascade_updates: Option<bool>,
}
impl ChargeFilterInput {
pub fn new() -> Self {
Self::default()
}
}
#[derive(Debug, Clone)]
pub struct ListPlanChargesRequest {
pub plan_code: String,
pub pagination: PaginationParams,
}
impl ListPlanChargesRequest {
pub fn new(plan_code: String) -> Self {
Self {
plan_code,
pagination: PaginationParams::default(),
}
}
pub fn with_pagination(mut self, pagination: PaginationParams) -> Self {
self.pagination = pagination;
self
}
pub fn to_query_params(&self) -> Vec<(&str, String)> {
self.pagination.to_query_params()
}
}
#[derive(Debug, Clone)]
pub struct GetPlanChargeRequest {
pub plan_code: String,
pub charge_code: String,
}
impl GetPlanChargeRequest {
pub fn new(plan_code: String, charge_code: String) -> Self {
Self {
plan_code,
charge_code,
}
}
}
#[derive(Debug, Clone, Serialize)]
pub struct CreatePlanChargeRequest {
#[serde(skip)]
pub plan_code: String,
pub charge: CreateChargeInput,
}
impl CreatePlanChargeRequest {
pub fn new(plan_code: String, input: CreateChargeInput) -> Self {
Self {
plan_code,
charge: input,
}
}
}
#[derive(Debug, Clone, Serialize)]
pub struct UpdatePlanChargeRequest {
#[serde(skip)]
pub plan_code: String,
#[serde(skip)]
pub charge_code: String,
pub charge: UpdateChargeInput,
}
impl UpdatePlanChargeRequest {
pub fn new(plan_code: String, charge_code: String, input: UpdateChargeInput) -> Self {
Self {
plan_code,
charge_code,
charge: input,
}
}
}
#[derive(Debug, Clone)]
pub struct DeletePlanChargeRequest {
pub plan_code: String,
pub charge_code: String,
pub cascade_updates: Option<bool>,
}
impl DeletePlanChargeRequest {
pub fn new(plan_code: String, charge_code: String) -> Self {
Self {
plan_code,
charge_code,
cascade_updates: None,
}
}
pub fn with_cascade_updates(mut self, cascade_updates: bool) -> Self {
self.cascade_updates = Some(cascade_updates);
self
}
pub fn to_query_params(&self) -> Vec<(&str, String)> {
let mut params = Vec::new();
if let Some(cascade) = self.cascade_updates {
params.push(("cascade_updates", cascade.to_string()));
}
params
}
}
#[derive(Debug, Clone)]
pub struct ListPlanFixedChargesRequest {
pub plan_code: String,
pub pagination: PaginationParams,
}
impl ListPlanFixedChargesRequest {
pub fn new(plan_code: String) -> Self {
Self {
plan_code,
pagination: PaginationParams::default(),
}
}
pub fn with_pagination(mut self, pagination: PaginationParams) -> Self {
self.pagination = pagination;
self
}
pub fn to_query_params(&self) -> Vec<(&str, String)> {
self.pagination.to_query_params()
}
}
#[derive(Debug, Clone)]
pub struct GetPlanFixedChargeRequest {
pub plan_code: String,
pub fixed_charge_code: String,
}
impl GetPlanFixedChargeRequest {
pub fn new(plan_code: String, fixed_charge_code: String) -> Self {
Self {
plan_code,
fixed_charge_code,
}
}
}
#[derive(Debug, Clone, Serialize)]
pub struct CreatePlanFixedChargeRequest {
#[serde(skip)]
pub plan_code: String,
pub fixed_charge: CreateFixedChargeInput,
}
impl CreatePlanFixedChargeRequest {
pub fn new(plan_code: String, input: CreateFixedChargeInput) -> Self {
Self {
plan_code,
fixed_charge: input,
}
}
}
#[derive(Debug, Clone, Serialize)]
pub struct UpdatePlanFixedChargeRequest {
#[serde(skip)]
pub plan_code: String,
#[serde(skip)]
pub fixed_charge_code: String,
pub fixed_charge: UpdateFixedChargeInput,
}
impl UpdatePlanFixedChargeRequest {
pub fn new(
plan_code: String,
fixed_charge_code: String,
input: UpdateFixedChargeInput,
) -> Self {
Self {
plan_code,
fixed_charge_code,
fixed_charge: input,
}
}
}
#[derive(Debug, Clone)]
pub struct DeletePlanFixedChargeRequest {
pub plan_code: String,
pub fixed_charge_code: String,
pub cascade_updates: Option<bool>,
}
impl DeletePlanFixedChargeRequest {
pub fn new(plan_code: String, fixed_charge_code: String) -> Self {
Self {
plan_code,
fixed_charge_code,
cascade_updates: None,
}
}
pub fn with_cascade_updates(mut self, cascade_updates: bool) -> Self {
self.cascade_updates = Some(cascade_updates);
self
}
pub fn to_query_params(&self) -> Vec<(&str, String)> {
let mut params = Vec::new();
if let Some(cascade) = self.cascade_updates {
params.push(("cascade_updates", cascade.to_string()));
}
params
}
}
#[derive(Debug, Clone)]
pub struct ListPlanChargeFiltersRequest {
pub plan_code: String,
pub charge_code: String,
pub pagination: PaginationParams,
}
impl ListPlanChargeFiltersRequest {
pub fn new(plan_code: String, charge_code: String) -> Self {
Self {
plan_code,
charge_code,
pagination: PaginationParams::default(),
}
}
pub fn with_pagination(mut self, pagination: PaginationParams) -> Self {
self.pagination = pagination;
self
}
pub fn to_query_params(&self) -> Vec<(&str, String)> {
self.pagination.to_query_params()
}
}
#[derive(Debug, Clone)]
pub struct GetPlanChargeFilterRequest {
pub plan_code: String,
pub charge_code: String,
pub filter_id: String,
}
impl GetPlanChargeFilterRequest {
pub fn new(plan_code: String, charge_code: String, filter_id: String) -> Self {
Self {
plan_code,
charge_code,
filter_id,
}
}
}
#[derive(Debug, Clone, Serialize)]
pub struct CreatePlanChargeFilterRequest {
#[serde(skip)]
pub plan_code: String,
#[serde(skip)]
pub charge_code: String,
pub filter: ChargeFilterInput,
}
impl CreatePlanChargeFilterRequest {
pub fn new(plan_code: String, charge_code: String, input: ChargeFilterInput) -> Self {
Self {
plan_code,
charge_code,
filter: input,
}
}
}
#[derive(Debug, Clone, Serialize)]
pub struct UpdatePlanChargeFilterRequest {
#[serde(skip)]
pub plan_code: String,
#[serde(skip)]
pub charge_code: String,
#[serde(skip)]
pub filter_id: String,
pub filter: ChargeFilterInput,
}
impl UpdatePlanChargeFilterRequest {
pub fn new(
plan_code: String,
charge_code: String,
filter_id: String,
input: ChargeFilterInput,
) -> Self {
Self {
plan_code,
charge_code,
filter_id,
filter: input,
}
}
}
#[derive(Debug, Clone)]
pub struct DeletePlanChargeFilterRequest {
pub plan_code: String,
pub charge_code: String,
pub filter_id: String,
pub cascade_updates: Option<bool>,
}
impl DeletePlanChargeFilterRequest {
pub fn new(plan_code: String, charge_code: String, filter_id: String) -> Self {
Self {
plan_code,
charge_code,
filter_id,
cascade_updates: None,
}
}
pub fn with_cascade_updates(mut self, cascade_updates: bool) -> Self {
self.cascade_updates = Some(cascade_updates);
self
}
pub fn to_query_params(&self) -> Vec<(&str, String)> {
let mut params = Vec::new();
if let Some(cascade) = self.cascade_updates {
params.push(("cascade_updates", cascade.to_string()));
}
params
}
}