Esempio n. 1
0
        public static JqgridTable ToProductJqGrid(this IEnumerable <product> rows, inventoryLocation location)
        {
            var grid = new JqgridTable();

            foreach (var row in rows)
            {
                var entry = new JqgridRow();
                entry.id = row.id.ToString();

                var items = row.product_variants.SelectMany(x => x.inventoryLocationItems);
                if (location != null)
                {
                    items = items.Where(y => y.locationid == location.id);
                }

                int?inventoryLevel = items.All(x => x.available == null)
                                          ? null
                                          : items.Sum(y => y.available);

                // handle external network locations
                string variantString = "";
                if (location != null)
                {
                    switch (location.name)
                    {
                    case Networks.LOCATIONNAME_GBASE:
                        variantString = row.gbase_product.ToJqgridModel();
                        break;

                    case Networks.LOCATIONNAME_EBAY:
                        variantString = row.ebay_product.ToJqgridModel();
                        break;

                    default:
                        variantString = row.product_variants.ToJqgridModel(location.id);
                        break;
                    }
                }
                else
                {
                    variantString = row.product_variants.ToJqgridModel(null);
                }

                entry.cell = new object[]
                {
                    row.id,
                    "",
                    row.thumb.HasValue
                                         ? Img.by_size(row.product_image.url, Imgsize.THUMB).ToHtmlImage()
                                         : GeneralConstants.PHOTO_NO_THUMBNAIL.ToHtmlImage(),
                    row.ToProductTitle(),
                    string.Format("<table class='jqgrid_variants'>{0}</table>", variantString),
                    string.Format("<div class='bold larger'><a class='variant_transactions_link' href='/dashboard/product/transactions/{0}'>{1}</a></div>", row.id, inventoryLevel.ToInventoryLevelString()),
                    row.hits
                };
                grid.rows.Add(entry);
            }
            return(grid);
        }
Esempio n. 2
0
 public static InventoryLocation ToModel(this inventoryLocation value)
 {
     return(new InventoryLocation()
     {
         id = value.id,
         title = value.name
     });
 }
Esempio n. 3
0
 public static InventoryLocColumn ToSyncModel(this inventoryLocation v, CFlag flag, long?offlineid = null)
 {
     return(new InventoryLocColumn
     {
         cflag = flag,
         serverid = v.id,
         name = v.name,
         id = offlineid
     });
 }
Esempio n. 4
0
        private void CreateDataStructures()
        {
            // CREATE DEFAULT STRUCTURES
            // add default inventory location
            var loc = new inventoryLocation
            {
                name       = GeneralConstants.INVENTORY_LOCATION_DEFAULT,
                subdomain  = mastersubdomain.id,
                lastUpdate = DateTime.UtcNow
            };

            repository.AddInventoryLocation(loc, mastersubdomain.id);

            // add default shipping profile
            var shippingProfile = new shippingProfile()
            {
                title       = "Default",
                type        = ShippingProfileType.FLATRATE.ToString(),
                subdomainid = mastersubdomain.id,
                permanent   = true
            };

            repository.AddShippingProfile(shippingProfile);

            // add default payment methods
            var method_bank = new paymentMethod
            {
                method       = PaymentMethod.BankTransfer.ToString(),
                name         = "Bank Deposit",
                instructions = "Please contact me for payment details"
            };

            mastersubdomain.paymentMethods.Add(method_bank);

            var method_cod = new paymentMethod
            {
                method       = PaymentMethod.COD.ToString(),
                name         = "Cash On Delivery",
                instructions = ""
            };

            mastersubdomain.paymentMethods.Add(method_cod);

            usr.passwordHash = Utility.ComputePasswordHash(email + password);

            // if user exist then we still need to verify email
            Random rnd = RandomNumberGenerator.Instance;

            usr.confirmationCode = rnd.Next();

            repository.Save();

            // generate liquid stuff
            new Thread(() => ThemeHandler.GenerateDefaultStructures(mastersubdomain.id)).Start();
        }
Esempio n. 5
0
        public ActionResult LocationCreate(string locationName)
        {
            locationName = locationName.Trim();
            if (accountLimits.locations.HasValue)
            {
                var locationCount =
                    repository.GetSubDomains().Where(x => x.id == subdomainid.Value).SingleOrDefault().
                    inventoryLocations.Count();
                if (locationCount >= accountLimits.locations.Value)
                {
                    return(Json("Number of inventory locations exceeded. Please upgrade your <a href=\"/dashboard/account/plan\">plan</a>.".ToJsonFail()));
                }
            }

            if (string.IsNullOrEmpty(locationName))
            {
                return(Json("Name not specified.".ToJsonFail()));
            }
            // check if location exists
            if (repository.GetInventoryLocation(locationName, subdomainid.Value) != null)
            {
                return(Json("Location already exist.".ToJsonFail()));
            }

            // check if special location
            if (Networks.SYNC_NETWORKS.Contains(locationName))
            {
                return(Json("Name specified is reserved. Please select another name.".ToJsonFail()));
            }

            var loc = new inventoryLocation
            {
                name       = locationName,
                subdomain  = subdomainid.Value,
                lastUpdate = DateTime.UtcNow
            };

            // need to add location items for each product too
            var variants = repository.GetProductVariants(subdomainid.Value);

            foreach (var variant in variants)
            {
                var locitem = new inventoryLocationItem()
                {
                    variantid = variant.id
                };
                loc.inventoryLocationItems.Add(locitem);
            }

            repository.AddInventoryLocation(loc, subdomainid.Value);

            return(Json(loc.ToModel().ToJsonOKData()));
        }
