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));
    }
Example #2
0
        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();
        }
Example #3
0
        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();
        }
Example #4
0
 public static IQueryable <SMSMessageEntity> SMSMessages(this SMSSendPackageEntity e) =>
 As.Expression(() => Database.Query <SMSMessageEntity>().Where(a => a.SendPackage.Is(e)));
Example #5
0
 public static IQueryable <SMSMessageEntity> SMSMessages(this SMSSendPackageEntity e)
 {
     return(SMSMessagesSendExpression.Evaluate(e));
 }
Example #6
0
        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();
        }