Linkedin, Twitter Integration
diff --git a/erpnext/crm/doctype/linkedin_settings/linkedin_settings.js b/erpnext/crm/doctype/linkedin_settings/linkedin_settings.js
index fd169f83..b888e72 100644
--- a/erpnext/crm/doctype/linkedin_settings/linkedin_settings.js
+++ b/erpnext/crm/doctype/linkedin_settings/linkedin_settings.js
@@ -5,7 +5,7 @@
 	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?',
+				__('Session not valid, Do you want to login?'),
 				function(){
 					frm.trigger("login");
 				},
@@ -20,7 +20,7 @@
 			frm.dashboard.set_headline_alert(
 				'<div class="row">' +
 					'<div class="col-xs-12">' +
-						'<span class="indicator whitespace-nowrap red'+ '' +'"><span class="hidden-xs">Session Not Active. Save doc to login.</span></span> ' +
+						'<span class="indicator whitespace-nowrap red"><span class="hidden-xs">'+ __("Session Not Active. Save doc to login.") +'</span></span> ' +
 					'</div>' +
 				'</div>'
 			);
@@ -33,11 +33,11 @@
 			days = Math.floor(days/(1000 * 3600 * 24));
 			let msg,color;
 			if(days>0){
-				msg = "Your Session will be expire in " + days + " days.";
+				msg = __("Your Session will be expire in ") + days + __(" days.");
 				color = "green";
 			}
 			else{
-				msg = "Session is expired. Save doc to login.";
+				msg = __("Session is expired. Save doc to login.");
 				color = "red";
 			}
 			frm.dashboard.set_headline_alert(
diff --git a/erpnext/crm/doctype/social_media_post/social_media_post.js b/erpnext/crm/doctype/social_media_post/social_media_post.js
index 690e27c..517b3b4 100644
--- a/erpnext/crm/doctype/social_media_post/social_media_post.js
+++ b/erpnext/crm/doctype/social_media_post/social_media_post.js
@@ -2,7 +2,17 @@
 // For license information, please see license.txt
 frappe.ui.form.on('Social Media Post', {
     validate: function(frm){
-        if(frm.doc.text.length > 280){
+        if(frm.doc.twitter==0 && frm.doc.linkedin==0){
+            frappe.throw(__("Select atleast one Social Media from 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(__("Invalid Scheduled Time"));
+            }
+        }
+        if(frm.doc.text?.length > 280){
             frappe.throw(__("Length Must be less than 280."))
         }
     },
diff --git a/erpnext/crm/doctype/social_media_post/social_media_post.json b/erpnext/crm/doctype/social_media_post/social_media_post.json
index f8c23a7..2601c14 100644
--- a/erpnext/crm/doctype/social_media_post/social_media_post.json
+++ b/erpnext/crm/doctype/social_media_post/social_media_post.json
@@ -7,7 +7,7 @@
  "engine": "InnoDB",
  "field_order": [
   "campaign_name",
-  "sheduled_time",
+  "scheduled_time",
   "post_status",
   "column_break_6",
   "twitter",
@@ -59,12 +59,6 @@
    "read_only": 1
   },
   {
-   "allow_on_submit": 1,
-   "fieldname": "sheduled_time",
-   "fieldtype": "Datetime",
-   "label": "Scheduled Time"
-  },
-  {
    "depends_on": "eval:doc.twitter ==1",
    "fieldname": "content",
    "fieldtype": "Section Break",
@@ -136,11 +130,18 @@
   {
    "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\""
   }
  ],
  "is_submittable": 1,
  "links": [],
- "modified": "2020-04-18 01:28:35.995490",
+ "modified": "2020-04-21 15:10:04.953713",
  "modified_by": "Administrator",
  "module": "CRM",
  "name": "Social Media Post",
diff --git a/erpnext/crm/doctype/social_media_post/social_media_post.py b/erpnext/crm/doctype/social_media_post/social_media_post.py
index 672486d..2cca608 100644
--- a/erpnext/crm/doctype/social_media_post/social_media_post.py
+++ b/erpnext/crm/doctype/social_media_post/social_media_post.py
@@ -6,10 +6,18 @@
 import frappe
 from frappe.model.document import Document
 from frappe import _
+import datetime
 
 class SocialMediaPost(Document):
+	def validate(self):
+		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(_("Invalid Scheduled Time"))
+
 	def submit(self):
-		if self.sheduled_time:
+		if self.scheduled_time:
 			self.post_status = "Scheduled"
 		super(SocialMediaPost, self).submit()
 
@@ -32,15 +40,14 @@
 			frappe.log_error(message=traceback , title=title)
 
 def process_scheduled_social_media_posts():
-	import datetime
-	posts = frappe.get_list("Social Media Post", filters={"status": "Scheduled"}, fields= ["name", "sheduled_time"])
+	posts = frappe.get_list("Social Media Post", filters={"post_status": "Scheduled", "docstatus":1}, fields= ["name", "scheduled_time","post_status"])
 	start = frappe.utils.now_datetime()
-	end = start + datetime.timedelta(minutes=59)
+	end = start + datetime.timedelta(minutes=10)
 	for post in posts:
-		post_time = frappe.utils.get_datetime(post.scheduled_time)
-		if post_time > start and post_time <= end:
-			post = frappe.get_doc('Social Media Post',post['name'])
-			post.post()
+		if post.scheduled_time:
+			post_time = frappe.utils.get_datetime(post.scheduled_time)
+			if post_time > start and post_time <= end:
+				publish('Social Media Post', post.name)
 
 @frappe.whitelist()
 def publish(doctype, name):
diff --git a/erpnext/crm/doctype/twitter_settings/twitter_settings.js b/erpnext/crm/doctype/twitter_settings/twitter_settings.js
index 359196b..be5ae9d 100644
--- a/erpnext/crm/doctype/twitter_settings/twitter_settings.js
+++ b/erpnext/crm/doctype/twitter_settings/twitter_settings.js
@@ -5,7 +5,7 @@
 	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?',
+				__('Session not valid, Do you want to login?'),
 				function(){
 					frm.trigger("login");
 				},
@@ -20,7 +20,7 @@
 			frm.dashboard.set_headline_alert(
 				'<div class="row">' +
 					'<div class="col-xs-12">' +
-						'<span class="indicator whitespace-nowrap green'+ '' +'"><span class="hidden-xs">Session Active</span></span> ' +
+						'<span class="indicator whitespace-nowrap green"><span class="hidden-xs">'+ __("Session Active") +'</span></span> ' +
 					'</div>' +
 				'</div>'
 			);
@@ -29,7 +29,7 @@
 			frm.dashboard.set_headline_alert(
 				'<div class="row">' +
 					'<div class="col-xs-12">' +
-						'<span class="indicator whitespace-nowrap red'+ '' +'"><span class="hidden-xs">Session Not Active. Save doc to login.</span></span> ' +
+						'<span class="indicator whitespace-nowrap red"><span class="hidden-xs">'+ __("Session Not Active. Save doc to login.") +'</span></span> ' +
 					'</div>' +
 				'</div>'
 			);
diff --git a/erpnext/crm/doctype/twitter_settings/twitter_settings.json b/erpnext/crm/doctype/twitter_settings/twitter_settings.json
index fbdfac9..f92e7f0 100644
--- a/erpnext/crm/doctype/twitter_settings/twitter_settings.json
+++ b/erpnext/crm/doctype/twitter_settings/twitter_settings.json
@@ -31,14 +31,14 @@
    "fieldname": "consumer_key",
    "fieldtype": "Data",
    "in_list_view": 1,
-   "label": "Consumer Key",
+   "label": "API Key",
    "reqd": 1
   },
   {
    "fieldname": "consumer_secret",
    "fieldtype": "Password",
    "in_list_view": 1,
-   "label": "Consumer Secret Key",
+   "label": "API Secret Key",
    "reqd": 1
   },
   {
@@ -77,7 +77,7 @@
  "image_field": "profile_pic",
  "issingle": 1,
  "links": [],
- "modified": "2020-04-08 23:56:20.621246",
+ "modified": "2020-04-21 22:06:43.726798",
  "modified_by": "Administrator",
  "module": "CRM",
  "name": "Twitter Settings",