Esempio n. 6
0
        public long AddInventoryLocation(inventoryLocation location, long subdomainid)
        {
            var exist = db.inventoryLocations.SingleOrDefault(x => x.name == location.name && x.subdomain == subdomainid);

            if (exist != null)
            {
                return(exist.id);
            }
            db.inventoryLocations.InsertOnSubmit(location);
            db.SubmitChanges();
            return(location.id);
        }
Esempio n. 7
0
        public override void StartSynchronisation(bool?upload)
        {
            using (var repository = new TradelrRepository())
            {
                // create default shipping profile
                var sd = repository.GetSubDomain(subdomainid);

                if (sd == null)
                {
                    throw new ArgumentException("Cannot find domain for subdomainid " + subdomainid);
                }

                // create network location
                var inventoryLocation = new inventoryLocation
                {
                    name       = LOCATIONNAME_EBAY,
                    subdomain  = subdomainid,
                    lastUpdate = DateTime.UtcNow
                };
                repository.AddInventoryLocation(inventoryLocation, subdomainid);

                // add shipping profile if there's none
                foreach (var site in EbayService.SupportedSites)
                {
                    if (sd.ebay_shippingprofiles.Count(x => x.siteid == site.ToString()) != 0)
                    {
                        continue;
                    }

                    var shippingprofile = new ebay_shippingprofile
                    {
                        title  = "Default",
                        siteid = site.ToString()
                    };

                    sd.ebay_shippingprofiles.Add(shippingprofile);

                    repository.Save("ebay.StartSynchronisation");
                }
            }
        }
Esempio n. 8
0
        private void Update()
        {
            if (string.IsNullOrEmpty(warehouse))
            {
                Syslog.Write(string.Format("Shipwire warehouse not specified: {0}", subdomainid));
                return;
            }
            service.CreateInventoryUpdate(warehouse);
            var resp = service.SubmitInventoryUpdate();

            if (resp != null)
            {
                // check for Error
                if (resp.Status == ShipwireService.StatusError && resp.ErrorMessage.ToLower().Contains("password"))
                {
                    // clear invalid credentials
                    using (var repository = new TradelrRepository())
                    {
                        var sd = repository.GetSubDomain(subdomainid);
                        if (sd != null)
                        {
                            sd.shipwireEmail    = "";
                            sd.shipwirePassword = "";
                            repository.Save();
                        }
                    }
                }

                // we want to create a location only if there are products
                if (resp.Products.Count != 0)
                {
                    Debug.WriteLine(string.Format("{0}: {1} products", warehouse, resp.Products.Count));
                    using (var repository = new TradelrRepository())
                    {
                        // if items not zero then we create inventory location if it does not already exist
                        var inventoryloc = new inventoryLocation
                        {
                            subdomain  = subdomainid,
                            name       = warehouse,
                            lastUpdate = DateTime.UtcNow
                        };
                        var locid = repository.AddInventoryLocation(inventoryloc, subdomainid);
                        // we go through each product
                        foreach (var product in resp.Products)
                        {
                            var variant = repository.GetProductVariant(product.code, subdomainid, ProductFlag.ARCHIVED);
                            // if product exist and not archived
                            if (variant != null)
                            {
                                Debug.WriteLine("Existing product: " + product.code);
                                // then we just update the inventorylocitem
                                var ilocitem =
                                    repository.GetInventoryLocationItems(locid, subdomainid).SingleOrDefault(x => x.variantid == variant.id);
                                if (ilocitem == null)
                                {
                                    // can be null from do these updates from Shipwire as we're doing on a per location basis
                                    // anyway create an entry
                                    ilocitem = new inventoryLocationItem
                                    {
                                        variantid  = variant.id,
                                        locationid = locid,
                                        lastUpdate = DateTime.UtcNow,
                                        available  = product.quantity
                                    };
                                    repository.AddInventoryLocationItem(ilocitem, subdomainid);
                                }
                                else
                                {
                                    // just update as this is a sync
                                    ilocitem.available  = product.quantity;
                                    ilocitem.lastUpdate = DateTime.UtcNow;
                                    repository.Save("InventoryUpdate Update");
                                }
                            }
                            else
                            {
                                Debug.WriteLine("New product: " + product.code);

                                // create new product
                                var productInfo = new ProductInfo();

                                // do product
                                var p = new product
                                {
                                    subdomainid = subdomainid,
                                    title       = product.code,
                                    details     = "",
                                    created     = DateTime.UtcNow
                                };
                                productInfo.p = p;
                                variant       = new product_variant();
                                variant.sku   = product.code;

                                // do inventory location item
                                var ilocitem = new inventoryLocationItem
                                {
                                    variantid  = variant.id,
                                    locationid = locid,
                                    lastUpdate = DateTime.UtcNow
                                };
                                var invWorker = new InventoryWorker(ilocitem, subdomainid, true, false); // assume not digital
                                invWorker.SetValues("Shipwire Update", product.quantity, null, null, null);
                                variant.inventoryLocationItems.Add(ilocitem);
                                productInfo.p.product_variants.Add(variant);

                                // finally add to db
                                repository.AddProduct(productInfo, subdomainid);
                            }
                        }
                    }
                }
                else
                {
                    //Syslog.Write(ErrorLevel.WARNING,string.Format("{0}: No products", warehouse));
                }
            }
            else
            {
                Syslog.Write("No response from warehouse " + warehouse);
            }
        }
