public static void SendToVendor(OrderVia orderVia, Guid?vendorId, string orderNumber, string[] segmentsSelected, string whiteLabelDomain)
        {
            using (var db = new WfpictContext())
            {
                Campaign campaign = db.Campaigns
                                    .Include(x => x.Assets)
                                    .Include(x => x.Segments)
                                    .Include(x => x.Testing)
                                    .Include(x => x.Approved)
                                    .Include(x => x.Trackings)
                                    .FirstOrDefault(x => x.OrderNumber == orderNumber);

                var vendor = db.Vendors.FirstOrDefault(x => x.Id == vendorId);

                if (segmentsSelected == null)
                {
                    SendToVendorSingle(orderVia, db, campaign, vendor, whiteLabelDomain);
                }
                else // Segments
                {
                    SendToVendorMulti(orderVia, db, campaign, vendor, segmentsSelected, whiteLabelDomain);
                }

                // Put campaign to monitoring if no segments is in generated/approved state
                var ifSomeSegmentsRemaining = db.CampaignSegments
                                              .Where(c => c.CampaignId == campaign.Id)
                                              .Any(x => x.SegmentStatus == (int)SegmentStatus.Generated || x.SegmentStatus == (int)SegmentStatus.Approved);
                if (!ifSomeSegmentsRemaining)
                {
                    campaign.Status = (int)CampaignStatus.Monitoring;
                    db.SaveChanges();
                }
            }
        }
        public ActionResult SendToVendor(OrderVia via, Guid?vendorId, Guid?id, string[] segmentsSelected)
        {
            try
            {
                Campaign campaign = Db.Campaigns.Include(x => x.Approved).FirstOrDefault(x => x.Id == id);
                if (campaign == null)
                {
                    throw new AdsException("Campagin with Id: " + id + " Not Found.");
                }
                if (campaign.Approved == null)
                {
                    throw new AdsException("Campagin: " + campaign.CampaignName + " is not yet approved.");
                }

                switch (via)
                {
                case OrderVia.Email:
                    BackgroundJob.Enqueue(() => CampaignProcessor.SendToVendor(via, vendorId, campaign.OrderNumber, segmentsSelected, string.Empty));
                    break;

                case OrderVia.Api:
                    string whiteLabel       = LoggedInUser?.CustomerId == null ? "ADS" : LoggedInUser?.Customer.WhiteLabel;
                    string whiteLabelDomain = Db.Customers.FirstOrDefault(x => x.WhiteLabel == whiteLabel)?.WebDomain;
                    if (string.IsNullOrEmpty(whiteLabelDomain))
                    {
                        throw new AdsException("White Label Web Domain can not be empty.");
                    }
                    CampaignProcessor.SendToVendor(via, vendorId, campaign.OrderNumber, segmentsSelected, whiteLabelDomain);
                    break;
                }

                return(Json(new JsonResponse()
                {
                    IsSucess = true
                }, JsonRequestBehavior.AllowGet));
            }
            catch (Exception ex)
            {
                return(Json(new JsonResponse()
                {
                    IsSucess = false, ErrorMessage = ex.Message
                }, JsonRequestBehavior.AllowGet));
            }
        }
