public void Execute(ExecutingProcess executingProcess) { SMSSendPackageEntity package = (SMSSendPackageEntity)executingProcess.Data !; executingProcess.ForEachLine(package.SMSMessages().Where(s => s.State == SMSMessageState.Created), sms => sms.Execute(SMSMessageOperation.Send)); }
public static void RegisterSMSOwnerData <T>(Expression <Func <T, SMSOwnerData> > phoneExpression) where T : Entity { new Graph <ProcessEntity> .ConstructFromMany <T>(SMSMessageOperation.SendMultipleSMSMessages) { Construct = (providers, args) => { var sMSOwnerDatas = Database.Query <T>().Where(p => providers.Contains(p.ToLite())) .Select(pr => phoneExpression.Evaluate(pr)) .AsEnumerable().NotNull().Distinct().ToList(); MultipleSMSModel model = args.GetArg <MultipleSMSModel>(); IntegrityCheck?ic = model.IntegrityCheck(); if (!model.Message.HasText()) { throw new ApplicationException("The text for the SMS message has not been set"); } var owners = (from od in sMSOwnerDatas from n in od.TelephoneNumber.SplitNoEmpty(",") select new { TelephoneNumber = n, SMSOwnerData = od }); if (!owners.Any()) { return(null); } SMSSendPackageEntity package = new SMSSendPackageEntity().Save(); var packLite = package.ToLite(); using (OperationLogic.AllowSave <SMSMessageEntity>()) { owners.Select(o => new SMSMessageEntity { DestinationNumber = o.TelephoneNumber, SendPackage = packLite, Referred = o.SMSOwnerData.Owner, Message = model.Message, From = model.From, Certified = model.Certified, State = SMSMessageState.Created, }).SaveList(); } var process = ProcessLogic.Create(SMSMessageProcess.Send, package); process.Execute(ProcessOperation.Execute); return(process); } } .Register(); }
public static void RegisterPhoneNumberProvider <T>(Expression <Func <T, string> > phoneExpression, Expression <Func <T, CultureInfo> > cultureExpression) where T : Entity { phoneNumberProviders[typeof(T)] = phoneExpression; cultureProviders[typeof(T)] = cultureExpression; new Graph <ProcessEntity> .ConstructFromMany <T>(SMSMessageOperation.SendSMSMessages) { Construct = (providers, args) => { var numbers = Database.Query <T>().Where(p => providers.Contains(p.ToLite())) .Select(pr => new { Exp = phoneExpression.Evaluate(pr), Referred = pr.ToLite() }).AsEnumerable().NotNull().Distinct().ToList(); var splitNumbers = (from p in numbers.Where(p => p.Exp.Contains(',')) from n in p.Exp.Split('n') select new { Exp = n.Trim(), p.Referred }).Concat(numbers.Where(p => !p.Exp.Contains(','))).Distinct().ToList(); numbers = splitNumbers; MultipleSMSModel model = args.GetArg <MultipleSMSModel>(); IntegrityCheck ic = model.IntegrityCheck(); if (!model.Message.HasText()) { throw new ApplicationException("The text for the SMS message has not been set"); } SMSSendPackageEntity package = new SMSSendPackageEntity().Save(); var packLite = package.ToLite(); using (OperationLogic.AllowSave <SMSMessageEntity>()) numbers.Select(n => new SMSMessageEntity { DestinationNumber = n.Exp, SendPackage = packLite, Referred = n.Referred, Message = model.Message, From = model.From, Certified = model.Certified, State = SMSMessageState.Created, }).SaveList(); var process = ProcessLogic.Create(SMSMessageProcess.Send, package); process.Execute(ProcessOperation.Execute); return(process); } } .Register(); }
public static IQueryable <SMSMessageEntity> SMSMessages(this SMSSendPackageEntity e) => As.Expression(() => Database.Query <SMSMessageEntity>().Where(a => a.SendPackage.Is(e)));
public static IQueryable <SMSMessageEntity> SMSMessages(this SMSSendPackageEntity e) { return(SMSMessagesSendExpression.Evaluate(e)); }
public static void RegisterDataObjectProvider <T, A>(Expression <Func <T, A> > func) where T : Entity { dataObjectProviders[typeof(T)] = func; new Graph <ProcessEntity> .ConstructFromMany <T>(SMSMessageOperation.SendSMSMessagesFromTemplate) { Construct = (providers, args) => { var template = args.GetArg <SMSTemplateEntity>(); if (TypeLogic.EntityToType[template.AssociatedType] != typeof(T)) { throw new ArgumentException("The SMS template is associated with the type {0} instead of {1}" .FormatWith(template.AssociatedType.FullClassName, typeof(T).FullName)); } var phoneFunc = (Expression <Func <T, string> >)phoneNumberProviders .GetOrThrow(typeof(T), "{0} is not registered as PhoneNumberProvider".FormatWith(typeof(T).NiceName())); var cultureFunc = (Expression <Func <T, CultureInfo> >)cultureProviders .GetOrThrow(typeof(T), "{0} is not registered as CultureProvider".FormatWith(typeof(T).NiceName())); var numbers = Database.Query <T>().Where(p => providers.Contains(p.ToLite())) .Select(p => new { Phone = phoneFunc.Evaluate(p), Data = func.Evaluate(p), Referred = p.ToLite(), Culture = cultureFunc.Evaluate(p) }).Where(n => n.Phone.HasText()).AsEnumerable().ToList(); var splitdNumbers = (from p in numbers.Where(p => p.Phone.Contains(',')) from n in p.Phone.Split(',') select new { Phone = n.Trim(), p.Data, p.Referred, p.Culture }).Concat(numbers.Where(p => !p.Phone.Contains(','))).Distinct().ToList(); numbers = splitdNumbers; SMSSendPackageEntity package = new SMSSendPackageEntity().Save(); var packLite = package.ToLite(); using (OperationLogic.AllowSave <SMSMessageEntity>()) { numbers.Select(n => new SMSMessageEntity { Message = template.ComposeMessage(n.Data, n.Culture), EditableMessage = template.EditableMessage, From = template.From, DestinationNumber = n.Phone, SendPackage = packLite, State = SMSMessageState.Created, Referred = n.Referred }).SaveList(); } var process = ProcessLogic.Create(SMSMessageProcess.Send, package); process.Execute(ProcessOperation.Execute); return(process); } } .Register(); new Graph <SMSMessageEntity> .ConstructFrom <T>(SMSMessageOperation.CreateSMSWithTemplateFromEntity) { Construct = (provider, args) => { var template = args.GetArg <SMSTemplateEntity>(); if (template.AssociatedType != null && TypeLogic.EntityToType[template.AssociatedType] != typeof(T)) { throw new ArgumentException("The SMS template is associated with the type {0} instead of {1}" .FormatWith(template.AssociatedType.FullClassName, typeof(T).FullName)); } return(new SMSMessageEntity { Message = template.ComposeMessage(func.Evaluate(provider), GetCulture(provider)), EditableMessage = template.EditableMessage, From = template.From, DestinationNumber = GetPhoneNumber(provider), State = SMSMessageState.Created, Referred = provider.ToLite(), Certified = template.Certified }); } } .Register(); }