Esempio n. 9
0
        public ActionResult Index(RequestSync syncdata)
        {
            var serializer = new JavaScriptSerializer();
            IEnumerable <IColumn> receivedrows = null;

            // deserialize what we have from the client
            try
            {
                switch (syncdata.type)
                {
                case TableName.PRODUCTS:
                    receivedrows = serializer.Deserialize <ProductColumn[]>(syncdata.data);
                    break;

                case TableName.CATEGORY:
                    receivedrows = serializer.Deserialize <CategoryColumn[]>(syncdata.data);
                    break;

                case TableName.PHOTOS:
                    receivedrows = serializer.Deserialize <PhotosColumn[]>(syncdata.data);
                    break;

                case TableName.INVENTORYLOC:
                    receivedrows = serializer.Deserialize <InventoryLocColumn[]>(syncdata.data);
                    break;

                case TableName.INVENTORYLOCITEM:
                    receivedrows = serializer.Deserialize <InventoryLocItemColumn[]>(syncdata.data);
                    break;

                case TableName.SETTINGS:
                    receivedrows = serializer.Deserialize <SettingsColumn[]>(syncdata.data);
                    break;

                case TableName.STOCKUNIT:
                    receivedrows = serializer.Deserialize <StockUnitColumn[]>(syncdata.data);
                    break;

                case TableName.ORDERS:
                    receivedrows = serializer.Deserialize <OrderColumn[]>(syncdata.data);
                    break;

                case TableName.ORGS:
                    receivedrows = serializer.Deserialize <OrgColumn[]>(syncdata.data);
                    break;

                default:
                    return(new EmptyResult());
                }
            }
            catch (Exception ex)
            {
                Syslog.Write(ex);
                return(new EmptyResult());
            }

            dynamic returnrows;

            #region get new rows
            // checking against maxid ensures that we return new rows or if nothing from offline db
            // then online ids will be definately > 0
            long maxid = 0;
            if (receivedrows != null && receivedrows.Count() != 0)
            {
                // no need to check for NONE cflag as maxid from client could be update row that will have the largest id
                var maxidrows = receivedrows.Where(x => x.serverid.HasValue);
                if (maxidrows.Count() != 0)
                {
                    maxid = maxidrows.Max(x => x.serverid.Value);
                }
            }
            switch (syncdata.type)
            {
            // commented out because of implementation of product variant
            //case TableName.PRODUCTS:
            //     returnrows =
            // repository.GetProducts(subdomainid.Value, "").Where(x => x.id > maxid).ToSyncModel(CFlag.CREATE);
            //     break;
            case TableName.CATEGORY:
                returnrows =
                    repository.GetProductCategories(subdomainid.Value).Where(x => x.id > maxid).ToSyncModel(CFlag.CREATE);
                break;

            // commented out because of new image photos

            /*
             * case TableName.PHOTOS:
             *  // don't include PRODUCT where contextid = 0 as these are photos that are uploaded when abandoining product creation
             *  returnrows =
             *      db.product_images.Where(
             *          x =>
             *          x.subdomainid == subdomainid.Value && x.id > maxid &&
             *          x.productid != 0).ToSyncModel(CFlag.CREATE);
             *  break;
             * */
            case TableName.INVENTORYLOC:
                returnrows =
                    repository.GetInventoryLocationsExceptSyncNetworks(subdomainid.Value).Where(x => x.id > maxid).ToSyncModel(CFlag.CREATE);
                break;

            case TableName.INVENTORYLOCITEM:
                returnrows =
                    repository.GetInventoryLocationsExceptSyncNetworks(subdomainid.Value)
                    .SelectMany(x => x.inventoryLocationItems).Where(x => x.id > maxid).ToSyncModel(CFlag.CREATE);
                break;

            case TableName.SETTINGS:
                var settings = repository.GetSubDomains().Where(x => x.id == subdomainid.Value && x.id > maxid).SingleOrDefault();
                if (settings != null)
                {
                    returnrows = settings.ToSyncModel(CFlag.CREATE);
                }
                else
                {
                    returnrows = new List <SettingsColumn>();
                }
                break;

            case TableName.STOCKUNIT:
                returnrows =
                    db.stockUnits.Where(
                        x => x.subdomainid == subdomainid.Value && x.id > maxid).
                    ToSyncModel(CFlag.CREATE);
                break;

            case TableName.ORDERS:
                returnrows =
                    db.orders.Where(
                        x => x.user.organisation1.MASTERsubdomain.id == subdomainid.Value && x.id > maxid).
                    ToSyncModel(CFlag.CREATE);
                break;

            case TableName.ORGS:
                returnrows =
                    db.organisations.Where(
                        x => x.MASTERsubdomain.id == subdomainid.Value && x.id > maxid).
                    ToSyncModel(CFlag.CREATE);
                break;

            default:
                return(new EmptyResult());
            }
            #endregion

            #region check for updates since our last offline check
            // only tables that allow user editing needs to be checked
            // this has to be before values added from client because lastUpdate time will be before lastOfflinkCheck
            // since the server will only be touched after update
            var usr = repository.GetUserById(sessionid.Value, subdomainid.Value);
            if (!usr.lastOfflineCheck.HasValue)
            {
                usr.lastOfflineCheck = DateTime.UtcNow;
                repository.Save();
            }
            else
            {
                DateTime?lastCheck   = usr.lastOfflineCheck;
                dynamic  changedRows = null;
                switch (syncdata.type)
                {
                case TableName.PRODUCTS:
                    changedRows =
                        db.products.Where(
                            x => x.subdomainid == subdomainid.Value && x.updated > lastCheck).
                        ToSyncModel(CFlag.UPDATE);
                    break;

                case TableName.CATEGORY:
                    changedRows =
                        db.productCategories.Where(x => x.subdomain == subdomainid.Value && x.lastUpdate > lastCheck)
                        .ToSyncModel(CFlag.UPDATE);
                    break;

                case TableName.PHOTOS:
                    // not editable
                    break;

                case TableName.INVENTORYLOC:
                    changedRows =
                        db.inventoryLocations.Where(
                            x => x.subdomain == subdomainid.Value && x.lastUpdate > lastCheck)
                        .ToSyncModel(CFlag.UPDATE);
                    break;

                case TableName.INVENTORYLOCITEM:
                    changedRows = db.inventoryLocationItems.Where(
                        x => x.inventoryLocation.subdomain == subdomainid.Value && x.lastUpdate > lastCheck)
                                  .ToSyncModel(CFlag.UPDATE);
                    break;

                case TableName.SETTINGS:
                    break;

                case TableName.STOCKUNIT:
                    // not editable or deletable at the moment
                    break;

                case TableName.ORDERS:
                    changedRows = db.orders.Where(
                        x => x.user1.organisation1.subdomain == subdomainid.Value && x.lastUpdate > lastCheck)
                                  .ToSyncModel(CFlag.UPDATE);
                    break;

                case TableName.ORGS:
                    changedRows = db.organisations.Where(
                        x => x.subdomain == subdomainid.Value && x.lastUpdate > lastCheck)
                                  .ToSyncModel(CFlag.UPDATE);
                    break;

                case TableName.USER:
                    changedRows = repository.GetContacts(subdomainid.Value, sessionid.Value, null, null, null).Where
                                      (x => x.lastUpdate > lastCheck)
                                  .ToSyncModel(CFlag.UPDATE);
                    break;

                default:
                    return(new EmptyResult());
                }
                if (changedRows != null)
                {
                    foreach (var changedRow in changedRows)
                    {
                        returnrows.Add(changedRow);
                    }
                }
            }
            #endregion

            #region handle changes from client
            if (receivedrows != null && receivedrows.Count() != 0)
            {
                foreach (var receivedrow in receivedrows)
                {
                    try
                    {
                        /////////////////////////////////// UPDATE
                        // serverid is used to identify online db id
                        switch (receivedrow.cflag)
                        {
                        case CFlag.UPDATE:
                            // handle change flag
                            switch (syncdata.type)
                            {
                            case TableName.PRODUCTS:
                                var p = repository.GetProduct(receivedrow.serverid.Value, subdomainid.Value);
                                if (p != null)
                                {
                                    var col = (ProductColumn)receivedrow;
                                    p.category     = col.categoryid;
                                    p.costPrice    = col.costPrice;
                                    p.details      = col.details;
                                    p.flags        = col.flags;
                                    p.otherNotes   = col.notes;
                                    p.sellingPrice = col.sellingPrice;
                                    //p.SKU = col.SKU;
                                    p.stockUnitId = col.stockunitid;
                                    p.thumb       = col.thumbnailid;
                                    p.title       = col.title;
                                    p.updated     = DateTime.UtcNow;
                                    repository.Save();
                                    CacheHelper.Instance.invalidate_dependency(
                                        DependencyType.products_subdomain, subdomainid.Value.ToString());
                                    CacheHelper.Instance.invalidate_dependency(DependencyType.products_single,
                                                                               receivedrow.serverid.ToString());
                                }
                                else
                                {
                                    Syslog.Write("SYNC: Can't find product " + receivedrow.id);
                                }
                                break;

                            case TableName.CATEGORY:
                                // cannot update product category
                                break;

                            case TableName.PHOTOS:
                                // cannot update photos
                                break;

                            case TableName.INVENTORYLOC:
                                // cannot update inventory locations
                                break;

                            case TableName.INVENTORYLOCITEM:
                                var ilocitem = repository.GetInventoryLocationItem(receivedrow.serverid.Value,
                                                                                   subdomainid.Value);
                                if (ilocitem != null)
                                {
                                    var col = (InventoryLocItemColumn)receivedrow;
                                    ilocitem.available  = col.inventoryLevel;
                                    ilocitem.alarmLevel = col.alarmLevel;
                                    repository.Save();
                                }
                                else
                                {
                                    Syslog.Write("SYNC: Can't find inventoryLocationItem " + receivedrow.id);
                                }
                                break;

                            case TableName.STOCKUNIT:
                                // cannot update stockunit
                                break;

                            case TableName.ORDERS:
                            case TableName.ORGS:
                            case TableName.SETTINGS:
                            default:
                                throw new NotImplementedException();
                            }
                            receivedrow.cflag = CFlag.CLEAR;
                            returnrows.Add(receivedrow as dynamic);
                            break;

                        case CFlag.CREATE:
                            switch (syncdata.type)
                            {
                            // commented out due to implementation of product variants

                            /*
                             * case TableName.PRODUCTS:
                             * var col = (ProductColumn) receivedrow;
                             * // check for duplicate rows
                             * if(repository.GetProduct(col.SKU, subdomainid.Value) == null)
                             * {
                             *  var p = new product()
                             *  {
                             *      subdomainid = subdomainid.Value,
                             *      category = col.categoryid,
                             *      costPrice = col.costPrice,
                             *      details = col.details ?? "",
                             *      flags = col.flags,
                             *      otherNotes = col.notes,
                             *      paymentTerms = col.paymentterms,
                             *      sellingPrice = col.sellingPrice,
                             *      shippingTerms = col.shippingterms,
                             *      //SKU = col.SKU,
                             *      stockUnitId = col.stockunitid,
                             *      thumbnail = col.thumbnailid,
                             *      title = col.title
                             *  };
                             *  repository.AddProduct(new ProductInfo(){p = p}, subdomainid.Value);
                             *  receivedrow.serverid = p.id;
                             *  receivedrow.cflag = CFlag.CLEAR;
                             *  returnrows.Add(receivedrow as dynamic);
                             * }
                             * else
                             * {
                             *  Syslog.Write("Duplicate SKU: " + subdomainid.Value + " " + col.SKU);
                             * }
                             * break;
                             * */
                            case TableName.CATEGORY:
                                var catcol = (CategoryColumn)receivedrow;
                                var mpc    = repository.AddMasterProductCategory(catcol.name);
                                var c      = new productCategory()
                                {
                                    masterID  = mpc.id,
                                    parentID  = catcol.parentid,
                                    subdomain = subdomainid.Value
                                };
                                repository.AddProductCategory(c, subdomainid.Value);
                                receivedrow.serverid = c.id;
                                receivedrow.cflag    = CFlag.CLEAR;
                                returnrows.Add(receivedrow as dynamic);
                                break;

                            case TableName.PHOTOS:
                                var pcol     = (PhotosColumn)receivedrow;
                                var imageurl = pcol.url.ToSavedImageUrl(sessionid.Value, subdomainid.Value);
                                if (!string.IsNullOrEmpty(imageurl))
                                {
                                    var photo = new image()
                                    {
                                        url       = imageurl,
                                        contextID = pcol.contextid,
                                        imageType = pcol.type,
                                        subdomain = subdomainid.Value
                                    };
                                    repository.AddImage(photo);
                                    receivedrow.serverid = photo.id;
                                    receivedrow.cflag    = CFlag.CLEAR;
                                    returnrows.Add(receivedrow as dynamic);
                                }
                                break;

                            case TableName.INVENTORYLOC:
                                var il  = (InventoryLocColumn)receivedrow;
                                var loc = new inventoryLocation()
                                {
                                    name = il.name
                                };
                                repository.AddInventoryLocation(loc, subdomainid.Value);
                                receivedrow.serverid = loc.id;
                                receivedrow.cflag    = CFlag.CLEAR;
                                returnrows.Add(receivedrow as dynamic);
                                break;

                            case TableName.INVENTORYLOCITEM:
                                var ili = (InventoryLocItemColumn)receivedrow;
                                if (ili.productid.HasValue)
                                {
                                    var locitem = new inventoryLocationItem()
                                    {
                                        locationid = ili.locationid,
                                        available  = ili.inventoryLevel,
                                        onOrder    = ili.onOrder,
                                        variantid  = ili.productid.Value,
                                        alarmLevel = ili.alarmLevel
                                    };
                                    repository.AddInventoryLocationItem(locitem, subdomainid.Value);
                                    receivedrow.serverid = locitem.id;
                                    receivedrow.cflag    = CFlag.CLEAR;
                                    returnrows.Add(receivedrow as dynamic);
                                }
                                break;

                            case TableName.STOCKUNIT:
                                var scol  = (StockUnitColumn)receivedrow;
                                var msu   = repository.AddMasterStockUnit(scol.name);
                                var sunit = new stockUnit()
                                {
                                    unitID      = msu.id,
                                    subdomainid = subdomainid.Value
                                };
                                repository.AddStockUnit(sunit);
                                receivedrow.serverid = sunit.id;
                                receivedrow.cflag    = CFlag.CLEAR;
                                returnrows.Add(receivedrow as dynamic);
                                break;

                            case TableName.SETTINGS:
                                break;

                            case TableName.ORDERS:
                            case TableName.ORGS:
                            default:
                                throw new NotImplementedException();
                            }
                            break;

                        case CFlag.DELETE:     /////////// DELETE
                            switch (syncdata.type)
                            {
                            case TableName.PRODUCTS:
                                repository.DeleteProduct(receivedrow.serverid.Value, subdomainid.Value);
                                break;

                            case TableName.CATEGORY:
                                repository.DeleteProductCategories(subdomainid.Value,
                                                                   new[] { receivedrow.serverid.Value.ToString() });
                                break;

                            case TableName.PHOTOS:
                                repository.DeleteImage(receivedrow.serverid.Value, subdomainid.Value, PhotoType.ALL);
                                break;

                            case TableName.INVENTORYLOC:
                                try
                                {
                                    var loc = db.inventoryLocations.Where(
                                        x => x.id == receivedrow.serverid.Value && x.subdomain == subdomainid.Value).Single();
                                    db.inventoryLocations.DeleteOnSubmit(loc);
                                    db.SubmitChanges();
                                }
                                catch         // suppress error when deleting iloc before ilocitem entry due to constraint
                                {
                                }
                                break;

                            case TableName.SETTINGS:
                                break;

                            case TableName.INVENTORYLOCITEM:
                                repository.DeleteInventoryLocationItem(receivedrow.serverid.Value, subdomainid.Value);
                                break;

                            case TableName.STOCKUNIT:
                                repository.DeleteStockUnit(receivedrow.serverid.Value, subdomainid.Value);
                                break;

                            case TableName.ORDERS:
                            case TableName.ORGS:
                            default:
                                throw new NotImplementedException();
                            }
                            receivedrow.cflag = CFlag.CLEAR;
                            returnrows.Add(receivedrow as dynamic);
                            break;

                        default:
                            break;
                        }
                    }
                    catch (Exception ex)
                    {
                        Syslog.Write(ex);
                    }
                }
            }
            #endregion

            return(Json(((object)returnrows).ToJsonOKData()));
        }