示例#3
0
        private ActionResult Rebroad(OrderVia via, Guid?id, DateTime?reBroadcastedDate, long reBroadcastedQuantity, Guid?vendor)
        {
            if (reBroadcastedDate == null || vendor == null)
            {
                TempData["Error"] = $"ReBroadcastedDate and Vendor is required.";
                return(RedirectToAction("Rebroad", "Campaigns", new { id = id }));
            }
            Campaign campaign = Db.Campaigns.FirstOrDefault(x => x.Id == id);

            if (campaign.ReBroadcasted)
            {
                TempData["Error"] = $"Already rebroadcasted.";
                return(RedirectToAction("Rebroad", "Campaigns", new { id = id }));
            }
            campaign.ReBroadcasted            = true;
            campaign.ReBroadcastedDate        = reBroadcastedDate;
            campaign.ReBroadcastedQuantity    = reBroadcastedQuantity;
            campaign.ReBroadcastedOrderNumber = campaign.OrderNumber + "RDP";
            Db.SaveChanges();

            switch (via)
            {
            case OrderVia.Email:
                BackgroundJob.Enqueue(() => CampaignProcessor.SendToVendor(via, vendor, campaign.OrderNumber, null, string.Empty));
                break;

            case OrderVia.Api:
                string whiteLabel       = LoggedInUser?.CustomerId == null ? "ADS" : LoggedInUser?.Customer.WhiteLabel;
                string whiteLabelDomain = Db.Customers.FirstOrDefault(x => x.WhiteLabel == whiteLabel)?.WebDomain;
                if (string.IsNullOrEmpty(whiteLabelDomain))
                {
                    throw new AdsException("White Label Web Domain can not be empty.");
                }
                CampaignProcessor.SendToVendor(via, null, campaign.OrderNumber, null, whiteLabelDomain);
                break;
            }
            // Send email to vendor
            //BackgroundJob.Enqueue(() => CampaignProcessor.SendToVendor(OrderVia.Email, vendor, campaign.OrderNumber, null, String.Empty));

            TempData["Success"] = "Order #:" + campaign.OrderNumber + ", Campaign " + campaign.CampaignName + " Rebroad has been sent to vendor sucessfully.";
            return(RedirectToAction("Rebroad", "Campaigns", new { id = campaign.Id }));
        }
        private static void SendToVendorMulti(OrderVia orderVia, WfpictContext db, Campaign campaign, Vendor vendor, string[] segmentsSelected, string whiteLabelDomain)
        {
            var segments = db.CampaignSegments
                           .Where(c => c.CampaignId == campaign.Id && segmentsSelected.Contains(c.SegmentNumber))
                           .ToList();

            foreach (var segment in segments)
            {
                string sentOrder, queuedCampaignId = null;
                switch (orderVia)
                {
                case OrderVia.Email:
                    sentOrder = EmailHelper.SendApprovedToVendor(vendor, campaign, segment);
                    break;

                case OrderVia.Api:
                    var response = ProDataApiManager.Create(campaign, segment, whiteLabelDomain);
                    if (response.status != ProDataApiManager.Success)
                    {
                        throw new AdsException(response.ErrorMessage);
                    }
                    sentOrder        = response.RequestMessage;
                    queuedCampaignId = response.queued_pending_campaign_id.ToString();
                    break;

                default:
                    throw new AdsException("Invalid orderVia while sending to vendor multiple");
                }

                segment.SegmentStatus = (int)SegmentStatus.Monitoring;

                var campaignTracking =
                    db.CampaignTrackings.FirstOrDefault(x => x.CampaignId == campaign.Id && x.SegmentNumber == segment.SegmentNumber);

                if (campaignTracking == null)
                {
                    var trackingId = Guid.NewGuid();
                    var tracking   = new CampaignTracking()
                    {
                        Id                  = trackingId,
                        CreatedAt           = DateTime.Now,
                        CampaignId          = campaign.Id,
                        OrderNumber         = campaign.OrderNumber,
                        SegmentNumber       = segment.SegmentNumber,
                        Quantity            = segment.Quantity,
                        DateSent            = DateTime.Now,
                        SentOrder           = sentOrder,
                        IsCreatedThroughApi = orderVia == OrderVia.Api,
                        QueuedCampaignId    = queuedCampaignId
                    };
                    db.CampaignTrackings.Add(tracking);
                    db.SaveChanges();
                }
                else
                {
                    campaignTracking.Quantity            = segment.Quantity;
                    campaignTracking.DateSent            = DateTime.Now;
                    campaignTracking.SentOrder           = sentOrder;
                    campaignTracking.IsCreatedThroughApi = orderVia == OrderVia.Api;
                    campaignTracking.QueuedCampaignId    = queuedCampaignId;
                }

                LogHelper.AddLog(db, LogType.Vendor, campaign.OrderNumber, $"Multi {segment.SegmentNumber} has been sent to vendor successfully.");
            }
        }
        private static void SendToVendorSingle(OrderVia orderVia, WfpictContext db, Campaign campaign, Vendor vendor, string whiteLabelDomain)
        {
            string sentOrder, queuedCampaignId = null;

            switch (orderVia)
            {
            case OrderVia.Email:
                sentOrder = EmailHelper.SendApprovedToVendor(vendor, campaign, null);
                break;

            case OrderVia.Api:
                var response = ProDataApiManager.Create(campaign, null, whiteLabelDomain);
                if (response.status != ProDataApiManager.Success)
                {
                    throw new AdsException(response.ErrorMessage);
                }
                sentOrder        = response.RequestMessage;
                queuedCampaignId = response.queued_pending_campaign_id.ToString();
                break;

            default:
                throw new AdsException("Invalid orderVia while sending to vendor single");
            }

            string orderNumberRdp = campaign.ReBroadcasted ? campaign.ReBroadcastedOrderNumber : campaign.OrderNumber;
            long   quantity       = campaign.ReBroadcasted ? campaign.ReBroadcastedQuantity : campaign.Approved.Quantity;

            var campaignTracking =
                db.CampaignTrackings.FirstOrDefault(x => x.CampaignId == campaign.Id && x.OrderNumber == orderNumberRdp && string.IsNullOrEmpty(x.SegmentNumber));

            if (campaignTracking == null)
            {
                var trackingId = Guid.NewGuid();
                var tracking   = new CampaignTracking()
                {
                    Id                  = trackingId,
                    CreatedAt           = DateTime.Now,
                    CampaignId          = campaign.Id,
                    OrderNumber         = orderNumberRdp,
                    SegmentNumber       = string.Empty,
                    Quantity            = quantity,
                    DateSent            = DateTime.Now,
                    SentOrder           = sentOrder,
                    IsCreatedThroughApi = orderVia == OrderVia.Api,
                    QueuedCampaignId    = queuedCampaignId
                };
                db.CampaignTrackings.Add(tracking);
            }
            else
            {
                campaignTracking.Quantity            = quantity;
                campaignTracking.DateSent            = DateTime.Now;
                campaignTracking.SentOrder           = sentOrder;
                campaignTracking.IsCreatedThroughApi = orderVia == OrderVia.Api;
                campaignTracking.QueuedCampaignId    = queuedCampaignId;
            }
            db.SaveChanges();

            LogHelper.AddLog(db, LogType.Vendor, campaign.OrderNumber, !campaign.ReBroadcasted
                    ? "Order has been sent to vendor successfully."
                    : "Order Rebroad has been sent to vendor sucessfully.");
        }