refactor!: remove social media post module
diff --git a/erpnext/crm/doctype/linkedin_settings/__init__.py b/erpnext/crm/doctype/linkedin_settings/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/crm/doctype/linkedin_settings/__init__.py
+++ /dev/null
diff --git a/erpnext/crm/doctype/linkedin_settings/linkedin_settings.js b/erpnext/crm/doctype/linkedin_settings/linkedin_settings.js
deleted file mode 100644
index 7d6b395..0000000
--- a/erpnext/crm/doctype/linkedin_settings/linkedin_settings.js
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('LinkedIn Settings', {
-	onload: function(frm) {
-		if (frm.doc.session_status == 'Expired' && frm.doc.consumer_key && frm.doc.consumer_secret) {
-			frappe.confirm(
-				__('Session not valid. Do you want to login?'),
-				function(){
-					frm.trigger("login");
-				},
-				function(){
-					window.close();
-				}
-			);
-		}
-		frm.dashboard.set_headline(__("For more information, {0}.", [`<a target='_blank' href='https://docs.erpnext.com/docs/user/manual/en/CRM/linkedin-settings'>${__('click here')}</a>`]));
-	},
-	refresh: function(frm) {
-		if (frm.doc.session_status=="Expired"){
-			let msg = __("Session not active. Save document to login.");
-			frm.dashboard.set_headline_alert(
-				`<div class="row">
-					<div class="col-xs-12">
-						<span class="indicator whitespace-nowrap red"><span class="hidden-xs">${msg}</span></span>
-					</div>
-				</div>`
-			);
-		}
-
-		if (frm.doc.session_status=="Active"){
-			let d = new Date(frm.doc.modified);
-			d.setDate(d.getDate()+60);
-			let dn = new Date();
-			let days = d.getTime() - dn.getTime();
-			days = Math.floor(days/(1000 * 3600 * 24));
-			let msg,color;
-
-			if (days>0){
-				msg = __("Your session will be expire in {0} days.", [days]);
-				color = "green";
-			}
-			else {
-				msg = __("Session is expired. Save doc to login.");
-				color = "red";
-			}
-
-			frm.dashboard.set_headline_alert(
-				`<div class="row">
-					<div class="col-xs-12">
-						<span class="indicator whitespace-nowrap ${color}"><span class="hidden-xs">${msg}</span></span>
-					</div>
-				</div>`
-			);
-		}
-	},
-	login: function(frm) {
-		if (frm.doc.consumer_key && frm.doc.consumer_secret){
-			frappe.dom.freeze();
-			frappe.call({
-				doc: frm.doc,
-				method: "get_authorization_url",
-				callback : function(r) {
-					window.location.href = r.message;
-				}
-			}).fail(function() {
-				frappe.dom.unfreeze();
-			});
-		}
-	},
-	after_save: function(frm) {
-		frm.trigger("login");
-	}
-});
diff --git a/erpnext/crm/doctype/linkedin_settings/linkedin_settings.json b/erpnext/crm/doctype/linkedin_settings/linkedin_settings.json
deleted file mode 100644
index f882e36..0000000
--- a/erpnext/crm/doctype/linkedin_settings/linkedin_settings.json
+++ /dev/null
@@ -1,112 +0,0 @@
-{
- "actions": [],
- "creation": "2020-01-30 13:36:39.492931",
- "doctype": "DocType",
- "documentation": "https://docs.erpnext.com/docs/user/manual/en/CRM/linkedin-settings",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
-  "account_name",
-  "column_break_2",
-  "company_id",
-  "oauth_details",
-  "consumer_key",
-  "column_break_5",
-  "consumer_secret",
-  "user_details_section",
-  "access_token",
-  "person_urn",
-  "session_status"
- ],
- "fields": [
-  {
-   "fieldname": "account_name",
-   "fieldtype": "Data",
-   "label": "Account Name",
-   "read_only": 1
-  },
-  {
-   "fieldname": "oauth_details",
-   "fieldtype": "Section Break",
-   "label": "OAuth Credentials"
-  },
-  {
-   "fieldname": "consumer_key",
-   "fieldtype": "Data",
-   "in_list_view": 1,
-   "label": "Consumer Key",
-   "reqd": 1
-  },
-  {
-   "fieldname": "consumer_secret",
-   "fieldtype": "Password",
-   "in_list_view": 1,
-   "label": "Consumer Secret",
-   "reqd": 1
-  },
-  {
-   "fieldname": "access_token",
-   "fieldtype": "Data",
-   "hidden": 1,
-   "label": "Access Token",
-   "read_only": 1
-  },
-  {
-   "fieldname": "person_urn",
-   "fieldtype": "Data",
-   "hidden": 1,
-   "label": "Person URN",
-   "read_only": 1
-  },
-  {
-   "fieldname": "column_break_5",
-   "fieldtype": "Column Break"
-  },
-  {
-   "fieldname": "user_details_section",
-   "fieldtype": "Section Break",
-   "label": "User Details"
-  },
-  {
-   "fieldname": "session_status",
-   "fieldtype": "Select",
-   "hidden": 1,
-   "label": "Session Status",
-   "options": "Expired\nActive",
-   "read_only": 1
-  },
-  {
-   "fieldname": "column_break_2",
-   "fieldtype": "Column Break"
-  },
-  {
-   "fieldname": "company_id",
-   "fieldtype": "Data",
-   "label": "Company ID",
-   "reqd": 1
-  }
- ],
- "issingle": 1,
- "links": [],
- "modified": "2021-02-18 15:19:21.920725",
- "modified_by": "Administrator",
- "module": "CRM",
- "name": "LinkedIn Settings",
- "owner": "Administrator",
- "permissions": [
-  {
-   "create": 1,
-   "delete": 1,
-   "email": 1,
-   "print": 1,
-   "read": 1,
-   "role": "System Manager",
-   "share": 1,
-   "write": 1
-  }
- ],
- "quick_entry": 1,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1
-}
\ No newline at end of file
diff --git a/erpnext/crm/doctype/linkedin_settings/linkedin_settings.py b/erpnext/crm/doctype/linkedin_settings/linkedin_settings.py
deleted file mode 100644
index 64b3a01..0000000
--- a/erpnext/crm/doctype/linkedin_settings/linkedin_settings.py
+++ /dev/null
@@ -1,208 +0,0 @@
-# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-from urllib.parse import urlencode
-
-import frappe
-import requests
-from frappe import _
-from frappe.model.document import Document
-from frappe.utils import get_url_to_form
-from frappe.utils.file_manager import get_file_path
-
-
-class LinkedInSettings(Document):
-	@frappe.whitelist()
-	def get_authorization_url(self):
-		params = urlencode(
-			{
-				"response_type": "code",
-				"client_id": self.consumer_key,
-				"redirect_uri": "{0}/api/method/erpnext.crm.doctype.linkedin_settings.linkedin_settings.callback?".format(
-					frappe.utils.get_url()
-				),
-				"scope": "r_emailaddress w_organization_social r_basicprofile r_liteprofile r_organization_social rw_organization_admin w_member_social",
-			}
-		)
-
-		url = "https://www.linkedin.com/oauth/v2/authorization?{}".format(params)
-
-		return url
-
-	def get_access_token(self, code):
-		url = "https://www.linkedin.com/oauth/v2/accessToken"
-		body = {
-			"grant_type": "authorization_code",
-			"code": code,
-			"client_id": self.consumer_key,
-			"client_secret": self.get_password(fieldname="consumer_secret"),
-			"redirect_uri": "{0}/api/method/erpnext.crm.doctype.linkedin_settings.linkedin_settings.callback?".format(
-				frappe.utils.get_url()
-			),
-		}
-		headers = {"Content-Type": "application/x-www-form-urlencoded"}
-
-		response = self.http_post(url=url, data=body, headers=headers)
-		response = frappe.parse_json(response.content.decode())
-		self.db_set("access_token", response["access_token"])
-
-	def get_member_profile(self):
-		response = requests.get(url="https://api.linkedin.com/v2/me", headers=self.get_headers())
-		response = frappe.parse_json(response.content.decode())
-
-		frappe.db.set_value(
-			self.doctype,
-			self.name,
-			{
-				"person_urn": response["id"],
-				"account_name": response["vanityName"],
-				"session_status": "Active",
-			},
-		)
-		frappe.local.response["type"] = "redirect"
-		frappe.local.response["location"] = get_url_to_form("LinkedIn Settings", "LinkedIn Settings")
-
-	def post(self, text, title, media=None):
-		if not media:
-			return self.post_text(text, title)
-		else:
-			media_id = self.upload_image(media)
-
-			if media_id:
-				return self.post_text(text, title, media_id=media_id)
-			else:
-				self.log_error("LinkedIn: Failed to upload media")
-
-	def upload_image(self, media):
-		media = get_file_path(media)
-		register_url = "https://api.linkedin.com/v2/assets?action=registerUpload"
-		body = {
-			"registerUploadRequest": {
-				"recipes": ["urn:li:digitalmediaRecipe:feedshare-image"],
-				"owner": "urn:li:organization:{0}".format(self.company_id),
-				"serviceRelationships": [
-					{"relationshipType": "OWNER", "identifier": "urn:li:userGeneratedContent"}
-				],
-			}
-		}
-		headers = self.get_headers()
-		response = self.http_post(url=register_url, body=body, headers=headers)
-
-		if response.status_code == 200:
-			response = response.json()
-			asset = response["value"]["asset"]
-			upload_url = response["value"]["uploadMechanism"][
-				"com.linkedin.digitalmedia.uploading.MediaUploadHttpRequest"
-			]["uploadUrl"]
-			headers["Content-Type"] = "image/jpeg"
-			response = self.http_post(upload_url, headers=headers, data=open(media, "rb"))
-			if response.status_code < 200 and response.status_code > 299:
-				frappe.throw(
-					_("Error While Uploading Image"),
-					title="{0} {1}".format(response.status_code, response.reason),
-				)
-				return None
-			return asset
-
-		return None
-
-	def post_text(self, text, title, media_id=None):
-		url = "https://api.linkedin.com/v2/shares"
-		headers = self.get_headers()
-		headers["X-Restli-Protocol-Version"] = "2.0.0"
-		headers["Content-Type"] = "application/json; charset=UTF-8"
-
-		body = {
-			"distribution": {"linkedInDistributionTarget": {}},
-			"owner": "urn:li:organization:{0}".format(self.company_id),
-			"subject": title,
-			"text": {"text": text},
-		}
-
-		reference_url = self.get_reference_url(text)
-		if reference_url:
-			body["content"] = {"contentEntities": [{"entityLocation": reference_url}]}
-
-		if media_id:
-			body["content"] = {"contentEntities": [{"entity": media_id}], "shareMediaCategory": "IMAGE"}
-
-		response = self.http_post(url=url, headers=headers, body=body)
-		return response
-
-	def http_post(self, url, headers=None, body=None, data=None):
-		try:
-			response = requests.post(url=url, json=body, data=data, headers=headers)
-			if response.status_code not in [201, 200]:
-				raise
-
-		except Exception as e:
-			self.api_error(response)
-
-		return response
-
-	def get_headers(self):
-		return {"Authorization": "Bearer {}".format(self.access_token)}
-
-	def get_reference_url(self, text):
-		import re
-
-		regex_url = r"http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+"
-		urls = re.findall(regex_url, text)
-		if urls:
-			return urls[0]
-
-	def delete_post(self, post_id):
-		try:
-			response = requests.delete(
-				url="https://api.linkedin.com/v2/shares/urn:li:share:{0}".format(post_id),
-				headers=self.get_headers(),
-			)
-			if response.status_code != 200:
-				raise
-		except Exception:
-			self.api_error(response)
-
-	def get_post(self, post_id):
-		url = "https://api.linkedin.com/v2/organizationalEntityShareStatistics?q=organizationalEntity&organizationalEntity=urn:li:organization:{0}&shares[0]=urn:li:share:{1}".format(
-			self.company_id, post_id
-		)
-
-		try:
-			response = requests.get(url=url, headers=self.get_headers())
-			if response.status_code != 200:
-				raise
-
-		except Exception:
-			self.api_error(response)
-
-		response = frappe.parse_json(response.content.decode())
-		if len(response.elements):
-			return response.elements[0]
-
-		return None
-
-	def api_error(self, response):
-		content = frappe.parse_json(response.content.decode())
-
-		if response.status_code == 401:
-			self.db_set("session_status", "Expired")
-			frappe.db.commit()
-			frappe.throw(content["message"], title=_("LinkedIn Error - Unauthorized"))
-		elif response.status_code == 403:
-			frappe.msgprint(_("You didn't have permission to access this API"))
-			frappe.throw(content["message"], title=_("LinkedIn Error - Access Denied"))
-		else:
-			frappe.throw(response.reason, title=response.status_code)
-
-
-@frappe.whitelist(allow_guest=True)
-def callback(code=None, error=None, error_description=None):
-	if not error:
-		linkedin_settings = frappe.get_doc("LinkedIn Settings")
-		linkedin_settings.get_access_token(code)
-		linkedin_settings.get_member_profile()
-		frappe.db.commit()
-	else:
-		frappe.local.response["type"] = "redirect"
-		frappe.local.response["location"] = get_url_to_form("LinkedIn Settings", "LinkedIn Settings")
diff --git a/erpnext/crm/doctype/linkedin_settings/test_linkedin_settings.py b/erpnext/crm/doctype/linkedin_settings/test_linkedin_settings.py
deleted file mode 100644
index 09732e4..0000000
--- a/erpnext/crm/doctype/linkedin_settings/test_linkedin_settings.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-# import frappe
-import unittest
-
-
-class TestLinkedInSettings(unittest.TestCase):
-	pass
diff --git a/erpnext/crm/doctype/social_media_post/__init__.py b/erpnext/crm/doctype/social_media_post/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/crm/doctype/social_media_post/__init__.py
+++ /dev/null
diff --git a/erpnext/crm/doctype/social_media_post/social_media_post.js b/erpnext/crm/doctype/social_media_post/social_media_post.js
deleted file mode 100644
index 71d044c..0000000
--- a/erpnext/crm/doctype/social_media_post/social_media_post.js
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and contributors
-// For license information, please see license.txt
-frappe.ui.form.on('Social Media Post', {
-	validate: function(frm) {
-		if (frm.doc.linkedin === 0) {
-			frappe.throw(__("Select atleast one Social Media Platform to Share on."));
-		}
-		if (frm.doc.scheduled_time) {
-			let scheduled_time = new Date(frm.doc.scheduled_time);
-			let date_time = new Date();
-			if (scheduled_time.getTime() < date_time.getTime()) {
-				frappe.throw(__("Scheduled Time must be a future time."));
-			}
-		}
-		frm.trigger('validate_tweet_length');
-	},
-
-	text: function(frm) {
-		if (frm.doc.text) {
-			frm.set_df_property('text', 'description', `${frm.doc.text.length}/280`);
-			frm.refresh_field('text');
-			frm.trigger('validate_tweet_length');
-		}
-	},
-
-	validate_tweet_length: function(frm) {
-		if (frm.doc.text && frm.doc.text.length > 280) {
-			frappe.throw(__("Tweet length Must be less than 280."));
-		}
-	},
-
-	onload: function(frm) {
-		frm.trigger('make_dashboard');
-	},
-
-	make_dashboard: function(frm) {
-		if (frm.doc.post_status == "Posted") {
-			frappe.call({
-				doc: frm.doc,
-				method: 'get_post',
-				freeze: true,
-				callback: (r) => {
-					if (!r.message) {
-						return;
-					}
-
-					let datasets = [], colors = [];
-					if (r.message && r.message.linkedin) {
-						colors.push('#0077b5');
-						datasets.push({
-							name: 'LinkedIn',
-							values: [r.message.linkedin.totalShareStatistics.likeCount, r.message.linkedin.totalShareStatistics.shareCount]
-						});
-					}
-
-					if (datasets.length) {
-						frm.dashboard.render_graph({
-							data: {
-								labels: ['Likes', 'Retweets/Shares'],
-								datasets: datasets
-							},
-
-							title: __("Post Metrics"),
-							type: 'bar',
-							height: 300,
-							colors: colors
-						});
-					}
-				}
-			});
-		}
-	},
-
-	refresh: function(frm) {
-		frm.trigger('text');
-
-		if (frm.doc.docstatus === 1) {
-			if (!['Posted', 'Deleted'].includes(frm.doc.post_status)) {
-				frm.trigger('add_post_btn');
-			}
-			if (frm.doc.post_status !='Deleted') {
-				frm.add_custom_button(__('Delete Post'), function() {
-					frappe.confirm(__('Are you sure want to delete the Post from Social Media platforms?'),
-						function() {
-							frappe.call({
-								doc: frm.doc,
-								method: 'delete_post',
-								freeze: true,
-								callback: () => {
-									frm.reload_doc();
-								}
-							});
-						}
-					);
-				});
-			}
-
-			if (frm.doc.post_status !='Deleted') {
-				let html='';
-				if (frm.doc.linkedin) {
-					let color = frm.doc.linkedin_post_id ? "green" : "red";
-					let status = frm.doc.linkedin_post_id ? "Posted" : "Not Posted";
-					html += `<div class="col-xs-6">
-								<span class="indicator whitespace-nowrap ${color}"><span>LinkedIn : ${status} </span></span>
-							</div>` ;
-				}
-				html = `<div class="row">${html}</div>`;
-				frm.dashboard.set_headline_alert(html);
-			}
-		}
-	},
-
-	add_post_btn: function(frm) {
-		frm.add_custom_button(__('Post Now'), function() {
-			frappe.call({
-				doc: frm.doc,
-				method: 'post',
-				freeze: true,
-				callback: function() {
-					frm.reload_doc();
-				}
-			});
-		});
-	}
-});
diff --git a/erpnext/crm/doctype/social_media_post/social_media_post.json b/erpnext/crm/doctype/social_media_post/social_media_post.json
deleted file mode 100644
index 1e3e01c..0000000
--- a/erpnext/crm/doctype/social_media_post/social_media_post.json
+++ /dev/null
@@ -1,169 +0,0 @@
-{
- "actions": [],
- "autoname": "format: CRM-SMP-{YYYY}-{MM}-{DD}-{###}",
- "creation": "2020-01-30 11:53:13.872864",
- "doctype": "DocType",
- "documentation": "https://docs.erpnext.com/docs/user/manual/en/CRM/social-media-post",
- "editable_grid": 1,
- "engine": "InnoDB",
- "field_order": [
-  "title",
-  "campaign_name",
-  "scheduled_time",
-  "post_status",
-  "column_break_6",
-  "linkedin",
-  "linkedin_post_id",
-  "linkedin_section",
-  "linkedin_post",
-  "column_break_15",
-  "attachments_section",
-  "image",
-  "amended_from"
- ],
- "fields": [
-  {
-   "fieldname": "image",
-   "fieldtype": "Attach Image",
-   "label": "Image"
-  },
-  {
-   "default": "1",
-   "fieldname": "linkedin",
-   "fieldtype": "Check",
-   "label": "LinkedIn"
-  },
-  {
-   "fieldname": "amended_from",
-   "fieldtype": "Link",
-   "label": "Amended From",
-   "no_copy": 1,
-   "options": "Social Media Post",
-   "print_hide": 1,
-   "read_only": 1
-  },
-  {
-   "allow_on_submit": 1,
-   "fieldname": "post_status",
-   "fieldtype": "Select",
-   "label": "Post Status",
-   "no_copy": 1,
-   "options": "\nScheduled\nPosted\nCancelled\nDeleted\nError",
-   "read_only": 1
-  },
-  {
-   "allow_on_submit": 1,
-   "fieldname": "linkedin_post_id",
-   "fieldtype": "Data",
-   "hidden": 1,
-   "label": "LinkedIn Post Id",
-   "no_copy": 1,
-   "read_only": 1
-  },
-  {
-   "fieldname": "campaign_name",
-   "fieldtype": "Link",
-   "in_list_view": 1,
-   "label": "Campaign",
-   "options": "Campaign"
-  },
-  {
-   "fieldname": "column_break_6",
-   "fieldtype": "Column Break",
-   "label": "Share On"
-  },
-  {
-   "collapsible": 1,
-   "depends_on": "eval:doc.linkedin==1",
-   "fieldname": "linkedin_section",
-   "fieldtype": "Section Break",
-   "label": "LinkedIn"
-  },
-  {
-   "collapsible": 1,
-   "fieldname": "attachments_section",
-   "fieldtype": "Section Break",
-   "label": "Attachments"
-  },
-  {
-   "fieldname": "linkedin_post",
-   "fieldtype": "Text",
-   "label": "Post",
-   "mandatory_depends_on": "eval:doc.linkedin ==1"
-  },
-  {
-   "fieldname": "column_break_15",
-   "fieldtype": "Column Break"
-  },
-  {
-   "allow_on_submit": 1,
-   "fieldname": "scheduled_time",
-   "fieldtype": "Datetime",
-   "label": "Scheduled Time",
-   "read_only_depends_on": "eval:doc.post_status == \"Posted\""
-  },
-  {
-   "fieldname": "title",
-   "fieldtype": "Data",
-   "label": "Title",
-   "reqd": 1
-  }
- ],
- "is_submittable": 1,
- "links": [],
- "modified": "2023-09-14 11:24:29.105683",
- "modified_by": "Administrator",
- "module": "CRM",
- "name": "Social Media Post",
- "naming_rule": "Expression",
- "owner": "Administrator",
- "permissions": [
-  {
-   "cancel": 1,
-   "create": 1,
-   "delete": 1,
-   "email": 1,
-   "export": 1,
-   "print": 1,
-   "read": 1,
-   "report": 1,
-   "role": "System Manager",
-   "share": 1,
-   "submit": 1,
-   "write": 1
-  },
-  {
-   "cancel": 1,
-   "create": 1,
-   "delete": 1,
-   "email": 1,
-   "export": 1,
-   "print": 1,
-   "read": 1,
-   "report": 1,
-   "role": "Sales User",
-   "share": 1,
-   "submit": 1,
-   "write": 1
-  },
-  {
-   "cancel": 1,
-   "create": 1,
-   "delete": 1,
-   "email": 1,
-   "export": 1,
-   "print": 1,
-   "read": 1,
-   "report": 1,
-   "role": "Sales Manager",
-   "share": 1,
-   "submit": 1,
-   "write": 1
-  }
- ],
- "sort_field": "modified",
- "sort_order": "DESC",
- "states": [],
- "title_field": "title",
- "track_changes": 1
-}
\ No newline at end of file
diff --git a/erpnext/crm/doctype/social_media_post/social_media_post.py b/erpnext/crm/doctype/social_media_post/social_media_post.py
deleted file mode 100644
index 9615a83..0000000
--- a/erpnext/crm/doctype/social_media_post/social_media_post.py
+++ /dev/null
@@ -1,77 +0,0 @@
-# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and contributors
-# For license information, please see license.txt
-
-
-import datetime
-
-import frappe
-from frappe import _
-from frappe.model.document import Document
-
-
-class SocialMediaPost(Document):
-	def validate(self):
-		if not self.linkedin:
-			frappe.throw(_("Select atleast one Social Media Platform to Share on."))
-
-		if self.scheduled_time:
-			current_time = frappe.utils.now_datetime()
-			scheduled_time = frappe.utils.get_datetime(self.scheduled_time)
-			if scheduled_time < current_time:
-				frappe.throw(_("Scheduled Time must be a future time."))
-
-		if self.text and len(self.text) > 280:
-			frappe.throw(_("Tweet length must be less than 280."))
-
-	def submit(self):
-		if self.scheduled_time:
-			self.post_status = "Scheduled"
-		super(SocialMediaPost, self).submit()
-
-	def on_cancel(self):
-		self.db_set("post_status", "Cancelled")
-
-	@frappe.whitelist()
-	def delete_post(self):
-		if self.linkedin and self.linkedin_post_id:
-			linkedin = frappe.get_doc("LinkedIn Settings")
-			linkedin.delete_post(self.linkedin_post_id)
-
-		self.db_set("post_status", "Deleted")
-
-	@frappe.whitelist()
-	def get_post(self):
-		response = {}
-		if self.linkedin and self.linkedin_post_id:
-			linkedin = frappe.get_doc("LinkedIn Settings")
-			response["linkedin"] = linkedin.get_post(self.linkedin_post_id)
-		return response
-
-	@frappe.whitelist()
-	def post(self):
-		try:
-			if self.linkedin and not self.linkedin_post_id:
-				linkedin = frappe.get_doc("LinkedIn Settings")
-				linkedin_post = linkedin.post(self.linkedin_post, self.title, self.image)
-				self.db_set("linkedin_post_id", linkedin_post.headers["X-RestLi-Id"])
-			self.db_set("post_status", "Posted")
-
-		except Exception:
-			self.db_set("post_status", "Error")
-			self.log_error("Social posting failed")
-
-
-def process_scheduled_social_media_posts():
-	posts = frappe.get_all(
-		"Social Media Post",
-		filters={"post_status": "Scheduled", "docstatus": 1},
-		fields=["name", "scheduled_time"],
-	)
-	start = frappe.utils.now_datetime()
-	end = start + datetime.timedelta(minutes=10)
-	for post in posts:
-		if post.scheduled_time:
-			post_time = frappe.utils.get_datetime(post.scheduled_time)
-			if post_time > start and post_time <= end:
-				sm_post = frappe.get_doc("Social Media Post", post.name)
-				sm_post.post()
diff --git a/erpnext/crm/doctype/social_media_post/social_media_post_list.js b/erpnext/crm/doctype/social_media_post/social_media_post_list.js
deleted file mode 100644
index a8c8272..0000000
--- a/erpnext/crm/doctype/social_media_post/social_media_post_list.js
+++ /dev/null
@@ -1,11 +0,0 @@
-frappe.listview_settings['Social Media Post'] = {
-	add_fields: ["status", "post_status"],
-	get_indicator: function(doc) {
-		return [__(doc.post_status), {
-			"Scheduled": "orange",
-			"Posted": "green",
-			"Error": "red",
-			"Deleted": "red"
-		}[doc.post_status]];
-	}
-}
diff --git a/erpnext/crm/doctype/social_media_post/test_social_media_post.py b/erpnext/crm/doctype/social_media_post/test_social_media_post.py
deleted file mode 100644
index 7574476..0000000
--- a/erpnext/crm/doctype/social_media_post/test_social_media_post.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors
-# See license.txt
-
-# import frappe
-import unittest
-
-
-class TestSocialMediaPost(unittest.TestCase):
-	pass
diff --git a/erpnext/crm/workspace/crm/crm.json b/erpnext/crm/workspace/crm/crm.json
index b107df7..4b5b9af 100644
--- a/erpnext/crm/workspace/crm/crm.json
+++ b/erpnext/crm/workspace/crm/crm.json
@@ -125,131 +125,6 @@
   {
    "hidden": 0,
    "is_query_report": 0,
-   "label": "Campaign",
-   "link_count": 0,
-   "onboard": 0,
-   "type": "Card Break"
-  },
-  {
-   "dependencies": "",
-   "hidden": 0,
-   "is_query_report": 0,
-   "label": "Campaign",
-   "link_count": 0,
-   "link_to": "Campaign",
-   "link_type": "DocType",
-   "onboard": 0,
-   "type": "Link"
-  },
-  {
-   "dependencies": "",
-   "hidden": 0,
-   "is_query_report": 0,
-   "label": "Email Campaign",
-   "link_count": 0,
-   "link_to": "Email Campaign",
-   "link_type": "DocType",
-   "onboard": 0,
-   "type": "Link"
-  },
-  {
-   "dependencies": "",
-   "hidden": 0,
-   "is_query_report": 0,
-   "label": "Social Media Post",
-   "link_count": 0,
-   "link_to": "Social Media Post",
-   "link_type": "DocType",
-   "onboard": 0,
-   "type": "Link"
-  },
-  {
-   "dependencies": "",
-   "hidden": 0,
-   "is_query_report": 0,
-   "label": "SMS Center",
-   "link_count": 0,
-   "link_to": "SMS Center",
-   "link_type": "DocType",
-   "onboard": 0,
-   "type": "Link"
-  },
-  {
-   "dependencies": "",
-   "hidden": 0,
-   "is_query_report": 0,
-   "label": "SMS Log",
-   "link_count": 0,
-   "link_to": "SMS Log",
-   "link_type": "DocType",
-   "onboard": 0,
-   "type": "Link"
-  },
-  {
-   "dependencies": "",
-   "hidden": 0,
-   "is_query_report": 0,
-   "label": "Email Group",
-   "link_count": 0,
-   "link_to": "Email Group",
-   "link_type": "DocType",
-   "onboard": 0,
-   "type": "Link"
-  },
-  {
-   "hidden": 0,
-   "is_query_report": 0,
-   "label": "Settings",
-   "link_count": 0,
-   "onboard": 0,
-   "type": "Card Break"
-  },
-  {
-   "hidden": 0,
-   "is_query_report": 0,
-   "label": "CRM Settings",
-   "link_count": 0,
-   "link_to": "CRM Settings",
-   "link_type": "DocType",
-   "onboard": 0,
-   "type": "Link"
-  },
-  {
-   "dependencies": "",
-   "hidden": 0,
-   "is_query_report": 0,
-   "label": "SMS Settings",
-   "link_count": 0,
-   "link_to": "SMS Settings",
-   "link_type": "DocType",
-   "onboard": 0,
-   "type": "Link"
-  },
-  {
-   "dependencies": "",
-   "hidden": 0,
-   "is_query_report": 0,
-   "label": "Twitter Settings",
-   "link_count": 0,
-   "link_to": "Twitter Settings",
-   "link_type": "DocType",
-   "onboard": 0,
-   "type": "Link"
-  },
-  {
-   "dependencies": "",
-   "hidden": 0,
-   "is_query_report": 0,
-   "label": "LinkedIn Settings",
-   "link_count": 0,
-   "link_to": "LinkedIn Settings",
-   "link_type": "DocType",
-   "onboard": 0,
-   "type": "Link"
-  },
-  {
-   "hidden": 0,
-   "is_query_report": 0,
    "label": "Maintenance",
    "link_count": 0,
    "onboard": 0,
@@ -450,9 +325,101 @@
    "link_type": "DocType",
    "onboard": 0,
    "type": "Link"
+  },
+  {
+   "hidden": 0,
+   "is_query_report": 0,
+   "label": "Settings",
+   "link_count": 2,
+   "onboard": 0,
+   "type": "Card Break"
+  },
+  {
+   "hidden": 0,
+   "is_query_report": 0,
+   "label": "CRM Settings",
+   "link_count": 0,
+   "link_to": "CRM Settings",
+   "link_type": "DocType",
+   "onboard": 0,
+   "type": "Link"
+  },
+  {
+   "dependencies": "",
+   "hidden": 0,
+   "is_query_report": 0,
+   "label": "SMS Settings",
+   "link_count": 0,
+   "link_to": "SMS Settings",
+   "link_type": "DocType",
+   "onboard": 0,
+   "type": "Link"
+  },
+  {
+   "hidden": 0,
+   "is_query_report": 0,
+   "label": "Campaign",
+   "link_count": 5,
+   "onboard": 0,
+   "type": "Card Break"
+  },
+  {
+   "dependencies": "",
+   "hidden": 0,
+   "is_query_report": 0,
+   "label": "Campaign",
+   "link_count": 0,
+   "link_to": "Campaign",
+   "link_type": "DocType",
+   "onboard": 0,
+   "type": "Link"
+  },
+  {
+   "dependencies": "",
+   "hidden": 0,
+   "is_query_report": 0,
+   "label": "Email Campaign",
+   "link_count": 0,
+   "link_to": "Email Campaign",
+   "link_type": "DocType",
+   "onboard": 0,
+   "type": "Link"
+  },
+  {
+   "dependencies": "",
+   "hidden": 0,
+   "is_query_report": 0,
+   "label": "SMS Center",
+   "link_count": 0,
+   "link_to": "SMS Center",
+   "link_type": "DocType",
+   "onboard": 0,
+   "type": "Link"
+  },
+  {
+   "dependencies": "",
+   "hidden": 0,
+   "is_query_report": 0,
+   "label": "SMS Log",
+   "link_count": 0,
+   "link_to": "SMS Log",
+   "link_type": "DocType",
+   "onboard": 0,
+   "type": "Link"
+  },
+  {
+   "dependencies": "",
+   "hidden": 0,
+   "is_query_report": 0,
+   "label": "Email Group",
+   "link_count": 0,
+   "link_to": "Email Group",
+   "link_type": "DocType",
+   "onboard": 0,
+   "type": "Link"
   }
  ],
