diff --git a/pallets/genetic-analysis-orders/src/impl_genetic_analysis_orders.rs b/pallets/genetic-analysis-orders/src/impl_genetic_analysis_orders.rs index 755b4b1e..e75426d0 100644 --- a/pallets/genetic-analysis-orders/src/impl_genetic_analysis_orders.rs +++ b/pallets/genetic-analysis-orders/src/impl_genetic_analysis_orders.rs @@ -186,14 +186,11 @@ impl GeneticAnalysisOrderInterface for Pallet { let asset_id = genetic_analysis_order.asset_id; let account_id = Self::account_id(); - // Calculate 5% of the price_component_value - let mut price_component_substracted_value: BalanceOf = 0u128.saturated_into(); - for analysis_order in genetic_analysis_order.prices.iter() { - price_component_substracted_value += analysis_order.value / 20u128.saturated_into(); - } + // Calculate 5% of the total price + let price_substracted_value: BalanceOf = total_price / 20u128.saturated_into(); - // 5% of the price_component_value is substracted - let total_price_paid = total_price - price_component_substracted_value; + // 5% of the total price is substracted + let total_price_paid = total_price - price_substracted_value; // Withhold 5% for DBIO Self::do_transfer( @@ -209,7 +206,7 @@ impl GeneticAnalysisOrderInterface for Pallet { &genetic_analysis_order.currency, &account_id, &TreasuryKey::::get().unwrap(), - price_component_substracted_value, + price_substracted_value, asset_id, )?; diff --git a/pallets/genetic-analysis-orders/src/tests.rs b/pallets/genetic-analysis-orders/src/tests.rs index 029ae563..965692de 100644 --- a/pallets/genetic-analysis-orders/src/tests.rs +++ b/pallets/genetic-analysis-orders/src/tests.rs @@ -621,8 +621,8 @@ fn fulfill_genetic_analysis_order_works() { _genetic_analysis_order_id )); - assert_eq!(Balances::free_balance(1), 9975); - assert_eq!(Balances::free_balance(2), 25); + assert_eq!(Balances::free_balance(1), 9950); + assert_eq!(Balances::free_balance(2), 50); assert_eq!( GeneticAnalysisOrders::genetic_analysis_order_by_id(&_genetic_analysis_order_id), @@ -1902,40 +1902,6 @@ fn call_event_should_work() { updated_at: 0, }), )); - - // assert_ok!(GeneticAnalysis::process_genetic_analysis( - // Origin::signed(1), - // _genetic_analysis[0].clone(), - // GeneticAnalysisStatus::Rejected, - // )); - - // assert_ok!(GeneticAnalysisOrders::set_genetic_analysis_order_refunded( - // Origin::signed(3), - // _genetic_analysis_order_id - // )); - - // System::assert_last_event(Event::GeneticAnalysisOrders( - // crate::Event::GeneticAnalysisOrderRefunded(GeneticAnalysisOrder { - // id: _genetic_analysis_order_id, - // genetic_data_id: _genetic_data_ids[0], - // service_id: _genetic_analyst.services[0], - // customer_id: 1, - // customer_box_public_key: Keccak256::hash( - // "0xhJ7TRe456FADD2726A132ABJK5RCc9E6fC5869F4".as_bytes(), - // ), - // seller_id: 1, - // genetic_analysis_tracking_id: _genetic_analysis[0].clone(), - // genetic_link: "DeBio Genetic Genetic Link".as_bytes().to_vec(), - // asset_id: None, - // currency: CurrencyType::default(), - // prices: PriceByCurrency::default().price_components, - // additional_prices: PriceByCurrency::default().additional_prices, - // total_price: PriceByCurrency::default().total_price, - // status: GeneticAnalysisOrderStatus::Refunded, - // created_at: 0, - // updated_at: 0, - // }), - // )); }); } diff --git a/pallets/menstrual-calendar/src/benchmarking.rs b/pallets/menstrual-calendar/src/benchmarking.rs index c191fc04..75789c4c 100644 --- a/pallets/menstrual-calendar/src/benchmarking.rs +++ b/pallets/menstrual-calendar/src/benchmarking.rs @@ -1,7 +1,7 @@ use super::*; #[allow(unused)] -use crate::{Pallet as MenstrualCalendar, Symptom}; +use crate::{MenstrualInfo, Pallet as MenstrualCalendar, Symptom}; use frame_benchmarking::{benchmarks, impl_benchmark_test_suite, whitelisted_caller}; use frame_support::sp_runtime::SaturatedConversion; use frame_system::RawOrigin; @@ -37,12 +37,16 @@ benchmarks! { let menstrual_ids = MenstrualCalendar::::menstrual_calendar_by_owner( caller.clone() ).unwrap(); + + let menstrual_info = MenstrualInfo { + date: 0u128.saturated_into(), + symptoms: vec![Symptom::from(b"pain")], + menstruation: true, + }; }: add_menstrual_cycle_log( RawOrigin::Signed(caller), menstrual_ids[0], - 0u128.saturated_into(), - vec![Symptom::from(b"pain")], - true + vec![menstrual_info], ) update_menstrual_cycle_log { @@ -58,12 +62,16 @@ benchmarks! { caller.clone() ).unwrap(); + let menstrual_info = MenstrualInfo { + date: 0u128.saturated_into(), + symptoms: vec![Symptom::from(b"pain")], + menstruation: true, + }; + let _ = MenstrualCalendar::::add_menstrual_cycle_log( caller_origin.clone(), menstrual_ids[0], - 0u128.saturated_into(), - vec![Symptom::from(b"pain")], - true, + vec![menstrual_info], ); let cycle_log_ids = MenstrualCalendar::::menstrual_cycle_log_by_owner_id(menstrual_ids[0]).unwrap(); @@ -89,12 +97,16 @@ benchmarks! { caller.clone() ).unwrap(); + let menstrual_info = MenstrualInfo { + date: 0u128.saturated_into(), + symptoms: vec![Symptom::from(b"pain")], + menstruation: true, + }; + let _ = MenstrualCalendar::::add_menstrual_cycle_log( caller_origin.clone(), menstrual_ids[0], - 0u128.saturated_into(), - vec![Symptom::from(b"pain")], - true, + vec![menstrual_info], ); let cycle_log_ids = MenstrualCalendar::::menstrual_cycle_log_by_owner_id(menstrual_ids[0]).unwrap(); diff --git a/pallets/menstrual-calendar/src/impl_menstrual_calendar.rs b/pallets/menstrual-calendar/src/impl_menstrual_calendar.rs index 7ce1e8aa..2ac0e535 100644 --- a/pallets/menstrual-calendar/src/impl_menstrual_calendar.rs +++ b/pallets/menstrual-calendar/src/impl_menstrual_calendar.rs @@ -5,6 +5,7 @@ impl MenstrualCalendarInterface for Pallet { type Error = Error; type MenstrualCycleLog = MenstrualCycleLogOf; type MenstrualCalendar = MenstrualCalendarOf; + type MenstrualInfo = SymptomInfoOf; type Date = MomentOf; fn add_menstrual_calendar( @@ -52,10 +53,8 @@ impl MenstrualCalendarInterface for Pallet { fn add_menstrual_cycle_log( address_id: &T::AccountId, menstrual_calendar_id: &T::Hash, - date: &Self::Date, - symptoms: &[Symptom], - menstruation: bool, - ) -> Result { + menstrual_infos: &[Self::MenstrualInfo], + ) -> Result, Self::Error> { let menstrual_calendar = MenstrualCalendarById::::get(menstrual_calendar_id) .ok_or(Error::::MenstrualCalendarDoesNotExist)?; @@ -63,34 +62,42 @@ impl MenstrualCalendarInterface for Pallet { return Err(Error::::NotMenstrualCalendarOwner) } - let owner_menstrual_cycle_log_count = - MenstrualCycleLogCountByOwner::::get(menstrual_calendar_id).unwrap_or(0); - - let menstrual_cycle_log_id = Self::generate_id( - address_id, - owner_menstrual_cycle_log_count, - Some(*menstrual_calendar_id), - ); - - let now = pallet_timestamp::Pallet::::get(); - // Store to MenstrualCycleLogById storage - let _menstrual_cycle_log = MenstrualCycleLog::new( - menstrual_cycle_log_id, - *menstrual_calendar_id, - *date, - menstruation, - symptoms.to_vec(), - now, - ); - - MenstrualCycleLogById::::insert(menstrual_cycle_log_id, &_menstrual_cycle_log); - - Self::add_menstrual_cycle_log_by_owner(menstrual_calendar_id, &menstrual_cycle_log_id); - Self::add_menstrual_cycle_log_count(); - Self::add_menstrual_cycle_log_count_by_owner(menstrual_calendar_id); - - Ok(_menstrual_cycle_log) + let mut menstrual_cycle_logs: Vec> = Vec::new(); + + for menstrual_info in menstrual_infos.iter() { + let owner_menstrual_cycle_log_count = + MenstrualCycleLogCountByOwner::::get(menstrual_calendar_id).unwrap_or(0); + + let menstrual_cycle_log_id = Self::generate_id( + address_id, + owner_menstrual_cycle_log_count, + Some(*menstrual_calendar_id), + ); + + let now = pallet_timestamp::Pallet::::get(); + let date = &menstrual_info.date; + let symptoms = &menstrual_info.symptoms; + let menstruation = menstrual_info.menstruation; + let menstrual_cycle_log = MenstrualCycleLog::new( + menstrual_cycle_log_id, + *menstrual_calendar_id, + *date, + menstruation, + symptoms.to_vec(), + now, + ); + + MenstrualCycleLogById::::insert(menstrual_cycle_log_id, &menstrual_cycle_log); + + Self::add_menstrual_cycle_log_by_owner(menstrual_calendar_id, &menstrual_cycle_log_id); + Self::add_menstrual_cycle_log_count(); + Self::add_menstrual_cycle_log_count_by_owner(menstrual_calendar_id); + + menstrual_cycle_logs.push(menstrual_cycle_log); + } + + Ok(menstrual_cycle_logs) } fn update_menstrual_cycle_log( diff --git a/pallets/menstrual-calendar/src/interface.rs b/pallets/menstrual-calendar/src/interface.rs index cbdd74eb..b0b1ef84 100644 --- a/pallets/menstrual-calendar/src/interface.rs +++ b/pallets/menstrual-calendar/src/interface.rs @@ -4,6 +4,7 @@ pub trait MenstrualCalendarInterface { type Error; type MenstrualCycleLog; type MenstrualCalendar; + type MenstrualInfo; type Date; fn add_menstrual_calendar( @@ -20,10 +21,8 @@ pub trait MenstrualCalendarInterface { fn add_menstrual_cycle_log( address_id: &T::AccountId, menstrual_calendar_id: &T::Hash, - date: &Self::Date, - symptoms: &[Symptom], - menstruation: bool, - ) -> Result; + menstrual_infos: &[Self::MenstrualInfo], + ) -> Result, Self::Error>; fn update_menstrual_cycle_log( address_id: &T::AccountId, diff --git a/pallets/menstrual-calendar/src/lib.rs b/pallets/menstrual-calendar/src/lib.rs index 0fcc7068..4a7ea008 100644 --- a/pallets/menstrual-calendar/src/lib.rs +++ b/pallets/menstrual-calendar/src/lib.rs @@ -65,6 +65,7 @@ pub mod pallet { pub type MenstrualCalendarIdOf = HashOf; pub type MenstrualCycleLogOf = MenstrualCycleLog, MomentOf>; pub type MenstrualCycleLogIdOf = HashOf; + pub type SymptomInfoOf = MenstrualInfo>; // ------- Storage ------------- #[pallet::storage] @@ -120,7 +121,7 @@ pub mod pallet { MenstrualCalendarRemoved(HashOf, AccountIdOf), /// Event documentation should end with an array that provides descriptive names for event /// parameters, [MenstrualCycleLog, who] - MenstrualCycleLogAdded(MenstrualCycleLogOf, AccountIdOf), + MenstrualCycleLogsAdded(Vec>, AccountIdOf), //// MenstrualCycleLog updated /// parameters, [MenstrualCycleLog, who] MenstrualCycleLogUpdated(MenstrualCycleLogOf, AccountIdOf), @@ -190,21 +191,17 @@ pub mod pallet { pub fn add_menstrual_cycle_log( origin: OriginFor, menstrual_calendar_id: HashOf, - date: MomentOf, - symptoms: Vec, - menstruation: bool, + menstrual_infos: Vec>, ) -> DispatchResultWithPostInfo { let who = ensure_signed(origin)?; match >::add_menstrual_cycle_log( &who, &menstrual_calendar_id, - &date, - &symptoms, - menstruation, + &menstrual_infos, ) { - Ok(menstrual_cycle_log) => { - Self::deposit_event(Event::MenstrualCycleLogAdded(menstrual_cycle_log, who)); + Ok(menstrual_cycle_logs) => { + Self::deposit_event(Event::MenstrualCycleLogsAdded(menstrual_cycle_logs, who)); Ok(().into()) }, Err(error) => Err(error.into()), diff --git a/pallets/menstrual-calendar/src/tests.rs b/pallets/menstrual-calendar/src/tests.rs index 31d9f7f3..ea535cbf 100644 --- a/pallets/menstrual-calendar/src/tests.rs +++ b/pallets/menstrual-calendar/src/tests.rs @@ -1,4 +1,7 @@ -use crate::{mock::*, Error, MenstrualCalendar as MenstrualCalendarS, MenstrualCycleLog, Symptom}; +use crate::{ + mock::*, Error, MenstrualCalendar as MenstrualCalendarS, MenstrualCycleLog, MenstrualInfo, + Symptom, +}; use frame_support::{ assert_noop, assert_ok, sp_runtime::traits::{Hash, Keccak256}, @@ -52,13 +55,13 @@ fn add_menstrual_cycle_log_works() { assert_ok!(MenstrualCalendar::add_menstrual_calendar(Origin::signed(customer), 16)); let menstrual_ids = MenstrualCalendar::menstrual_calendar_by_owner(customer).unwrap(); + let menstrual_info = + MenstrualInfo { date: 0, symptoms: vec![Symptom::from(b"pain")], menstruation: true }; assert_ok!(MenstrualCalendar::add_menstrual_cycle_log( Origin::signed(customer), menstrual_ids[0], - 0, - vec![Symptom::from(b"pain")], - true, + vec![menstrual_info], )); let cycle_log_ids = @@ -91,13 +94,13 @@ fn update_menstrual_cycle_log_works() { assert_ok!(MenstrualCalendar::add_menstrual_calendar(Origin::signed(customer), 16)); let menstrual_ids = MenstrualCalendar::menstrual_calendar_by_owner(customer).unwrap(); + let menstrual_info = + MenstrualInfo { date: 0, symptoms: vec![Symptom::from(b"pain")], menstruation: true }; assert_ok!(MenstrualCalendar::add_menstrual_cycle_log( Origin::signed(customer), menstrual_ids[0], - 0, - vec![Symptom::from(b"pain")], - true, + vec![menstrual_info], )); let cycle_log_ids = @@ -134,13 +137,13 @@ fn remove_menstrual_cycle_log_works() { assert_ok!(MenstrualCalendar::add_menstrual_calendar(Origin::signed(customer), 16)); let menstrual_ids = MenstrualCalendar::menstrual_calendar_by_owner(customer).unwrap(); + let menstrual_info = + MenstrualInfo { date: 0, symptoms: vec![Symptom::from(b"pain")], menstruation: true }; assert_ok!(MenstrualCalendar::add_menstrual_cycle_log( Origin::signed(customer), menstrual_ids[0], - 0, - vec![Symptom::from(b"pain")], - true, + vec![menstrual_info], )); let cycle_log_ids = @@ -200,13 +203,14 @@ fn cant_update_menstrual_calendar_when_not_owner() { #[test] fn cant_add_menstrual_cycle_log_when_menstrual_calendar_not_exist() { ExternalityBuilder::build().execute_with(|| { + let menstrual_info = + MenstrualInfo { date: 0, symptoms: vec![Symptom::from(b"pain")], menstruation: true }; + assert_noop!( MenstrualCalendar::add_menstrual_cycle_log( Origin::signed(1), Keccak256::hash("0xDb9Af2d1f3ADD2726A132AA7A65Cc9E6fC5761C3".as_bytes()), - 0, - vec![Symptom::from(b"pain")], - false + vec![menstrual_info], ), Error::::MenstrualCalendarDoesNotExist ); @@ -222,14 +226,14 @@ fn cant_add_menstrual_cycle_log_when_not_owner() { assert_ok!(MenstrualCalendar::add_menstrual_calendar(Origin::signed(customer), 16)); let menstrual_ids = MenstrualCalendar::menstrual_calendar_by_owner(customer).unwrap(); + let menstrual_info = + MenstrualInfo { date: 0, symptoms: vec![Symptom::from(b"pain")], menstruation: true }; assert_noop!( MenstrualCalendar::add_menstrual_cycle_log( Origin::signed(other_customer), menstrual_ids[0], - 0, - vec![Symptom::from(b"pain")], - true, + vec![menstrual_info], ), Error::::NotMenstrualCalendarOwner ); @@ -325,13 +329,13 @@ fn cant_remove_menstrual_cycle_log_when_not_owner() { assert_ok!(MenstrualCalendar::add_menstrual_calendar(Origin::signed(customer), 16)); let menstrual_ids = MenstrualCalendar::menstrual_calendar_by_owner(customer).unwrap(); + let menstrual_info = + MenstrualInfo { date: 0, symptoms: vec![Symptom::from(b"pain")], menstruation: true }; assert_ok!(MenstrualCalendar::add_menstrual_cycle_log( Origin::signed(customer), menstrual_ids[0], - 0, - vec![Symptom::from(b"pain")], - true, + vec![menstrual_info], )); let cycle_log_ids = @@ -397,26 +401,27 @@ fn call_event_should_works() { ), )); + let menstrual_info = + MenstrualInfo { date: 0, symptoms: vec![Symptom::from(b"pain")], menstruation: true }; + assert_ok!(MenstrualCalendar::add_menstrual_cycle_log( Origin::signed(customer), menstrual_ids[0], - 0, - vec![Symptom::from(b"pain")], - true, + vec![menstrual_info], )); let cycle_log_ids = MenstrualCalendar::menstrual_cycle_log_by_owner_id(menstrual_ids[0]).unwrap(); - System::assert_last_event(Event::MenstrualCalendar(crate::Event::MenstrualCycleLogAdded( - MenstrualCycleLog::new( + System::assert_last_event(Event::MenstrualCalendar(crate::Event::MenstrualCycleLogsAdded( + vec![MenstrualCycleLog::new( cycle_log_ids[0], menstrual_ids[0], 0, true, vec![Symptom::from(b"pain")], 0, - ), + )], customer, ))); diff --git a/pallets/menstrual-calendar/src/types.rs b/pallets/menstrual-calendar/src/types.rs index 99d9f1e6..ca3549f5 100644 --- a/pallets/menstrual-calendar/src/types.rs +++ b/pallets/menstrual-calendar/src/types.rs @@ -15,6 +15,13 @@ impl Symptom { } } +#[derive(Encode, Decode, Clone, Default, RuntimeDebug, PartialEq, Eq, TypeInfo)] +pub struct MenstrualInfo { + pub date: Moment, + pub symptoms: Vec, + pub menstruation: bool, +} + // MenstrualCycleLog #[derive(Encode, Decode, Clone, Default, RuntimeDebug, PartialEq, Eq, TypeInfo)] pub struct MenstrualCycleLog { diff --git a/pallets/orders/src/impl_orders.rs b/pallets/orders/src/impl_orders.rs index bff17fe3..2e960d0a 100644 --- a/pallets/orders/src/impl_orders.rs +++ b/pallets/orders/src/impl_orders.rs @@ -173,21 +173,15 @@ impl OrderInterface for Pallet { if order.currency.can_transfer() { let treasury_key = Self::treasury_key().ok_or(Error::::PalletAccountNotFound)?; let pallet_id = Self::pallet_id().ok_or(Error::::PalletAccountNotFound)?; - - // Transfer testing price and QC price to lab - let mut price_component_substracted_value: BalanceOf = 0u128.saturated_into(); - for price in order.prices.iter() { - price_component_substracted_value += price.value / 20u128.saturated_into(); - } - - let total_price_paid = order.total_price - price_component_substracted_value; + let price_substracted_value: BalanceOf = order.total_price / 20u128.saturated_into(); + let total_price_paid = order.total_price - price_substracted_value; // Transfer 5% to treasury Self::do_transfer( &order.currency, &pallet_id, &treasury_key, - price_component_substracted_value, + price_substracted_value, order.asset_id, )?; diff --git a/pallets/orders/src/tests.rs b/pallets/orders/src/tests.rs index b3dd2487..041bf3c4 100644 --- a/pallets/orders/src/tests.rs +++ b/pallets/orders/src/tests.rs @@ -569,7 +569,7 @@ fn fulfill_order_works() { currency: CurrencyType::DBIO, total_price: 30, price_components: vec![Price { component: b"testing_price".to_vec(), value: 20 }], - additional_prices: vec![Price { component: b"qc_price".to_vec(), value: 10 }], + additional_prices: vec![Price { component: b"qc_price".to_vec(), value: 20 }], }; assert_ok!(Services::create_service( @@ -636,7 +636,7 @@ fn fulfill_order_works() { seller_id: lab, dna_sample_tracking_id: _dna_sample[0].clone(), asset_id: None, - total_price: 30, + total_price: 40, currency: CurrencyType::default(), prices: prices_by_currency_dbio.price_components, additional_prices: prices_by_currency_dbio.additional_prices, @@ -647,10 +647,10 @@ fn fulfill_order_works() { }) ); - assert_eq!(Balances::free_balance(customer), 170); - assert_eq!(Balances::free_balance(lab), 329); + assert_eq!(Balances::free_balance(customer), 160); + assert_eq!(Balances::free_balance(lab), 338); assert_eq!(Balances::free_balance(pallet_id), 1); - assert_eq!(Balances::free_balance(treasury_key), 401); + assert_eq!(Balances::free_balance(treasury_key), 402); }) }