use cosmwasm_std::{
entry_point, Binary, Deps, DepsMut, Env, MessageInfo, Response, StdResult,
};
use cw2::set_contract_version;
const CONTRACT_NAME: &str = "StateSet:order-manager";
const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION");
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub struct Order {
pub id: String,
pub buyer: Addr,
pub seller: Addr,
pub items: Vec<OrderItem>,
pub total: Uint128,
pub status: OrderStatus,
pub payment_status: PaymentStatus,
pub created_at: Timestamp,
pub fulfilled_at: Option<Timestamp>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
pub enum OrderStatus {
Pending,
Confirmed,
Processing,
Shipped,
Delivered,
Cancelled,
Refunded,
}
#[entry_point]
pub fn execute(
deps: DepsMut,
env: Env,
info: MessageInfo,
msg: ExecuteMsg,
) -> Result<Response, ContractError> {
match msg {
ExecuteMsg::CreateOrder { items, shipping } => {
create_order(deps, env, info, items, shipping)
}
ExecuteMsg::ConfirmPayment { order_id } => {
confirm_payment(deps, env, info, order_id)
}
ExecuteMsg::ShipOrder { order_id, tracking } => {
ship_order(deps, env, info, order_id, tracking)
}
ExecuteMsg::ConfirmDelivery { order_id } => {
confirm_delivery(deps, env, info, order_id)
}
ExecuteMsg::InitiateRefund { order_id, reason } => {
initiate_refund(deps, env, info, order_id, reason)
}
}
}
fn create_order(
deps: DepsMut,
env: Env,
info: MessageInfo,
items: Vec<OrderItem>,
shipping: ShippingInfo,
) -> Result<Response, ContractError> {
// Validate items and calculate total
let total = calculate_order_total(&items)?;
// Generate unique order ID
let order_id = generate_order_id(&env, &info.sender)?;
// Create order object
let order = Order {
id: order_id.clone(),
buyer: info.sender.clone(),
seller: SELLER.load(deps.storage)?,
items,
total,
status: OrderStatus::Pending,
payment_status: PaymentStatus::Pending,
created_at: env.block.time,
fulfilled_at: None,
};
// Store order
ORDERS.save(deps.storage, &order_id, &order)?;
// Emit event
Ok(Response::new()
.add_attribute("action", "create_order")
.add_attribute("order_id", order_id)
.add_attribute("buyer", info.sender)
.add_attribute("total", total))
}