public async Task TestAddPost() { // Create a post CustomerRoot post = new CustomerRoot { Customer = new Customer { CustomerNumber = "TEST-OLLE", Name = "Testbolaget", Email = "*****@*****.**", DefaultTemplates = new DefaultTemplates { Invoice = "DEFAULTTEMPLATE" } } }; // Add the post FortnoxResponse<CustomerRoot> fr = await config.fortnox_client.Add<CustomerRoot>(post, "customers"); // Log the error if (fr.model == null) { config.logger.LogError(fr.error); } // Test evaluation Assert.AreNotEqual(null, fr.model); } // End of the TestAddPost method
public async Task TestUpdatePost() { // Create a post CustomerRoot post = new CustomerRoot { Customer = new Customer { CustomerNumber = "TEST-OLLE", Name = "Testbolaget AAA", Email = "*****@*****.**", CountryCode = "NO", Address1 = "Test 550" } }; // Update the post FortnoxResponse<CustomerRoot> fr = await config.fortnox_client.Update<CustomerRoot>(post, "customers/TEST-OLLE"); // Log the error if (fr.model == null) { config.logger.LogError(fr.error); } // Test evaluation Assert.AreNotEqual(null, fr.model); } // End of the TestUpdatePost method
} // End of the AddOffer method /// <summary> /// Add an order /// </summary> public async Task<OrderRoot> AddOrder(string dox_email, AnnytabDoxTrade doc) { // Terms of delivery if (string.IsNullOrEmpty(doc.terms_of_delivery) == false) { doc.terms_of_delivery = CommonTools.ConvertToAlphanumeric(doc.terms_of_delivery).ToUpper(); await AddTermsOfDelivery(doc.terms_of_delivery); } // Terms of payment if (string.IsNullOrEmpty(doc.terms_of_payment) == false) { doc.terms_of_payment = CommonTools.ConvertToAlphanumeric(doc.terms_of_payment).ToUpper().Replace("-", ""); await AddTermsOfPayment(doc.terms_of_payment); } // Way of delivery if (string.IsNullOrEmpty(doc.mode_of_delivery) == false) { doc.mode_of_delivery = CommonTools.ConvertToAlphanumeric(doc.mode_of_delivery).ToUpper(); await AddWayOfDelivery(doc.mode_of_delivery); } // Currency if (string.IsNullOrEmpty(doc.currency_code) == false) { doc.currency_code = doc.currency_code.ToUpper(); await AddCurrency(doc.currency_code); } // Upsert the customer CustomerRoot customer_root = await UpsertCustomer(dox_email, doc); // Return if the customer is null if (customer_root == null || customer_root.Customer == null) { return null; } // Create a list with order rows IList<OrderRow> rows = new List<OrderRow>(); // Add order rows if (doc.product_rows != null) { await AddOrderRows(doc.product_rows, rows); } // Create an order OrderRoot root = new OrderRoot { Order = new Order { CustomerNumber = customer_root.Customer.CustomerNumber, OrderDate = string.IsNullOrEmpty(doc.issue_date) == false ? doc.issue_date : null, DeliveryDate = string.IsNullOrEmpty(doc.delivery_date) == false ? doc.delivery_date : null, YourOrderNumber = doc.buyer_references != null && doc.buyer_references.ContainsKey("order_id") ? doc.buyer_references["order_id"] : null, ExternalInvoiceReference1 = string.IsNullOrEmpty(doc.payment_reference) == false ? doc.payment_reference : null, ExternalInvoiceReference2 = string.IsNullOrEmpty(doc.id) == false ? doc.id : null, Comments = doc.comment, OrderRows = rows, Currency = doc.currency_code, VATIncluded = false } }; // Add the order FortnoxResponse<OrderRoot> fr = await this.nox_client.Add<OrderRoot>(root, "orders"); // Log errors if (string.IsNullOrEmpty(fr.error) == false) { this.logger.LogError(fr.error); } // Return the order return fr.model; } // End of the AddOrder method
} // End of the CreatePurchaseOrder method /// <summary> /// Create a invoice /// </summary> private async Task<AnnytabDoxTrade> CreateInvoice(CompanySettingsRoot company, InvoiceRoot root, CustomerRoot customer_root) { // Create a Annytab Dox Trade document AnnytabDoxTrade post = new AnnytabDoxTrade(); post.id = root.Invoice.DocumentNumber; post.document_type = root.Invoice.Credit == true ? "credit_invoice" : "invoice"; post.payment_reference = string.IsNullOrEmpty(root.Invoice.OCR) == false ? root.Invoice.OCR : root.Invoice.DocumentNumber; post.issue_date = root.Invoice.InvoiceDate; post.due_date = root.Invoice.DueDate; post.delivery_date = root.Invoice.DeliveryDate; post.seller_references = new Dictionary<string, string>(); post.seller_references.Add("quotation_id", root.Invoice.OfferReference); post.seller_references.Add("order_id", root.Invoice.OrderReference); post.seller_references.Add("invoice_id", root.Invoice.InvoiceReference); post.buyer_references = new Dictionary<string, string>(); post.buyer_references.Add("customer_id", root.Invoice.CustomerNumber); post.buyer_references.Add("order_id", root.Invoice.YourOrderNumber); post.terms_of_delivery = root.Invoice.TermsOfDelivery; post.terms_of_payment = root.Invoice.TermsOfPayment; post.mode_of_delivery = root.Invoice.WayOfDelivery; post.total_weight_kg = 0M; post.penalty_interest = this.default_values.PenaltyInterest; post.currency_code = root.Invoice.Currency; post.vat_country_code = company.CompanySettings.CountryCode; post.comment = root.Invoice.Remarks; post.seller_information = GetCompanyParty(company, root.Invoice.OurReference); post.buyer_information = new PartyInformation { person_id = root.Invoice.OrganisationNumber, person_name = root.Invoice.CustomerName, address_line_1 = root.Invoice.Address1, address_line_2 = root.Invoice.Address2, postcode = root.Invoice.ZipCode, city_name = root.Invoice.City, country_name = root.Invoice.Country, contact_name = root.Invoice.YourReference, phone_number = root.Invoice.Phone1, email = customer_root.Customer.Email }; post.delivery_information = new PartyInformation { person_name = root.Invoice.DeliveryName, address_line_1 = root.Invoice.DeliveryAddress1, address_line_2 = root.Invoice.DeliveryAddress2, postcode = root.Invoice.DeliveryZipCode, city_name = root.Invoice.DeliveryCity, country_name = root.Invoice.DeliveryCountry }; post.payment_options = GetPaymentOptions(company); post.product_rows = new List<ProductRow>(); foreach (InvoiceRow row in root.Invoice.InvoiceRows) { // Get the article FortnoxResponse<ArticleRoot> fr_article = await this.nox_client.Get<ArticleRoot>($"articles/{row.ArticleNumber}"); // Make sure that article root and article not is null if (fr_article.model == null || fr_article.model.Article == null) { fr_article.model = new ArticleRoot { Article = new Article() }; } // Add to the total weight post.total_weight_kg += fr_article.model.Article.Weight != null ? (fr_article.model.Article.Weight * row.DeliveredQuantity) / 1000M : 0; // Calculate the price decimal? price = root.Invoice.VATIncluded == true ? row.Price / ((100 + row.VAT) / 100) : row.Price; if (row.Discount > 0M && row.DiscountType == "AMOUNT") { if (root.Invoice.VATIncluded == true) { decimal? discount = row.Discount / ((100 + row.VAT) / 100); price = price - (discount / row.DeliveredQuantity); } else { price = price - (row.Discount / row.DeliveredQuantity); } } else if (row.Discount > 0M && row.DiscountType == "PERCENT") { price = price - (price * (row.Discount / 100)); } // Add a product row post.product_rows.Add(new ProductRow { product_code = fr_article.model.Article.ArticleNumber, manufacturer_code = fr_article.model.Article.ManufacturerArticleNumber, gtin = fr_article.model.Article.EAN, product_name = row.Description, vat_rate = row.VAT / 100, quantity = row.DeliveredQuantity, unit_code = row.Unit, unit_price = price, subrows = null }); } decimal? invoice_fee = AddInvoiceFee(root.Invoice.VATIncluded, root.Invoice.AdministrationFee, root.Invoice.AdministrationFeeVAT, post.product_rows, root.Invoice.Language); decimal? freight_fee = AddFreight(root.Invoice.VATIncluded, root.Invoice.Freight, root.Invoice.FreightVAT, post.product_rows, root.Invoice.Language); post.vat_specification = CommonTools.GetVatSpecification(post.product_rows); post.subtotal = root.Invoice.Net + invoice_fee + freight_fee; post.vat_total = root.Invoice.TotalVAT; post.rounding = root.Invoice.RoundOff; post.total = root.Invoice.Total; post.paid_amount = root.Invoice.TotalToPay - root.Invoice.Balance; post.balance_due = root.Invoice.Balance; // Return the post return post; } // End of the CreateInvoice method