From e91c1044c8e2cd24e5665ce0c13eaec7fd5e9870 Mon Sep 17 00:00:00 2001 From: papyrussolution Date: Mon, 4 Nov 2024 17:26:29 +0300 Subject: [PATCH] Version 12.1.10 --- Src/Include/PPDEFS.H | 4 + Src/Include/SLIB.H | 6 ++ Src/PPEquip/Bht.cpp | 2 +- Src/PPEquip/EquipDll/ImpExpKorus.cpp | 2 +- Src/PPLib/Cshses.cpp | 4 +- Src/PPLib/Import.cpp | 24 ++--- Src/PPLib/Ppmsg.cpp | 2 +- Src/PPLib/STRSTORE.CPP | 2 +- Src/PPLib/chzn.cpp | 6 +- Src/PPLib/egais.cpp | 2 +- Src/PPLib/ie_bill.cpp | 2 +- Src/PPLib/ie_goods.cpp | 6 +- Src/PPLib/marketplace.cpp | 142 +++++++++++++++++++++++++-- Src/PPTEST/UNIT/test-string.cpp | 2 +- Src/PPTEST/pptest.cpp | 2 +- Src/Rsrc/Rc/PPDATA.RC | 11 ++- Src/Rsrc/Str/ppstr2.symb | 9 +- Src/Rsrc/Str/ppstr2.txt | 11 ++- Src/Rsrc/Version/genver-open.dat | 2 +- Src/SLib/sstring.cpp | 5 + 20 files changed, 198 insertions(+), 48 deletions(-) diff --git a/Src/Include/PPDEFS.H b/Src/Include/PPDEFS.H index a67b033b6b..94401521b5 100644 --- a/Src/Include/PPDEFS.H +++ b/Src/Include/PPDEFS.H @@ -1459,6 +1459,9 @@ #define PPTAG_LOT_MP_COMMISSIONPCT 119L // @v12.1.8 Процент комиссии маркетплейса с цены продажи #define PPTAG_LOT_MP_DISCOUNTPCT 120L // @v12.1.8 Процентная скидка на товар, предоставляемая маркетплейсом к цене продавца #define PPTAG_LOT_MP_SELLERSPRICE 121L // @v12.1.9 Цена товара на маркетплейсе, выставленная продавцом. Эта цена в общем случае может отличаться от цены лота по ряду причин. +#define PPTAG_LOT_MP_STOCK_INWAYTO 122L // @v12.1.10 Тег строки документа вида PPOPK_EDI_STOCK. Количество торговых единиц товара, находящихся в пути на склад +#define PPTAG_LOT_MP_STOCK_INWAYFROM 123L // @v12.1.10 Тег строки документа вида PPOPK_EDI_STOCK. Количество торговых единиц товара, находящихся в пути со склада +#define PPTAG_LOT_MP_STOCK_TIMESTAMP 124L // @v12.1.10 Тег строки документа вида PPOPK_EDI_STOCK. Момент актуалности элемента остатков, полученных от маркетплейса. // // Зарезервированные идентификаторы глобальных учетных записей // @@ -1697,6 +1700,7 @@ #define PPEDIOP_MRKTPLC_RECEIPT 101 // @v12.1.6 Поступление товара на склад маркетплейса #define PPEDIOP_MRKTPLC_ORDER 102 // @v12.1.6 Заказ от покупателя, поступивший на маркетплейс #define PPEDIOP_MRKTPLC_SALE 103 // @v12.1.6 Продажа покупателю маркетплейсом +#define PPEDIOP_MRKTPLC_STOCK 104 // @v12.1.10 Остатки на складе маркетплейса // // Descr: Статусы ответа (RECADV) на уведомление об отгрузке (DESADV) // diff --git a/Src/Include/SLIB.H b/Src/Include/SLIB.H index 0f4553b5b1..0206bc4e7a 100644 --- a/Src/Include/SLIB.H +++ b/Src/Include/SLIB.H @@ -4394,6 +4394,12 @@ public: // *this. // SString & ReplaceStr(const char * pPattern, const char * pReplacer, int once); + // + // Descr: Заменяет в строке this все двойные пробелы одинарными + // Returns: + // *this. + // + SString & ElimDblSpaces(); SString & FASTCALL ReplaceSpecSymb(int fileFormat); SString & FASTCALL RevertSpecSymb(int fileFormat); SString & ReplaceCR(); diff --git a/Src/PPEquip/Bht.cpp b/Src/PPEquip/Bht.cpp index 01ef2c2994..274f8bdb1f 100644 --- a/Src/PPEquip/Bht.cpp +++ b/Src/PPEquip/Bht.cpp @@ -4441,7 +4441,7 @@ static int GetBillRows(const char * pLName, TSVector * pList) PPLoadString("bailment", temp_buf); //PPGetMessage(mfError, PPERR_INVBHTTOHOSTOP, 0, 1, msg_buf); PPLoadString(PPMSG_ERROR, PPERR_INVBHTTOHOSTOP, msg_buf); - msg_buf.ReplaceChar('\003', ' ').ReplaceChar('\n', ' ').ReplaceStr(" ", " ", 0); + msg_buf.ReplaceChar('\003', ' ').ReplaceChar('\n', ' ').ElimDblSpaces(); add_info.Printf(msg_buf, temp_buf.cptr(), sdr_bill.SampleID, s_dt.cptr(), bill_code.cptr()); // @v11.3.12 @fix buf.ShiftLeft(); pLog->Log(/*buf*/add_info); diff --git a/Src/PPEquip/EquipDll/ImpExpKorus.cpp b/Src/PPEquip/EquipDll/ImpExpKorus.cpp index b41d62b3ba..084107363f 100644 --- a/Src/PPEquip/EquipDll/ImpExpKorus.cpp +++ b/Src/PPEquip/EquipDll/ImpExpKorus.cpp @@ -2739,6 +2739,6 @@ void ProcessError(EDIWebServiceSoapProxy & rProxy) temp_buf = temp_err_buf; temp_buf.ReplaceChar('\x0A', ' '); temp_buf.ReplaceChar('\x0D', ' '); - temp_buf.ReplaceStr(" ", " ", 0); + temp_buf.ElimDblSpaces(); StrError = temp_buf; } diff --git a/Src/PPLib/Cshses.cpp b/Src/PPLib/Cshses.cpp index c774601b8d..8244e6dd8a 100644 --- a/Src/PPLib/Cshses.cpp +++ b/Src/PPLib/Cshses.cpp @@ -2120,8 +2120,8 @@ int AsyncCashGoodsIterator::Next(AsyncCashGoodsInfo * pInfo) } Rec.ID = grec.ID; // Замена символов перевода каретки на пробелы - (temp_buf = grec.Name).ReplaceChar('\x0D', ' ').ReplaceChar('\x0A', ' ').ReplaceStr(" ", " ", 0).CopyTo(Rec.Name, sizeof(Rec.Name)); - (temp_buf = grec.Abbr).ReplaceChar('\x0D', ' ').ReplaceChar('\x0A', ' ').ReplaceStr(" ", " ", 0).CopyTo(Rec.Abbr, sizeof(Rec.Abbr)); + (temp_buf = grec.Name).ReplaceChar('\x0D', ' ').ReplaceChar('\x0A', ' ').ElimDblSpaces().CopyTo(Rec.Name, sizeof(Rec.Name)); + (temp_buf = grec.Abbr).ReplaceChar('\x0D', ' ').ReplaceChar('\x0A', ' ').ElimDblSpaces().CopyTo(Rec.Abbr, sizeof(Rec.Abbr)); if(Flags & ACGIF_EXCLALTFOLD) GObj.P_Tbl->GetExclusiveAltParent(grec.ID, AcnPack.GoodsGrpID, &Rec.ParentID); else diff --git a/Src/PPLib/Import.cpp b/Src/PPLib/Import.cpp index 2e7002bd5f..2434fce353 100644 --- a/Src/PPLib/Import.cpp +++ b/Src/PPLib/Import.cpp @@ -2101,8 +2101,8 @@ int PrcssrPhoneListImport::Run() phone = (temp_buf = city_prefix).Cat(phone); } } - (address = rec.Address).Strip().ReplaceStr(" ", " ", 0).Transf(CTRANSF_OUTER_TO_INNER); - (contact = rec.Contact).Strip().ReplaceStr(" ", " ", 0).Transf(CTRANSF_OUTER_TO_INNER); + (address = rec.Address).Strip().ElimDblSpaces().Transf(CTRANSF_OUTER_TO_INNER); + (contact = rec.Contact).Strip().ElimDblSpaces().Transf(CTRANSF_OUTER_TO_INNER); if(address.NotEmpty() || contact.NotEmpty()) { phone_idx_list.clear(); if(LocObj.P_Tbl->SearchPhoneIndex(phone, 0, phone_idx_list) > 0) { @@ -7765,9 +7765,9 @@ int ImportSpecial(const char * pPath_) if(scan.Skip().IncrChr(',') && scan.Skip().GetQuotedString(nm)) { // name if(scan.Skip().IncrChr(',') && scan.Skip().GetQuotedString(temp_buf)) { // time_zone if(scan.Skip().IncrChr(',') && scan.Skip().GetQuotedString(temp_buf)) { // podm - phn.Strip().Utf8ToLower().ReplaceStr(" ", " ", 0); // - addr.Strip().Utf8ToLower().ReplaceStr(" ", " ", 0); // - nm.Strip().Utf8ToLower().ReplaceStr(" ", " ", 0); // + phn.Strip().Utf8ToLower().ElimDblSpaces(); // + addr.Strip().Utf8ToLower().ElimDblSpaces(); // + nm.Strip().Utf8ToLower().ElimDblSpaces(); // // nm;eml;pw;phn;gender;dob;id;cntry;cty;adr;src out_buf.Z().Cat("cn:").Cat(nm).Semicol().Cat(eml).Semicol().Cat(""/*pwd*/).Semicol().Cat(phn). Semicol().Cat(""/*gender*/).Semicol().Cat(""/*dob*/).Semicol().Cat(""/*id*/).Semicol().Cat("ru").Semicol().Cat(""/*cty*/). @@ -7829,17 +7829,17 @@ int ImportSpecial(const char * pPath_) scan.Skip().GetUntil(';', temp_buf); temp_buf.StripQuotes(); dob = strtodate_(temp_buf, DATF_YMD); - phn.Strip().Utf8ToLower().ReplaceStr(" ", " ", 0); // - addr.Strip().Utf8ToLower().ReplaceStr(" ", " ", 0); // - nm.Strip().Utf8ToLower().ReplaceStr(" ", " ", 0); // - eml.Strip().Utf8ToLower().ReplaceStr(" ", " ", 0); // - country.Strip().Utf8ToLower().ReplaceStr(" ", " ", 0); // - ident.Strip().Utf8ToLower().ReplaceStr(" ", " ", 0); // + phn.Strip().Utf8ToLower().ElimDblSpaces(); // + addr.Strip().Utf8ToLower().ElimDblSpaces(); // + nm.Strip().Utf8ToLower().ElimDblSpaces(); // + eml.Strip().Utf8ToLower().ElimDblSpaces(); // + country.Strip().Utf8ToLower().ElimDblSpaces(); // + ident.Strip().Utf8ToLower().ElimDblSpaces(); // if(ident.HasPrefixIAscii("dni")) { (temp_buf = "ardni").Colon().Cat(ident.ShiftLeft(3).Strip()); ident = temp_buf; } - sex.Strip().Utf8ToLower().ReplaceStr(" ", " ", 0); // + sex.Strip().Utf8ToLower().ElimDblSpaces(); // if(sex.IsEqiAscii("Femenino")) sex = "femme"; else if(sex.IsEqiAscii("Masculino")) diff --git a/Src/PPLib/Ppmsg.cpp b/Src/PPLib/Ppmsg.cpp index dec7b6b061..45521d0269 100644 --- a/Src/PPLib/Ppmsg.cpp +++ b/Src/PPLib/Ppmsg.cpp @@ -491,7 +491,7 @@ int STDCALL PPGetMessage(uint options, int msgcode, const char * pAddInfo, int r } rBuf = msgcode ? temp_buf : pAddInfo; if(rmvSpcChrs) - rBuf.ReplaceChar('\003', ' ').ReplaceChar('\n', ' ').ReplaceStr(" ", " ", 0); // @v10.6.7 .ReplaceStr(" ", " ", 0) + rBuf.ReplaceChar('\003', ' ').ReplaceChar('\n', ' ').ElimDblSpaces(); // @v10.6.7 .ElimDblSpaces() } return 1; } diff --git a/Src/PPLib/STRSTORE.CPP b/Src/PPLib/STRSTORE.CPP index da02d8165d..a77ebbb011 100644 --- a/Src/PPLib/STRSTORE.CPP +++ b/Src/PPLib/STRSTORE.CPP @@ -804,7 +804,7 @@ static void RecoverAutotranslatedString(SString & rBuf, StrAssocArray & rAssocLi } } // } @debug - rBuf.ReplaceStr(" ", " ", 0); + rBuf.ElimDblSpaces(); } int StringStore2::Compile(const char * pFileName, long flags, const char * pTranslateToLang) diff --git a/Src/PPLib/chzn.cpp b/Src/PPLib/chzn.cpp index 02fab384f9..c15009886f 100644 --- a/Src/PPLib/chzn.cpp +++ b/Src/PPLib/chzn.cpp @@ -1700,7 +1700,7 @@ int ChZnInterface::SetupInitBlock(PPID guaID, const char * pEndPoint, InitBlock rBlk.GuaPack.TagL.GetItemStr(PPTAG_GUA_CHZN_PM_TOKEN, rBlk.PermissiveModeToken); // @v11.9.11 if(rBlk.Cn.NotEmptyS()) { //rBlk.Cn.ReplaceStr("\"", " ", 0); - //rBlk.Cn.ReplaceStr(" ", " ", 0); + //rBlk.Cn.ElimDblSpaces(); rBlk.Cn.Transf(CTRANSF_INNER_TO_OUTER); } if(rBlk.GuaPack.TagL.GetItemStr(PPTAG_GUA_PROTOCOL, temp_buf) > 0) { @@ -1771,7 +1771,7 @@ int ChZnInterface::GetSign(const InitBlock & rIb, const void * pData, size_t dat { cn = rIb.Cn; cn.ReplaceStr("\"", " ", 0); - cn.ReplaceStr(" ", " ", 0); + cn.ElimDblSpaces(); cn.Strip(); } temp_buf.Space().Cat("-sfsign").Space().Cat("-sign").Space().Cat("-in").Space().Cat(in_file_name).Space(). @@ -2036,7 +2036,7 @@ const CERT_CONTEXT * ChZnInterface::GetClientSslCertificate(InitBlock & rIb) SStringU cnu; SString temp_buf = rIb.Cn; //temp_buf.ReplaceStr("\"", " ", 0); - //temp_buf.ReplaceStr(" ", " ", 0); + //temp_buf.ElimDblSpaces(); temp_buf.Strip(); cnu.CopyFromMb_OUTER(temp_buf, temp_buf.Len()); diff --git a/Src/PPLib/egais.cpp b/Src/PPLib/egais.cpp index 2e9c172f18..66a815ea06 100644 --- a/Src/PPLib/egais.cpp +++ b/Src/PPLib/egais.cpp @@ -6503,7 +6503,7 @@ int PPEgaisProcessor::Read_Rests(xmlNode * pFirstNode, PPID locID, const DateRan const EgaisRestItem & r_item = items.at(i); if(r_item.GoodsID) { PPTransferItem ti; - uint new_pos = p_bp->GetTCount(); + const uint new_pos = p_bp->GetTCount(); THROW(ti.Init(&p_bp->Rec, 1)); THROW(ti.SetupGoods(r_item.GoodsID, 0)); { diff --git a/Src/PPLib/ie_bill.cpp b/Src/PPLib/ie_bill.cpp index bc07b54ec6..6846ccff8e 100644 --- a/Src/PPLib/ie_bill.cpp +++ b/Src/PPLib/ie_bill.cpp @@ -7402,7 +7402,7 @@ int DocNalogRu_Generator::WriteFIO(const char * pName, long parentTokId, bool as SString temp_buf; SString first_name, sername, patronimic; SString fullname_buf(pName); - fullname_buf.Strip().ReplaceStr(",", " ", 0).ReplaceStr(";", " ", 0).ReplaceStr(" ", " ", 0); + fullname_buf.Strip().ReplaceStr(",", " ", 0).ReplaceStr(";", " ", 0).ElimDblSpaces(); { StringSet ss; fullname_buf.Tokenize(" ,;.", ss); diff --git a/Src/PPLib/ie_goods.cpp b/Src/PPLib/ie_goods.cpp index 5e27a125ea..2d05ccf4f0 100644 --- a/Src/PPLib/ie_goods.cpp +++ b/Src/PPLib/ie_goods.cpp @@ -3379,12 +3379,12 @@ int IntermediateImportedGoodsCollection::Add(const Entry & rEntry) if(rEntry.Name.NotEmpty() && rEntry.Code.NotEmpty()) { SString temp_buf; (temp_buf = rEntry.Name).Utf8ToLower(); - temp_buf.ReplaceStr(" ", " ", 0); + temp_buf.ElimDblSpaces(); InnerEntry new_entry; SStrGroup::AddS(temp_buf, &new_entry.NameP); // temp_buf = rEntry.GrpName; - temp_buf.ReplaceStr(" ", " ", 0); + temp_buf.ElimDblSpaces(); if(temp_buf.NotEmptyS()) { temp_buf.Utf8ToLower(); uint v = 0; @@ -3401,7 +3401,7 @@ int IntermediateImportedGoodsCollection::Add(const Entry & rEntry) } // temp_buf = rEntry.BrandName; - temp_buf.ReplaceStr(" ", " ", 0); + temp_buf.ElimDblSpaces(); if(temp_buf.NotEmptyS()) { temp_buf.Utf8ToLower(); uint v = 0; diff --git a/Src/PPLib/marketplace.cpp b/Src/PPLib/marketplace.cpp index ab7ced37b6..ebaf2717c7 100644 --- a/Src/PPLib/marketplace.cpp +++ b/Src/PPLib/marketplace.cpp @@ -365,11 +365,12 @@ class PPMarketplaceInterface_Wildberries : public PPMarketplaceInterface { int CreateWarehouse(PPID * pID, int64 outerId, const char * pOuterName, const char * pAddress, int use_ta); const Warehouse * SearchWarehouseByName(const TSCollection & rWhList, const char * pWhName, bool adoptive) const; - int ResolveWarehouseByName(const TSCollection & rWhList, const char * pWhName, PPID defaultID, PPID * pResultID); + int ResolveWarehouseByName(const TSCollection & rWhList, const char * pWhName, PPID defaultID, PPID * pResultID, int use_ta); int ImportOrders(); int ImportReceipts(); int ImportSales(); int ImportFinancialTransactions(); + int ImportStocks(); private: int GetLocalCachePath(SString & rBuf); int FetchWarehouseList(TSCollection & rList); @@ -2127,6 +2128,7 @@ int PPMarketplaceInterface_Wildberries::CreateWarehouse(PPID * pID, int64 outerI const PPMarketplaceInterface_Wildberries::Warehouse * PPMarketplaceInterface_Wildberries::SearchWarehouseByName(const TSCollection & rWhList, const char * pWhName, bool adoptive) const { const Warehouse * p_result = 0; + SString temp_buf; SString key_buf(pWhName); key_buf.Strip(); { @@ -2137,39 +2139,49 @@ const PPMarketplaceInterface_Wildberries::Warehouse * PPMarketplaceInterface_Wil } } if(!p_result && adoptive) { - SString temp_buf; - key_buf.Utf8ToLower().ReplaceStr("(", " ", 0).ReplaceStr(")", " ", 0).ReplaceStr(" ", " ", 0).Strip(); + key_buf.Utf8ToLower().ReplaceStr("(", " ", 0).ReplaceStr(")", " ", 0).ElimDblSpaces().Strip(); { LongArray eqpfx_list; + LongArray hassub_list; for(uint i = 0; !p_result && i < rWhList.getCount(); i++) { const Warehouse * p_iter = rWhList.at(i); if(p_iter) { - (temp_buf = p_iter->Name).Utf8ToLower().ReplaceStr("(", " ", 0).ReplaceStr(")", " ", 0).ReplaceStr(" ", " ", 0).Strip(); + (temp_buf = p_iter->Name).Utf8ToLower().ReplaceStr("(", " ", 0).ReplaceStr(")", " ", 0).ElimDblSpaces().Strip(); if(temp_buf.IsEq(key_buf)) p_result = p_iter; else if(temp_buf.HasPrefix(key_buf)) { eqpfx_list.add(i); } + else if(temp_buf.Search(key_buf, 0, 0, 0)) { + hassub_list.add(i); + } } } if(!p_result) { if(eqpfx_list.getCount() == 1) { p_result = rWhList.at(eqpfx_list.get(0)); } + else if(hassub_list.getCount() == 1) { + p_result = rWhList.at(hassub_list.get(0)); + } } } } + if(!p_result) { + (temp_buf = pWhName).Transf(CTRANSF_UTF8_TO_INNER); + PPSetError(PPERR_MP_WAREHOUSEIDENTFAULT, temp_buf); + } return p_result; } -int PPMarketplaceInterface_Wildberries::ResolveWarehouseByName(const TSCollection & rWhList, const char * pWhName, PPID defaultID, PPID * pResultID) +int PPMarketplaceInterface_Wildberries::ResolveWarehouseByName(const TSCollection & rWhList, const char * pWhName, PPID defaultID, PPID * pResultID, int use_ta) { int ok = -1; PPID wh_id = 0; if(!isempty(pWhName)) { const Warehouse * p_wh = SearchWarehouseByName(WhList, pWhName, true); if(p_wh) { - if(CreateWarehouse(&wh_id, p_wh->ID, p_wh->Name, p_wh->Address, 1) > 0) { + if(CreateWarehouse(&wh_id, p_wh->ID, p_wh->Name, p_wh->Address, use_ta) > 0) { assert(wh_id > 0); MpLocList.addUnique(wh_id); ok = 1; @@ -2441,7 +2453,7 @@ int PPMarketplaceInterface_Wildberries::ImportReceipts() if(p_wb_item) { PPID wh_id = 0; BillTbl::Rec ex_bill_rec; - ResolveWarehouseByName(WhList, p_wb_item->WarehouseName, LConfig.Location, &wh_id); + ResolveWarehouseByName(WhList, p_wb_item->WarehouseName, LConfig.Location, &wh_id, 1/*use_ta*/); const PPID goods_id = CreateWare(p_wb_item->Ware, 1/*use_ta*/); if(goods_id) { bill_code.Z().Cat(p_wb_item->IncomeID); @@ -2758,7 +2770,7 @@ int PPMarketplaceInterface_Wildberries::ImportSales() const double seller_part_amount = p_wb_item->ForPay; BillTbl::Rec ord_bill_rec; BillTbl::Rec ex_bill_rec; - ResolveWarehouseByName(WhList, p_wb_item->WarehouseName, LConfig.Location, &wh_id); + ResolveWarehouseByName(WhList, p_wb_item->WarehouseName, LConfig.Location, &wh_id, 1/*use_ta*/); bill_code.Z().Cat(p_wb_item->SaleId); ord_bill_code.Z().Cat(p_wb_item->GNumber); if(p_bobj->P_Tbl->SearchByCode(bill_code, sale_op_id, ZERODATE, &ex_bill_rec) > 0) { @@ -2977,7 +2989,7 @@ int PPMarketplaceInterface_Wildberries::ImportOrders() const PPMarketplaceInterface_Wildberries::Sale * p_wb_item = order_list.at(ord_list_idx); if(p_wb_item) { PPID wh_id = 0; - ResolveWarehouseByName(WhList, p_wb_item->WarehouseName, LConfig.Location, &wh_id); + ResolveWarehouseByName(WhList, p_wb_item->WarehouseName, LConfig.Location, &wh_id, 1/*use_ta*/); bill_code.Z().Cat(p_wb_item->GNumber); if(p_bobj->P_Tbl->SearchByCode(bill_code, order_op_id, ZERODATE, 0) > 0) { ; @@ -3131,6 +3143,114 @@ int PPMarketplaceInterface_Wildberries::FindShipmentBillByOrderIdent(const char return ok; } +int PPMarketplaceInterface_Wildberries::ImportStocks() // @construction +{ + int ok = -1; + PPID stock_op_id = 0; // Вид операции фиксации остатков (драфт-документ, чаще всего это - PPOPK_EDI_STOCK) + PPObjOprKind op_obj; + TSCollection stock_list; + { + PPID op_id = 0; + if(op_obj.GetEdiStockOp(&op_id, 1)) { + stock_op_id = op_id; + } + } + if(stock_op_id) { + int r = RequestStocks(stock_list); + if(r && stock_list.getCount()) { + PPObjBill * p_bobj = BillObj; + BillCore * p_billc = p_bobj->P_Tbl; + PPIDArray wh_list; + PPTransaction tra(1); + THROW(tra); + { + // + // Сначала соберем список складов, на которых что-то есть, и лишь потом пробежим циклом по каждому складу и для каждого сформируем отдельный документ + // + for(uint i = 0; i < stock_list.getCount(); i++) { + const Stock * p_item = stock_list.at(i); + if(p_item && p_item->Qtty > 0.0) { // Не используем QttyFull поскольку нам интересен только фактический остаток (без учета того что движется на склад/со склада) + PPID wh_id = 0; + if(ResolveWarehouseByName(WhList, p_item->WarehouseName, 0/*default*/, &wh_id, 0/*use_ta*/) > 0) { + wh_list.add(wh_id); + } + else + R_Prc.GetLogger().LogLastError(); + } + } + } + if(wh_list.getCount()) { + wh_list.sortAndUndup(); + const LDATETIME now_dtm = getcurdatetime_(); + for(uint whidx = 0; whidx < wh_list.getCount(); whidx++) { + const PPID wh_id = wh_list.get(whidx); + PPBillPacket bpack; + bool is_bpack_inited = false; + for(uint i = 0; i < stock_list.getCount(); i++) { + const Stock * p_item = stock_list.at(i); + if(p_item && p_item->Qtty > 0.0) { // Не используем QttyFull поскольку нам интересен только фактический остаток (без учета того что движется на склад/со склада) + PPID local_wh_id = 0; + if(ResolveWarehouseByName(WhList, p_item->WarehouseName, 0/*default*/, &local_wh_id, 0/*use_ta*/) > 0 && local_wh_id == wh_id) { + PPID goods_id = CreateWare(p_item->Ware, 0/*use_ta*/); + if(!goods_id) { + ; // @todo что-то в log вывести + } + else { + if(!is_bpack_inited) { + { + BillTbl::Key2 k2; + k2.OpID = stock_op_id; + k2.Dt = now_dtm.d; + k2.BillNo = 0; + while(p_billc->search(2, &k2, spGt) && k2.OpID == stock_op_id && k2.Dt == now_dtm.d) { + BillTbl::Rec ex_bill_rec; + p_billc->copyBufTo(&ex_bill_rec); + if(ex_bill_rec.LocID == wh_id) { + THROW(p_bobj->RemovePacket(ex_bill_rec.ID, 0)); + } + } + } + THROW(bpack.CreateBlank2(stock_op_id, now_dtm.d, wh_id, 0/*use_ta*/)); + bpack.SetupEdiAttributes(PPEDIOP_MRKTPLC_STOCK, "MP-WILDBERRIES", 0); + is_bpack_inited = true; + } + PPTransferItem ti; + const uint new_pos = bpack.GetTCount(); + THROW(ti.Init(&bpack.Rec, 1)); + THROW(ti.SetupGoods(goods_id, 0)); + ti.Quantity_ = p_item->Qtty; + THROW(bpack.LoadTItem(&ti, 0, 0)); + { + ObjTagList tag_list; + if(p_item->InWayFromClient > 0.0) + tag_list.PutItemReal(PPTAG_LOT_MP_STOCK_INWAYTO, p_item->InWayFromClient); + if(p_item->InWayToClient > 0.0) + tag_list.PutItemReal(PPTAG_LOT_MP_STOCK_INWAYFROM, p_item->InWayToClient); + if(checkdate(p_item->DtmLastChange.d)) { + ObjTagItem tag_item; + if(tag_item.SetTimestamp(PPTAG_LOT_MP_STOCK_TIMESTAMP, p_item->DtmLastChange)) { + tag_list.PutItem(PPTAG_LOT_MP_STOCK_TIMESTAMP, &tag_item); + } + } + THROW(bpack.LTagL.Set(new_pos, &tag_list)); + } + } + } + } + } + if(is_bpack_inited && bpack.GetTCount()) { + bpack.InitAmounts(); + THROW(p_bobj->TurnPacket(&bpack, 0)); + } + } + } + THROW(tra.Commit()); + } + } + CATCHZOK + return ok; +} + int PPMarketplaceInterface_Wildberries::ImportFinancialTransactions() { int ok = -1; @@ -3253,7 +3373,7 @@ int PPMarketplaceInterface_Wildberries::ImportFinancialTransactions() else { PPID loc_id = 0; ArticleTbl::Rec ar_rec; - ResolveWarehouseByName(WhList, p_entry->Warehouse, LConfig.Location, &loc_id); + ResolveWarehouseByName(WhList, p_entry->Warehouse, LConfig.Location, &loc_id, 1/*use_ta*/); switch(native_op_id) { case nativeopCargo: // ppvz_vw, ppvz_vw_nds, rebill_logistic_cost @@ -3920,6 +4040,8 @@ int PrcssrMarketplaceInterchange::Run() p_ifc_wb->ImportSales(); Logger.LogString(PPTXT_MP_PROCESSING_FINTRANSACTIONS, 0); p_ifc_wb->ImportFinancialTransactions(); + Logger.LogString(PPTXT_MP_PROCESSING_STOCK, 0); + p_ifc_wb->ImportStocks(); } CATCHZOK PPWait(0); diff --git a/Src/PPTEST/UNIT/test-string.cpp b/Src/PPTEST/UNIT/test-string.cpp index 0ab0908b0a..06dca96a7b 100644 --- a/Src/PPTEST/UNIT/test-string.cpp +++ b/Src/PPTEST/UNIT/test-string.cpp @@ -440,7 +440,7 @@ SLTEST_FIXTURE(SString, SlTestFixtureSString) // (str = "abcabc").ReplaceStr("abc", "abcd", 0); SLCHECK_EQ(str, "abcdabcd"); - (str = " ab cab c ").ReplaceStr(" ", " ", 0); + (str = " ab cab c ").ElimDblSpaces(); SLCHECK_EQ(str, " ab cab c "); (str = "$ab$$cab$c$").ReplaceStr("$", "$$", 0); SLCHECK_EQ(str, "$$ab$$$$cab$$c$$"); diff --git a/Src/PPTEST/pptest.cpp b/Src/PPTEST/pptest.cpp index b41febaedc..df5f3918c0 100644 --- a/Src/PPTEST/pptest.cpp +++ b/Src/PPTEST/pptest.cpp @@ -1316,7 +1316,7 @@ static void PreprocessText(SString & rText) while(oneof2(rText.C(0), '\xD', '\xA')) rText.ShiftLeft(); rText.Chomp(); - rText.ReplaceStr(" ", " ", 0); + rText.ElimDblSpaces(); rText.Strip(); } diff --git a/Src/Rsrc/Rc/PPDATA.RC b/Src/Rsrc/Rc/PPDATA.RC index c4163722b0..5405106e74 100644 --- a/Src/Rsrc/Rc/PPDATA.RC +++ b/Src/Rsrc/Rc/PPDATA.RC @@ -1019,7 +1019,7 @@ ROD_QUOTKIND PP_RCDATA { // {ID, Name, Symb, ObjType, DataType} // ROD_TAG PP_RCDATA { - 113, + 116, 1, "@{rtag_lotclb}\0", "LOTCLB\0", "LOT\0", "STRING\0" // @v9.8.11 2, "@{rtag_lotserial}\0", "LOTSERIAL\0", "LOT\0", "STRING\0" // @v9.8.11 4, "@{rtag_posrights}\0", "POSRIGHTS\0", "PERSON\0", "STRING\0" @@ -1130,9 +1130,12 @@ ROD_TAG PP_RCDATA { 116, "@{rtag_person_marketplacesymb}\0", "MARKETPLACESYMB\0", "PERSON\0", "STRING\0" // @v12.1.1 PPTAG_PERSON_MARKETPLACESYMB 117, "@{rtag_gua_account}\0", "GUAACCOUNT\0", "GLOBALUSER\0", "LINK:ACCOUNT\0" // @v12.1.3 , , . 118, "@{rtag_lot_orgorderident}\0", "ORGORDERIDENT\0", "LOT\0", "STRING\0" // @v12.1.4 . . - 119, "@{rtag_lot_mp_commissionpct}\0", "MP_COMMISSIONPCT\0", "LOT\0", "NUMBER\0" // @v12.1.8 - 120, "@{rtag_lot_mp_discountpct}\0", "MP_DISCOUNTPCT\0", "LOT\0", "NUMBER\0" // @v12.1.8 , - 121, "@{rtag_lot_mp_sellersprice}\0", "MP_SELLERSPRICE\0", "LOT\0", "NUMBER\0" // @v12.1.9 , . . + 119, "@{rtag_lot_mp_commissionpct}\0", "MP_COMMISSIONPCT\0", "LOT\0", "NUMBER\0" // @v12.1.8 + 120, "@{rtag_lot_mp_discountpct}\0", "MP_DISCOUNTPCT\0", "LOT\0", "NUMBER\0" // @v12.1.8 , + 121, "@{rtag_lot_mp_sellersprice}\0", "MP_SELLERSPRICE\0", "LOT\0", "NUMBER\0" // @v12.1.9 , . . + 122, "@{rtag_lot_mp_stockinwayto}\0", "MP_STOCK_INWAYTO\0", "LOT\0", "NUMBER\0" // @v12.1.10 PPOPK_EDI_STOCK. , + 123, "@{rtag_lot_mp_stockinwayfrom}\0", "MP_STOCK_INWAYFROM\0", "LOT\0", "NUMBER\0" // @v12.1.10 PPOPK_EDI_STOCK. , + 124, "@{rtag_lot_mp_stocktimestamp}\0", "MP_STOCK_TIMESTAMP\0", "LOT\0", "TIMESTAMP\0" // @v12.1.10 PPOPK_EDI_STOCK. , . //#define PPTAG_LOC_VETIS_REGIONGUID 99L // @v11.0.10 - ( ) // - region GUID ( UUID) // 40, " \0", "FSRARGOODSCODE\0", "GOODS\0", "STRING\0" diff --git a/Src/Rsrc/Str/ppstr2.symb b/Src/Rsrc/Str/ppstr2.symb index b70233ee5a..80c3ae9420 100644 --- a/Src/Rsrc/Str/ppstr2.symb +++ b/Src/Rsrc/Str/ppstr2.symb @@ -1,8 +1,8 @@ [common] LastAutoGrpCode=1001 -LastSignatureCode=2147494924 -LastAutoCodeList=1,12251;102,10177;103,10072;110,10000;111,12120;112,10000;119,10000;114,10006;7,10000;4,10000;6,10000;342,10000;118,10152;120,10005;1001,10000;121,10000;122,10000;123,10327;124,10354;125,10064 +LastSignatureCode=2147494927 +LastAutoCodeList=1,12252;102,10177;103,10072;110,10000;111,12121;112,10000;119,10000;114,10006;7,10000;4,10000;6,10000;342,10000;118,10152;120,10005;1001,10000;121,10000;122,10000;123,10327;124,10354;125,10064 [SignatureList] testsign1=2147483649 @@ -2577,6 +2577,9 @@ rtag_lot_orgorderident=2147494866 rtag_lot_mp_commissionpct=2147494916 rtag_lot_mp_discountpct=2147494917 rtag_lot_mp_sellersprice=2147494918 +rtag_lot_mp_stockinwayto=2147494925 +rtag_lot_mp_stockinwayfrom=2147494926 +rtag_lot_mp_stocktimestamp=2147494927 rregt_passport=2147485696 rregt_regfree=2147485697 rregt_tpid=2147485698 @@ -13510,6 +13513,7 @@ PPERR_COMPIDENTAMBIG_GUID=77767 PPERR_COMPIDENTAMBIG_MACADR=77768 PPERR_GCFORMBYSYMBNFOUND=77773 PPERR_GCHASNTFORMULALIST=77774 +PPERR_MP_WAREHOUSEIDENTFAULT=77788 PPCFM_TEXT_89=6694673 PPCFM_TEXT_90=6694674 PPCFM_DELUSRGRP=6694675 @@ -15872,6 +15876,7 @@ PPTXT_MP_PROCESSING_RECEIPTS=7286610 PPTXT_MP_PROCESSING_ORDERS=7286611 PPTXT_MP_PROCESSING_SALES=7286612 PPTXT_MP_PROCESSING_FINTRANSACTIONS=7286613 +PPTXT_MP_PROCESSING_STOCK=7286617 PPTXT_MP_FINTRA_WB_REQ=7286614 PPTXT_MP_FINTRA_WB_REPEMPTY=7286615 PPSSYM_SYMB=7481105 diff --git a/Src/Rsrc/Str/ppstr2.txt b/Src/Rsrc/Str/ppstr2.txt index 85abdbda05..483b3bbaad 100644 --- a/Src/Rsrc/Str/ppstr2.txt +++ b/Src/Rsrc/Str/ppstr2.txt @@ -2347,6 +2347,7 @@ PPERR_COMPIDENTAMBIG_GUID "Неоднозначность в иден PPERR_COMPIDENTAMBIG_MACADR "Неоднозначность в идентификации компьютера по MAC-адресу (%s)" PPERR_GCFORMBYSYMBNFOUND "Формула класса товаров по символу не найдена (%s)" PPERR_GCHASNTFORMULALIST "Класс товаров '%s' не содержит формул общего назначения" +PPERR_MP_WAREHOUSEIDENTFAULT "Ошибка разрешения склада маркетплейса по имени (%s)" // LastError @@ -4715,7 +4716,7 @@ PPTXT_LAB_SELECTGSTRUC "Выберите структуру тов PPTXT_MOVSCARDREST "Перенос остатков с карт" PPTXT_EDIOP /!/ "1,ORDER;2,ORDERRSP;3,APERAK;4,DESADV;5,RECADV;6,DECLINEORDER;7,ALCODESADV;8,SALESORDER;9,PARTIN;10,INVOIC;11,RETURNREQ;\ 21,EGAIS-WAYBILL;22,EGAIS-TICKET;23,EGAIS-WAYBILLACT;42,EGAIS-REPLYRESTS;50,EGAIS-REPLYRESTSSHOP;59,PPEDIOP_EGAIS_WAYBILL_V2;\ - 66,PPEDIOP_EGAIS_WAYBILL_V3;77,PPEDIOP_EGAIS_WAYBILL_V4;101,MRKTPLC_RECEIPT;102,MRKTPLC_ORDER;103,MRKTPLC_SALE" + 66,PPEDIOP_EGAIS_WAYBILL_V3;77,PPEDIOP_EGAIS_WAYBILL_V4;101,MRKTPLC_RECEIPT;102,MRKTPLC_ORDER;103,MRKTPLC_SALE;104,MRKTPLC_STOCK" PPTXT_EDIEXPCMD "1,ORDER,@{booking};2,RECADV,Уведомление о приходе" PPTXT_EDIIMPCMD "1000,FULLCYCLE,Полный обмен;1,APERAK,Получение статуса;2,ORDRSP,Подтверждение заказа;3,DESADV,Уведомление об отгрузке;4,ALCODESADV,Атрибуты алкогольной продукции" PPTXT_WAITFORWRSHRFILENOTIFY "Ожидание завершения записи в файл '@zstr' продлилось @int ms" // @v11.9.2 @fix %-->@ @@ -5079,6 +5080,7 @@ PPTXT_MP_PROCESSING_RECEIPTS "Маркетплейс: обработка PPTXT_MP_PROCESSING_ORDERS "Маркетплейс: обработка заказов" PPTXT_MP_PROCESSING_SALES "Маркетплейс: обработка продаж" PPTXT_MP_PROCESSING_FINTRANSACTIONS "Маркетплейс: обработка финансовых транзакций" +PPTXT_MP_PROCESSING_STOCK "Маркетплейс: обработка остатков" PPTXT_MP_FINTRA_WB_REQ "Запрос отчета о продажах по реализации за период %s" PPTXT_MP_FINTRA_WB_REPEMPTY "Сервер Wildberries вернул пустой результат" // @@ -8592,8 +8594,11 @@ IMPEXPCMD_DECLNORDER "DECLNORDER" @rtag_gua_account "Счет глобальной учетной записи" // @v12.1.3 @rtag_lot_orgorderident "Оригинальный идентификатор заказа" // @v12.1.4 @rtag_lot_mp_commissionpct "Маркетплейс: процент комиссии от цены продавца" // @v12.1.8 -@rtag_lot_mp_discountpct "Маркетплейс: процент скидки от цены продавца" // @v12.1.8 -@rtag_lot_mp_sellersprice "Маркетплейс: цена продавца" // @v12.1.9 +@rtag_lot_mp_discountpct "Маркетплейс: процент скидки от цены продавца" // @v12.1.8 +@rtag_lot_mp_sellersprice "Маркетплейс: цена продавца" // @v12.1.9 +@rtag_lot_mp_stockinwayto "Маркетплейс: количество, движущееся на склад" // @v12.1.10 +@rtag_lot_mp_stockinwayfrom "Маркетплейс: количество, движущееся со склада" // @v12.1.10 +@rtag_lot_mp_stocktimestamp "Маркетплейс: время актуальности остатка" // @v12.1.10 // // Зарезервированные типы регистрационных документов // diff --git a/Src/Rsrc/Version/genver-open.dat b/Src/Rsrc/Version/genver-open.dat index 724759713c..5505ccdc67 100644 --- a/Src/Rsrc/Version/genver-open.dat +++ b/Src/Rsrc/Version/genver-open.dat @@ -15,7 +15,7 @@ OpenSource = 1 MajorVer =12 MinorVer =1 Revision =10 -AssemblyVer=40716 +AssemblyVer=40717 MinMajorVer =9 MinMinorVer =8 MinRevision =11 diff --git a/Src/SLib/sstring.cpp b/Src/SLib/sstring.cpp index d0cf5e47a3..137b2462f0 100644 --- a/Src/SLib/sstring.cpp +++ b/Src/SLib/sstring.cpp @@ -1733,6 +1733,11 @@ SString & SString::ReplaceStr(const char * pPattern, const char * pReplacer, int return *this; } +SString & SString::ElimDblSpaces() +{ + return ReplaceStr(" ", " ", 0); +} + struct _SpcSymbEntry { char chr; const char * str;