- "modified": "2023-05-26 16:49:04.298122",
+ "modified": "2023-09-14 12:11:03.968048",
  "modified_by": "Administrator",
  "module": "CRM",
  "name": "CRM",
@@ -463,7 +430,7 @@
  "quick_lists": [],
  "restrict_to_domain": "",
  "roles": [],
- "sequence_id": 10.0,
+ "sequence_id": 17.0,
  "shortcuts": [
   {
    "color": "Blue",
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index 41db6b3..c7398cc 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -423,9 +423,6 @@
 			"erpnext.stock.reorder_item.reorder_item",
 		],
 	},
-	"all": [
-		"erpnext.crm.doctype.social_media_post.social_media_post.process_scheduled_social_media_posts",
-	],
 	"hourly": [
 		"erpnext.erpnext_integrations.doctype.plaid_settings.plaid_settings.automatic_synchronization",
 		"erpnext.projects.doctype.project.project.project_status_update_reminder",
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 22c3715..7a07f56 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -340,6 +340,8 @@
 erpnext.patches.v14_0.single_to_multi_dunning
 execute:frappe.db.set_single_value('Selling Settings', 'allow_negative_rates_for_items', 0)
 execute:frappe.delete_doc('DocType', 'Twitter Settings', ignore_missing=True)
+execute:frappe.delete_doc('DocType', 'LinkedIn Settings', ignore_missing=True)
+execute:frappe.delete_doc('DocType', 'Social Media Post', ignore_missing=True)
 erpnext.patches.v15_0.correct_asset_value_if_je_with_workflow
 erpnext.patches.v15_0.delete_woocommerce_settings_doctype
 # below migration patch should always run last