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); }
public static InventoryLocation ToModel(this inventoryLocation value) { return(new InventoryLocation() { id = value.id, title = value.name }); }
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 }); }
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(); }
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())); }
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); }
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"); } } }
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); } }
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())); }
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) })); }
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(); } }