{"slug":"cyclesave","name":"CycleSave – ROSCA Engine for WordPress","description":"ROSCAs for WordPress: run Ajo, Esusu & Tontine groups on your site with transparent contributions and automated payouts.","author":"Ibrahim Nasir","active_installs":0,"version":"1.0.3","wp_org_url":"https://wordpress.org/plugins/cyclesave/","is_closed":false,"cleanup":{"has_uninstall_hook":true,"drops_tables_on_uninstall":true,"deletes_options_on_uninstall":false},"tables":[{"table_name":"cyclesave_contributions","full_table_name":"wp_cyclesave_contributions","description":"Stores cyclesave contributions data created by this plugin.","detection_method":"static","confidence":"medium","columns":[],"create_sql":null},{"table_name":"cyclesave_cycles","full_table_name":"wp_cyclesave_cycles","description":"Stores cyclesave cycles data created by this plugin.","detection_method":"static","confidence":"high","columns":[],"create_sql":null},{"table_name":"cyclesave_groups","full_table_name":"wp_cyclesave_groups","description":"Stores cyclesave groups data created by this plugin.","detection_method":"static","confidence":"medium","columns":[{"name":"id","type":"BIGINT UNSIGNED","nullable":false,"primary_key":true},{"name":"name","type":"VARCHAR(150)","nullable":false,"primary_key":false},{"name":"slug","type":"VARCHAR(150)","nullable":false,"primary_key":false},{"name":"admin_user_id","type":"BIGINT UNSIGNED","nullable":false,"primary_key":false},{"name":"contribution_amount","type":"DECIMAL(15,2)","nullable":false,"primary_key":false},{"name":"currency","type":"VARCHAR(10)","nullable":false,"primary_key":false},{"name":"frequency","type":"ENUM('daily','weekly','monthly')","nullable":false,"primary_key":false},{"name":"max_members","type":"TINYINT UNSIGNED","nullable":false,"primary_key":false},{"name":"current_round","type":"SMALLINT UNSIGNED","nullable":false,"primary_key":false},{"name":"payout_order_locked","type":"TINYINT(1)","nullable":false,"primary_key":false},{"name":"status","type":"ENUM('open','ordering','active','paused','completed')","nullable":false,"primary_key":false},{"name":"visibility","type":"ENUM('public','private')","nullable":false,"primary_key":false},{"name":"grace_period_hours","type":"TINYINT","nullable":false,"primary_key":false},{"name":"created_at","type":"DATETIME","nullable":false,"primary_key":false},{"name":"updated_at","type":"DATETIME","nullable":true,"primary_key":false},{"name":"group_id","type":"BIGINT UNSIGNED","nullable":false,"primary_key":false},{"name":"user_id","type":"BIGINT UNSIGNED","nullable":false,"primary_key":false},{"name":"position","type":"TINYINT UNSIGNED","nullable":false,"primary_key":false},{"name":"has_collected","type":"TINYINT(1)","nullable":false,"primary_key":false},{"name":"total_contributed","type":"DECIMAL(15,2)","nullable":false,"primary_key":false},{"name":"missed_payments","type":"TINYINT","nullable":false,"primary_key":false},{"name":"status","type":"ENUM('pending','active','suspended','left')","nullable":false,"primary_key":false},{"name":"joined_at","type":"DATETIME","nullable":false,"primary_key":false},{"name":"group_id","type":"BIGINT UNSIGNED","nullable":false,"primary_key":false},{"name":"cycle_id","type":"BIGINT UNSIGNED","nullable":true,"primary_key":false},{"name":"round_number","type":"SMALLINT UNSIGNED","nullable":false,"primary_key":false},{"name":"scheduled_collector_user_id","type":"BIGINT UNSIGNED","nullable":false,"primary_key":false},{"name":"contribution_due","type":"DATETIME","nullable":false,"primary_key":false},{"name":"collector_user_id","type":"BIGINT UNSIGNED","nullable":true,"primary_key":false},{"name":"pot_amount","type":"DECIMAL(15,2)","nullable":false,"primary_key":false},{"name":"status","type":"ENUM('collecting','pending_payout','paid','skipped')","nullable":false,"primary_key":false},{"name":"created_at","type":"DATETIME","nullable":false,"primary_key":false},{"name":"round_id","type":"BIGINT UNSIGNED","nullable":false,"primary_key":false},{"name":"member_id","type":"BIGINT UNSIGNED","nullable":false,"primary_key":false},{"name":"amount","type":"DECIMAL(15,2)","nullable":false,"primary_key":false},{"name":"gateway","type":"ENUM('stripe','paypal','monnify','paystack','flutterwave','mollie','bank_transfer','store_payment')","nullable":false,"primary_key":false},{"name":"gateway_reference","type":"VARCHAR(100)","nullable":true,"primary_key":false},{"name":"gateway_status","type":"VARCHAR(50)","nullable":false,"primary_key":false},{"name":"status","type":"ENUM('pending','success','failed','reversed','refunded')","nullable":false,"primary_key":false},{"name":"paid_at","type":"DATETIME","nullable":true,"primary_key":false},{"name":"created_at","type":"DATETIME","nullable":false,"primary_key":false},{"name":"group_id","type":"BIGINT UNSIGNED","nullable":false,"primary_key":false},{"name":"member_id","type":"BIGINT UNSIGNED","nullable":false,"primary_key":false},{"name":"payout_position","type":"TINYINT UNSIGNED","nullable":false,"primary_key":false},{"name":"changed_by_user_id","type":"BIGINT UNSIGNED","nullable":true,"primary_key":false},{"name":"change_reason","type":"VARCHAR(255)","nullable":true,"primary_key":false},{"name":"set_at","type":"DATETIME","nullable":false,"primary_key":false},{"name":"round_id","type":"BIGINT UNSIGNED","nullable":false,"primary_key":false},{"name":"collector_user_id","type":"BIGINT UNSIGNED","nullable":false,"primary_key":false},{"name":"amount","type":"DECIMAL(15,2)","nullable":false,"primary_key":false},{"name":"gateway","type":"ENUM('stripe','paypal','monnify','paystack','flutterwave','mollie','bank_transfer','store_payment')","nullable":false,"primary_key":false},{"name":"gateway_reference","type":"VARCHAR(100)","nullable":false,"primary_key":false},{"name":"bank_name","type":"VARCHAR(100)","nullable":false,"primary_key":false},{"name":"account_number","type":"VARCHAR(20)","nullable":false,"primary_key":false},{"name":"status","type":"ENUM('pending','processing','success','failed')","nullable":false,"primary_key":false},{"name":"initiated_at","type":"DATETIME","nullable":false,"primary_key":false},{"name":"completed_at","type":"DATETIME","nullable":true,"primary_key":false},{"name":"user_id","type":"BIGINT UNSIGNED","nullable":false,"primary_key":false},{"name":"group_id","type":"BIGINT UNSIGNED","nullable":false,"primary_key":false},{"name":"type","type":"VARCHAR(80)","nullable":false,"primary_key":false},{"name":"subject","type":"VARCHAR(255)","nullable":false,"primary_key":false},{"name":"body","type":"LONGTEXT","nullable":false,"primary_key":false},{"name":"sent_at","type":"DATETIME","nullable":false,"primary_key":false},{"name":"group_id","type":"BIGINT UNSIGNED","nullable":false,"primary_key":false},{"name":"cycle_number","type":"TINYINT UNSIGNED","nullable":false,"primary_key":false},{"name":"status","type":"ENUM('active','completed')","nullable":false,"primary_key":false},{"name":"contribution_amount","type":"DECIMAL(15,2)","nullable":false,"primary_key":false},{"name":"frequency","type":"ENUM('daily','weekly','monthly')","nullable":false,"primary_key":false},{"name":"max_members","type":"TINYINT UNSIGNED","nullable":false,"primary_key":false},{"name":"started_at","type":"DATETIME","nullable":false,"primary_key":false},{"name":"completed_at","type":"DATETIME","nullable":true,"primary_key":false},{"name":"contribution_id","type":"BIGINT UNSIGNED","nullable":false,"primary_key":false},{"name":"gateway","type":"VARCHAR(50)","nullable":false,"primary_key":false},{"name":"gateway_reference","type":"VARCHAR(100)","nullable":false,"primary_key":false},{"name":"event_type","type":"VARCHAR(80)","nullable":false,"primary_key":false},{"name":"event_source","type":"VARCHAR(80)","nullable":false,"primary_key":false},{"name":"gateway_status","type":"VARCHAR(100)","nullable":false,"primary_key":false},{"name":"payload_hash","type":"CHAR(64)","nullable":false,"primary_key":false},{"name":"created_at","type":"DATETIME","nullable":false,"primary_key":false}],"create_sql":"CREATE TABLE wp_cyclesave_groups ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(150) NOT NULL, slug VARCHAR(150) NOT NULL, admin_user_id BIGINT UNSIGNED NOT NULL, contribution_amount DECIMAL(15,2) NOT NULL DEFAULT 0.00, currency VARCHAR(10) NOT NULL DEFAULT 'USD', frequency ENUM('daily','weekly','monthly') NOT NULL DEFAULT 'monthly', max_members TINYINT UNSIGNED NOT NULL DEFAULT 10, current_round SMALLINT UNSIGNED NOT NULL DEFAULT 0, payout_order_locked TINYINT(1) NOT NULL DEFAULT 0, status ENUM('open','ordering','active','paused','completed') NOT NULL DEFAULT 'open', visibility ENUM('public','private') NOT NULL DEFAULT 'public', grace_period_hours TINYINT NOT NULL DEFAULT 24, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY slug (slug), KEY admin_user_id (admin_user_id), KEY status (status), KEY visibility (visibility) ) $charset_collate;\"; // 2. cyclesave_members $sql[] = \"CREATE TABLE wp_cyclesave_members ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, group_id BIGINT UNSIGNED NOT NULL, user_id BIGINT UNSIGNED NOT NULL, position TINYINT UNSIGNED NOT NULL DEFAULT 0, has_collected TINYINT(1) NOT NULL DEFAULT 0, total_contributed DECIMAL(15,2) NOT NULL DEFAULT 0.00, missed_payments TINYINT NOT NULL DEFAULT 0, status ENUM('pending','active','suspended','left') NOT NULL DEFAULT 'pending', joined_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY group_user (group_id, user_id), KEY group_id (group_id), KEY user_id (user_id), KEY status (status) ) $charset_collate;\"; // 3. cyclesave_rounds $sql[] = \"CREATE TABLE wp_cyclesave_rounds ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, group_id BIGINT UNSIGNED NOT NULL, cycle_id BIGINT UNSIGNED NULL, round_number SMALLINT UNSIGNED NOT NULL DEFAULT 1, scheduled_collector_user_id BIGINT UNSIGNED NOT NULL, contribution_due DATETIME NOT NULL, collector_user_id BIGINT UNSIGNED NULL, pot_amount DECIMAL(15,2) NOT NULL DEFAULT 0.00, status ENUM('collecting','pending_payout','paid','skipped') NOT NULL DEFAULT 'collecting', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY group_id (group_id), KEY cycle_id (cycle_id), KEY status (status), KEY contribution_due (contribution_due) ) $charset_collate;\"; // 4. cyclesave_contributions $sql[] = \"CREATE TABLE wp_cyclesave_contributions ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, round_id BIGINT UNSIGNED NOT NULL, member_id BIGINT UNSIGNED NOT NULL, amount DECIMAL(15,2) NOT NULL DEFAULT 0.00, gateway ENUM('stripe','paypal','monnify','paystack','flutterwave','mollie','bank_transfer','store_payment') NOT NULL DEFAULT 'stripe', gateway_reference VARCHAR(100) NULL DEFAULT NULL, gateway_status VARCHAR(50) NOT NULL DEFAULT '', status ENUM('pending','success','failed','reversed','refunded') NOT NULL DEFAULT 'pending', paid_at DATETIME NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY gateway_reference (gateway_reference), KEY round_id (round_id), KEY member_id (member_id), KEY status (status) ) $charset_collate;\"; // 5. cyclesave_payout_order $sql[] = \"CREATE TABLE wp_cyclesave_payout_order ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, group_id BIGINT UNSIGNED NOT NULL, member_id BIGINT UNSIGNED NOT NULL, payout_position TINYINT UNSIGNED NOT NULL, changed_by_user_id BIGINT UNSIGNED NULL, change_reason VARCHAR(255) NULL, set_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY group_id (group_id), KEY member_id (member_id), KEY payout_position (payout_position) ) $charset_collate;\"; // 6. cyclesave_payouts $sql[] = \"CREATE TABLE wp_cyclesave_payouts ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, round_id BIGINT UNSIGNED NOT NULL, collector_user_id BIGINT UNSIGNED NOT NULL, amount DECIMAL(15,2) NOT NULL DEFAULT 0.00, gateway ENUM('stripe','paypal','monnify','paystack','flutterwave','mollie','bank_transfer','store_payment') NOT NULL DEFAULT 'stripe', gateway_reference VARCHAR(100) NOT NULL DEFAULT '', bank_name VARCHAR(100) NOT NULL DEFAULT '', account_number VARCHAR(20) NOT NULL DEFAULT '', status ENUM('pending','processing','success','failed') NOT NULL DEFAULT 'pending', initiated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, completed_at DATETIME NULL, PRIMARY KEY (id), KEY round_id (round_id), KEY collector_user_id (collector_user_id), KEY status (status) ) $charset_collate;\"; // 7. cyclesave_notifications $sql[] = \"CREATE TABLE wp_cyclesave_notifications ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, user_id BIGINT UNSIGNED NOT NULL, group_id BIGINT UNSIGNED NOT NULL, type VARCHAR(80) NOT NULL, subject VARCHAR(255) NOT NULL DEFAULT '', body LONGTEXT NOT NULL, sent_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY user_id (user_id), KEY group_id (group_id), KEY type (type) ) $charset_collate;\"; // 8. cyclesave_cycles $sql[] = \"CREATE TABLE wp_cyclesave_cycles ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, group_id BIGINT UNSIGNED NOT NULL, cycle_number TINYINT UNSIGNED NOT NULL DEFAULT 1, status ENUM('active','completed') NOT NULL DEFAULT 'active', contribution_amount DECIMAL(15,2) NOT NULL DEFAULT 0.00, frequency ENUM('daily','weekly','monthly') NOT NULL DEFAULT 'monthly', max_members TINYINT UNSIGNED NOT NULL DEFAULT 10, started_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, completed_at DATETIME NULL, PRIMARY KEY (id), KEY group_id (group_id), KEY status (status) ) $charset_collate;\"; // 9. cyclesave_payment_events $sql[] = \"CREATE TABLE wp_cyclesave_payment_events ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, contribution_id BIGINT UNSIGNED NOT NULL DEFAULT 0, gateway VARCHAR(50) NOT NULL DEFAULT '', gateway_reference VARCHAR(100) NOT NULL DEFAULT '', event_type VARCHAR(80) NOT NULL DEFAULT '', event_source VARCHAR(80) NOT NULL DEFAULT '', gateway_status VARCHAR(100) NOT NULL DEFAULT '', payload_hash CHAR(64) NOT NULL DEFAULT '', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY contribution_id (contribution_id), KEY gateway_reference (gateway_reference), KEY event_type (event_type), KEY event_source (event_source), KEY payload_hash (payload_hash) ) $charset_collate;\"; foreach ( $sql as $query ) { dbDelta( $query );"},{"table_name":"cyclesave_members","full_table_name":"wp_cyclesave_members","description":"Stores cyclesave members data created by this plugin.","detection_method":"static","confidence":"medium","columns":[],"create_sql":null},{"table_name":"cyclesave_notifications","full_table_name":"wp_cyclesave_notifications","description":"Stores cyclesave notifications data created by this plugin.","detection_method":"static","confidence":"medium","columns":[],"create_sql":null},{"table_name":"cyclesave_payment_events","full_table_name":"wp_cyclesave_payment_events","description":"Stores cyclesave payment events data created by this plugin.","detection_method":"static","confidence":"medium","columns":[],"create_sql":null},{"table_name":"cyclesave_payout_order","full_table_name":"wp_cyclesave_payout_order","description":"Stores order records and related transaction data.","detection_method":"static","confidence":"medium","columns":[],"create_sql":null},{"table_name":"cyclesave_payouts","full_table_name":"wp_cyclesave_payouts","description":"Stores cyclesave payouts data created by this plugin.","detection_method":"static","confidence":"medium","columns":[],"create_sql":null},{"table_name":"cyclesave_rounds","full_table_name":"wp_cyclesave_rounds","description":"Stores cyclesave rounds data created by this plugin.","detection_method":"static","confidence":"high","columns":[],"create_sql":null}],"table_count":9}