Esempio n. 10
0
        public ActionResult NewAccount(string code, string id, string identifier, PageType pagetype)
        {
            var client = new OAuthFacebook(GeneralConstants.FACEBOOK_API_KEY, GeneralConstants.FACEBOOK_API_SECRET,
                                           HttpUtility.UrlEncode(
                                               string.Format(
                                                   "{0}/newaccount/{1}?identifier={2}&pagetype={3}",
                                                   GeneralConstants.FACEBOOK_APP_URL, id, identifier, pagetype)),
                                           "read_stream,email,publish_stream,offline_access,manage_pages");

            // starting our authorisation process
            if (string.IsNullOrEmpty(code))
            {
                return(RedirectToAction("Redirect", new{ url = client.AuthorizationLinkGet() }));
            }

            if (!client.AccessTokenGet(code))
            {
                return(View("Error", new FacebookViewData {
                    errorMessage = "Unable to obtain permission", pageUrl = pagetype.ToReturnUrl(identifier)
                }));
            }

            // check subdomain is valid
            id = id.ToLower();

            // also check special domain list
            if (GeneralConstants.SUBDOMAIN_RESTRICTED.Contains(id))
            {
                return(View("Error", new FacebookViewData {
                    errorMessage = "Store address is not available", pageUrl = pagetype.ToReturnUrl(identifier)
                }));
            }

            var mastersubdomain = repository.GetSubDomains().Where(x => x.name == id).SingleOrDefault();

            if (mastersubdomain != null)
            {
                return(View("Error", new FacebookViewData {
                    errorMessage = "Store address is not available", pageUrl = pagetype.ToReturnUrl(identifier)
                }));
            }

            var facebook = new FacebookService(client.token);
            var fb_usr   = facebook.People.GetUser("me");

            if (fb_usr == null)
            {
                return(View("Error", new FacebookViewData {
                    errorMessage = "Unable to create account", pageUrl = pagetype.ToReturnUrl(identifier)
                }));
            }

            // verify that email has not been used to register another account
            if (repository.GetUserByEmail(fb_usr.email).Where(x => (x.role & (int)UserRole.CREATOR) != 0).SingleOrDefault() != null)
            {
                Syslog.Write(ErrorLevel.INFORMATION, "Facebook email address in use: " + fb_usr.email);
                return(View("Error", new FacebookViewData {
                    errorMessage = "Email address is already registered", pageUrl = pagetype.ToReturnUrl(identifier)
                }));
            }

            var usr = new user
            {
                role                 = (int)UserRole.ADMIN,
                viewid               = Crypto.Utility.GetRandomString(),
                permissions          = (int)UserPermission.ADMIN,
                FBID                 = fb_usr.id,
                email                = fb_usr.email ?? "",
                externalProfileUrl   = fb_usr.link,
                firstName            = fb_usr.first_name,
                lastName             = fb_usr.last_name,
                gender               = fb_usr.gender,
                externalProfilePhoto = string.Format("https://graph.facebook.com/{0}/picture?type=large", fb_usr.id)
            };

            // create subdomain entry
            mastersubdomain = new MASTERsubdomain
            {
                flags                   = 0,
                name                    = id,
                total_outofstock        = 0,
                total_contacts_public   = 0,
                total_contacts_private  = 0,
                total_contacts_staff    = 0,
                total_invoices_sent     = 0,
                total_invoices_received = 0,
                total_orders_sent       = 0,
                total_orders_received   = 0,
                total_products_mine     = 0,
                accountType             = AccountPlanType.ULTIMATE.ToString()
            };

            repository.AddMasterSubdomain(mastersubdomain);

            // create organisation first
            var org = new organisation
            {
                subdomain = mastersubdomain.id,
                name      = fb_usr.name
            };

            repository.AddOrganisation(org);
            usr.organisation = org.id;

            // CREATE DEFAULT STRUCTURES
            // add default inventory location
            var loc = new inventoryLocation
            {
                name       = GeneralConstants.INVENTORY_LOCATION_DEFAULT,
                subdomain  = mastersubdomain.id,
                lastUpdate = DateTime.UtcNow
            };

            repository.AddInventoryLocation(loc, mastersubdomain.id);

            // add default shipping profile
            var shippingProfile = new shippingProfile()
            {
                title       = "Default",
                type        = ShippingProfileType.FLATRATE.ToString(),
                subdomainid = mastersubdomain.id
            };

            repository.AddShippingProfile(shippingProfile);

            // update subdomain entry
            mastersubdomain.creator = org.id;

            // create facebookpage to link to subdomain
            var newEntry = new facebookPage {
                subdomainid = mastersubdomain.id, pageid = identifier
            };

            repository.AddFacebookPage(newEntry);


            try
            {
                // if user exist then we still need to verify email
                Random rnd = RandomNumberGenerator.Instance;
                usr.confirmationCode = rnd.Next();
                repository.AddUser(usr);

                // generate photo
                new Thread(() => usr.externalProfilePhoto.ReadAndSaveFromUrl(mastersubdomain.id, usr.id, usr.id, PhotoType.PROFILE)).Start();

                // add access token
                var oauthdb = new oauth_token
                {
                    token_key    = client.token,
                    token_secret = "",
                    type         = OAuthTokenType.FACEBOOK.ToString(),
                    subdomainid  = mastersubdomain.id,
                    appid        = usr.id.ToString(),
                    authorised   = true
                };
                repository.AddOAuthToken(oauthdb);

                // obtain any other account tokens
                var accounts = facebook.Account.GetAccountTokens("me");
                if (accounts != null && accounts.data != null)
                {
                    foreach (var account in accounts.data)
                    {
                        if (account.name != null)
                        {
                            var ftoken = new facebook_token
                            {
                                pageid      = account.id,
                                subdomainid = mastersubdomain.id,
                                accesstoken = account.access_token,
                                name        = account.name
                            };
                            repository.AddUpdateFacebookToken(ftoken);
                        }
                    }
                }
                repository.Save();

                // send confirmation email
                var viewdata = new ViewDataDictionary()
                {
                    { "host", id.ToSubdomainUrl() },
                    { "confirmCode", usr.confirmationCode },
                    { "email", usr.email }
                };
                EmailHelper.SendEmailNow(EmailViewType.ACCOUNT_CONFIRMATION, viewdata, "New Account Details and Email Verification Link",
                                         usr.email, usr.ToFullName(), usr.id);
            }
            catch (Exception ex)
            {
                Syslog.Write(ex);
                return(View("Error", new FacebookViewData {
                    errorMessage = "Unable to create account", pageUrl = pagetype.ToReturnUrl(identifier)
                }));
            }

            return(RedirectToAction("Redirect", new { url = pagetype.ToReturnUrl(identifier) }));
        }
