Beispiel #1
0
        public bool ExecuteMonthlyPayout(int year, int month, List <BasePayoutSelectionToken> include, out int execId, out string error)
        {
            error  = string.Empty;
            execId = -1;
            try
            {
                var today = DateTime.Now;

                var firstCurrent = new DateTime(today.Year, today.Month, 1);
                var firstReport  = new DateTime(year, month, 1);

                if (firstCurrent.Date <= firstReport.Date)
                {
                    error = "payout for future period not allowed";
                    return(false);
                }

                using (var context = new lfeAuthorEntities())
                {
                    //create data
                    context.sp_PO_SaveMonthlyPayoutStatment(year, month, LFE_COMMISSION_PERCENT, CurrentUserId);


                    var token = GetPayoutExecutionDto(year, month);


                    if (token.ExecutionId < 0)
                    {
                        error = "Data saving failed. Contact development team";
                        return(false);
                    }

                    execId = token.ExecutionId;

                    if (include.Count > 0)
                    {
                        var statments = UserPayoutStatmentsRepository.GetMany(x => x.ExecutionId == token.ExecutionId && x.StatusId == (byte)BillingEnums.ePayoutStatuses.WAIT).ToList();

                        foreach (var statement in statments.Where(statement => !include.Any(x => x.userId == statement.UserId && x.currId == statement.CurrencyId)))
                        {
                            UpdateUserPayoutRecord(statement.PayoutId, BillingEnums.ePayoutStatuses.SKIP, "skipped by admin");
                        }
                    }

                    var list2Pay = GetPayoutStatments(token.ExecutionId).Where(x => x.Status == BillingEnums.ePayoutStatuses.WAIT).ToArray();

                    var paymentItems = new List <MassPayRequestItemType>();

                    foreach (var po_token in list2Pay)
                    {
                        // ExecuteSinglePayment(po_token, out error);
                        var item = CreateMassPayRequestItem(po_token, String.Format("{0}-{1} Payment", year, month), out error);

                        if (item != null)
                        {
                            paymentItems.Add(item);
                        }
                    }

                    if (paymentItems.Any())
                    {
                        var currencies = paymentItems.GroupBy(x => new { x.Amount.currencyID }).Select(x => x.Key.currencyID).ToArray();

                        foreach (var currency in currencies)
                        {
                            var currencyItems = paymentItems.Where(x => x.Amount.currencyID == currency).ToList();

                            var executed = _paypalPaymentServices.ExecuteMassPayment(currencyItems, out error);

                            var status = executed ? BillingEnums.ePayoutStatuses.WAIT_4_IPN : BillingEnums.ePayoutStatuses.FAILED;

                            foreach (var row in currencyItems)
                            {
                                UpdateUserPayoutRecord(Convert.ToInt32(row.UniqueId), status, executed ? string.Empty : error, null);
                            }
                        }
                    }


                    var payouts = UserPayoutStatmentsRepository.GetMany(x => x.ExecutionId == token.ExecutionId).ToArray();

                    var successCount = payouts.Count(x => x.StatusId == (byte)BillingEnums.ePayoutStatuses.WAIT_4_IPN);

                    if (successCount.Equals(0))
                    {
                        UpdatePayoutExecutionRecord(token.ExecutionId, BillingEnums.ePayoutStatuses.FAILED);
                        return(true);
                    }

                    if (successCount < payouts.Count())
                    {
                        UpdatePayoutExecutionRecord(token.ExecutionId, BillingEnums.ePayoutStatuses.PARTIALLY);
                        return(true);
                    }

                    UpdatePayoutExecutionRecord(token.ExecutionId, BillingEnums.ePayoutStatuses.COMPLETED);


                    return(true);
                }
            }
            catch (Exception ex)
            {
                error = FormatError(ex);
                Logger.Error("ExecuteMonthlyPayout::" + year + "::" + month, ex, CommonEnums.LoggerObjectTypes.Payout);
                return(false);
            }
        }