public IList<TransferItem> GetInvoices(int chainNo, int loanReturnNo) { InitializeComponents(); var where = CreateFilter(chainNo, loanReturnNo); LogFileWriter.WriteLine(string.Format("Setting filter before fetching invoices: '{0}'", where)); _invoiceComp.bcSetFilterRequeryStr(where); var start = DateTime.Now; var errCode = _invoiceComp.bcFetchFirst(0); LogFileWriter.WriteLine(string.Format("Time spent fetching invoices: {0}", DateTime.Now.Subtract(start))); LogFileWriter.WriteLine(string.Format("bcGetNoOfRecords = {0}", _invoiceComp.bcGetNoOfRecords())); if (errCode != 0) { LogErrorMessage(errCode); return new List<TransferItem>(); } var list = new List<TransferItem>(); do { var item = new TransferItem { InvoiceNo = _invoiceComp.bcGetInt((int)CustomerOrderCopy_Properties.COP_InvoiceNo), OrderNo = _invoiceComp.bcGetStr((int)CustomerOrderCopy_Properties.COP_OrderCopyNo), CustomerNo = _invoiceComp.bcGetInt((int)CustomerOrderCopy_Properties.COP_CustomerNo), CustomerName = _invoiceComp.bcGetStr((int)CustomerOrderCopy_Properties.COP_DeliveryCustomerName), CustomerContactNameForInvoice = _invoiceComp.bcGetStr((int)CustomerOrderCopy_Properties.COP_NameContactNoInvoice) }; start = DateTime.Now; item.Lines = GetInvoiceLines(item.InvoiceNo); LogFileWriter.WriteLine(string.Format("Time spent fetching lines for invoice {0}: {1}", item.InvoiceNo, DateTime.Now.Subtract(start))); if (item.Lines.Count > 0) list.Add(item); } while (_invoiceComp.bcFetchNext(0) == 0); return list; }
public string CreateSalesOrderFromInvoice(TransferItem transferItem) { var salesOrderComp = _vgConnection.GetSalesOrderServerComponent(); _colOrderNo = salesOrderComp.bcGetTableObjectName((int)CustomerOrderLine_Properties.COL_OrderNo); _colArticleNo = salesOrderComp.bcGetTableObjectName((int)CustomerOrderLine_Properties.COL_ArticleNo); _colName = salesOrderComp.bcGetTableObjectName((int)CustomerOrderLine_Properties.COL_Name); salesOrderComp.bcSetDefaultValuesActive(1); salesOrderComp.bcInitNewOrder(string.Empty); transferItem.OrderNoInDestinationClient = salesOrderComp.bcGetStr((int)CustomerOrder_Properties.COR_OrderNo); salesOrderComp.bcUpdateInt((int)CustomerOrder_Properties.COR_CustomerNo, transferItem.CustomerNo); salesOrderComp.bcUpdateStr((int) CustomerOrder_Properties.COR_CustomerPurchaseNo, transferItem.OrderNo); if (!string.IsNullOrWhiteSpace(transferItem.CustomerContactNameForInvoice)) salesOrderComp.bcUpdateStr((int) CustomerOrder_Properties.COR_NameContactNoInvoice, transferItem.CustomerContactNameForInvoice); var allLinesCreated = true; int errCode; foreach (var line in transferItem.Lines) { var lineIsValid = true; var artCode = salesOrderComp.bcUpdateStr((int)CustomerOrderLine_Properties.COL_ArticleNo, line.ArticleNo); salesOrderComp.bcUpdateStr((int) CustomerOrderLine_Properties.COL_Name, line.ArticleName); var priceCode = salesOrderComp.bcUpdateDouble((int)CustomerOrderLine_Properties.COL_NetPrice, (double)line.Price); if (line.DiscountInPercent1 > 0) salesOrderComp.bcUpdateDouble((int)CustomerOrderLine_Properties.COL_DiscountI, (double)line.DiscountInPercent1); var qtyCode = salesOrderComp.bcUpdateDouble((int)CustomerOrderLine_Properties.COL_Quantity, (double)line.Quantity); // Setting DiscountII after Quantity because that's how it's done by default in VG. if (line.DiscountInPercent2 > 0) salesOrderComp.bcUpdateDouble((int)CustomerOrderLine_Properties.COL_DiscountII, (double)line.DiscountInPercent2); #region Validera raden. if (artCode > 0 && artCode != 258 && artCode != 30202) { // 258 får man vid registrering av artikelstrukturer. // 30202 = Utgår. Ur hjälptexten: 'Du får registrera order på en artikel med status "Utgår" så länge som den disponibla behållningen är större än 0' lineIsValid = false; LogFileWriter.WriteLine(string.Format("ArticleNo '{0}' caused exception({1}): {2}", line.ArticleNo, artCode, salesOrderComp.bcGetMessageText(artCode))); } else if (priceCode > 0) { lineIsValid = false; LogFileWriter.WriteLine(string.Format("NetPrice '{0}' caused exception({1}): {2}", line.Price, priceCode, salesOrderComp.bcGetMessageText(priceCode))); } else if (qtyCode > 0 && qtyCode != 11944) // 11944 får man vid registrering av artikelstrukturer. { lineIsValid = false; LogFileWriter.WriteLine(string.Format("Quantity '{0}' caused exception({1}): {2}", line.Quantity, qtyCode, salesOrderComp.bcGetMessageText(qtyCode))); } #endregion #region Skapa felrapport eller spara raden. if (lineIsValid) { errCode = salesOrderComp.bcChangeLine(salesOrderComp.bcGetNoOfLines() + 1); if (errCode > 0) { LogFileWriter.WriteLine(string.Format("bcChangeLine caused exception: {0}", salesOrderComp.bcGetMessageText(errCode))); allLinesCreated = false; break; } } else { allLinesCreated = false; salesOrderComp.bcDeleteLine(salesOrderComp.bcGetNoOfLines()); } #endregion } #region Kontrollera att alla orderrader skapats. if (allLinesCreated) { if (_customerQuery.CustomerShouldPayPostage(transferItem.CustomerNo)) { var orderValue = (decimal)salesOrderComp.bcGetDouble((int) CustomerOrder_Properties.COR_TotalAmount); var valueOfExcludedOrderlines = CalculateValueOfLinesThatShouldBeExcluded(transferItem); orderValue = orderValue - valueOfExcludedOrderlines; // Due to rounding order value can actually be less than zero if all lines ar excluded. orderValue = Math.Max(orderValue, 0); var postage = Math.Round((double)orderValue * (_postageCalculationParameters.PostagePercentage / 100)); salesOrderComp.bcUpdateDouble((int)CustomerOrder_Properties.COR_Postage, postage); } errCode = salesOrderComp.bcSaveAndFinish(); if (errCode > 0) LogFileWriter.WriteLine("bcSaveAndFinish failed with message: " + salesOrderComp.bcGetMessageText(errCode)); DeleteEmptyOrderlines(salesOrderComp, transferItem.OrderNoInDestinationClient); } else { LogFileWriter.WriteLine(string.Format("At least one orderline failed. Calling CancelAndFinish for invoice {0}.", transferItem.InvoiceNo)); salesOrderComp.bcCancelAndFinish(); transferItem.OrderNoInDestinationClient = string.Empty; } #endregion return transferItem.OrderNoInDestinationClient; }
private decimal CalculateValueOfLinesThatShouldBeExcluded(TransferItem transferItem) { var value = 0m; foreach (var line in transferItem.Lines) { if (OrderlineShouldBeExcludedWhenCalculatingPostage(line)) value += line.GetTotalValue(); } return value; }