Esempio n. 11
0
        public override void StartSynchronisation(bool?upload)
        {
            // pull items
            var gbase = new GoogleBaseExporter(subdomainid, hostName, sessionid);

            gbase.GetAllProducts();
            using (var repository = new TradelrRepository())
            {
                // create network location
                var inventoryLocation = new inventoryLocation
                {
                    name       = LOCATIONNAME_GBASE,
                    subdomain  = subdomainid,
                    lastUpdate = DateTime.UtcNow
                };
                locationid = repository.AddInventoryLocation(inventoryLocation, subdomainid);

                // init some settings
                locationid = repository.GetInventoryLocation(LOCATIONNAME_GBASE, subdomainid).id;
                currency   = repository.GetSubDomain(subdomainid).currency.ToCurrency();

                var products = repository.GetProducts(subdomainid);
                foreach (var entry in gbase.entries)
                {
                    ProductEntry entry1       = entry;
                    var          oldTypeEntry = products.SingleOrDefault(x => x.gbaseID == entry1.Id.AbsoluteUri);
                    if (oldTypeEntry != null)
                    {
                        // old type entry exists

                        // remove id
                        oldTypeEntry.gbaseID = null;

                        // create gbase entry, don't need to create a variant since one would already exist
                        oldTypeEntry.gbase_product = CreateGbaseInformationEntry(entry);
                    }
                    else
                    {
                        var newtypeEntry =
                            products.Where(x => x.gbase_product.externalid == entry1.Id.AbsoluteUri).Select(
                                x => x.gbase_product).SingleOrDefault();
                        if (newtypeEntry != null)
                        {
                            // new type entry exists
                            // update status
                            newtypeEntry.expirydate = entry.ExpirationDate;
                            if (entry.IsDraft)
                            {
                                newtypeEntry.flags |= (int)InventoryItemFlag.DRAFT;
                            }
                            else
                            {
                                newtypeEntry.flags &= ~(int)InventoryItemFlag.DRAFT;
                            }
                        }
                        else
                        {
                            // entry does not exist
                            // create and add entry to tradelr
                            var p = CreateProductFromEntry(entry);

                            // create variant
                            var variants = new List <product_variant>();

                            var variant = new product_variant()
                            {
                                sku =
                                    string.Concat("GBASE", entry.Id.AbsoluteUri.Substring(
                                                      entry.Id.AbsoluteUri.LastIndexOf('/') + 1))
                            };
                            variants.Add(variant);

                            // add gbase info
                            p.gbase_product = CreateGbaseInformationEntry(entry);
                            p.product_variants.AddRange(variants);
                            var pinfo = new ProductInfo()
                            {
                                p = p
                            };
                            repository.AddProduct(pinfo, subdomainid);

                            // images
                            foreach (var link in entry.AdditionalImageLinks)
                            {
                                var image = link.Value.ReadAndSaveProductImageFromUrl(subdomainid, sessionid, p.id);
                                p.thumb = image.id;
                            }
                        }
                    }
                }

                // upload to google base for each entry that does not have a special entry
                if (upload.HasValue && upload.Value)
                {
                    var newproducts =
                        repository.GetProducts(subdomainid).Where(
                            x => !x.gbase.HasValue && (x.flags & (int)ProductFlag.ARCHIVED) == 0);
                    foreach (var p in newproducts)
                    {
                        var gb = new GoogleBaseExporter(subdomainid, hostName, sessionid);
                        gb.InitValues(p);
#if !DEBUG
                        IEnumerable <Photo> productPhotos = repository.GetImages(PhotoType.PRODUCT, p.id).ToModel(Imgsize.LARGE);
                        gb.AddProductImages(productPhotos);
#endif
                        var worker = new GoogleBaseWorker(gb);
                        new Thread(worker.Post).Start();
                    }
                }

                // save
                repository.Save();
            }
        }