From 0f74f5a5e278cc08ffc10b005d6f97f87f58db56 Mon Sep 17 00:00:00 2001 From: papyrussolution Date: Tue, 19 Nov 2024 18:35:40 +0300 Subject: [PATCH] Version 12.1.11-ii --- Src/Include/PPDEFS.H | 2 + Src/Include/Pp.h | 17 +- Src/PPLib/Billdlg.cpp | 2 +- Src/PPLib/Objbill.cpp | 326 ++++++++++++------------ Src/PPLib/V_gdsopr.cpp | 417 +++++++++++++++++++------------ Src/PPLib/bitmbrow.cpp | 2 +- Src/PPLib/marketplace.cpp | 31 ++- Src/PPLib/transfer.cpp | 83 +++++- Src/PPMain/ppw.rc | 58 +++-- Src/PPMain/wsctl-main.cpp | 125 ++++----- Src/Rsrc/Dlg/f_goanlz.dlg | Bin 8789 -> 9397 bytes Src/Rsrc/Str/ppstr2.symb | 7 +- Src/Rsrc/Str/ppstr2.txt | 3 + Src/Rsrc/Version/genver-open.dat | 2 +- Src/Rsrc/dl600/ppexp.dl6 | 3 +- 15 files changed, 652 insertions(+), 426 deletions(-) diff --git a/Src/Include/PPDEFS.H b/Src/Include/PPDEFS.H index 6a039ce6cf..df8f230ef2 100644 --- a/Src/Include/PPDEFS.H +++ b/Src/Include/PPDEFS.H @@ -2990,6 +2990,8 @@ #define CTLCAL_BILLFLT_DUEPERIOD (86 + WINDOWS_ID_BIAS) #define CTL_BILLFLT_MEMOTEXT (87 + WINDOWS_ID_BIAS) // @v11.7.4 #define CTLBUT_BILLFLT_OBJPTAGS (88 + WINDOWS_ID_BIAS) // @v11.9.6 Кнопка фильтра по тегам персоналий контрагентов + #define CTL_BILLFLT_MPGUA (89 + WINDOWS_ID_BIAS) // @v12.1.12 GoodsOpAnalyzeFilt + #define CTLSEL_BILLFLT_MPGUA (90 + WINDOWS_ID_BIAS) // @v12.1.12 GoodsOpAnalyzeFilt #define DLG_GTO 133 // Фильтр товарооборота #define CTL_GTO_PERIOD (1 + WINDOWS_ID_BIAS) #define CTL_GTO_SUPPL (3 + WINDOWS_ID_BIAS) diff --git a/Src/Include/Pp.h b/Src/Include/Pp.h index 937cf4fb4f..ee4abf0c98 100644 --- a/Src/Include/Pp.h +++ b/Src/Include/Pp.h @@ -13944,6 +13944,8 @@ class Transfer : public TransferTbl { int GetRest(GoodsRestParam & rP); int GetCurRest(GoodsRestParam & rP); int EvaluateAverageRestByLot(PPID lotID, const DateRange & rPeriod, double * pAvgQtty); // @v12.1.11 @construction + int FixUpPeriodForAverageRestEvaluating(const PPIDArray & rLocList, const PPIDArray & rGoodsList, DateRange & rPeriod); // @v12.1.12 + int EvaluateAverageRestByGoods(const PPIDArray & rLocList, const PPIDArray & rGoodsList, DateRange & rPeriod, RAssocArray & rList); // @v12.1.12 int GetLcrList(LDATE dt, UintHashTable * pLotList, RAssocArray * pRestList); int CalcAssetDeprec(PPID lotID, const DateRange *, double * pDeprec); // @@ -34305,10 +34307,18 @@ class PPObjBill : public PPObject { // int ConvertILTI(ILTI *, PPBillPacket *, LongArray * pRows, uint, const char * pSerial, const GoodsReplacementArray * pGri = 0); // + // Descr: Флаги функции InsertShipmentItemByOrder() + // + enum { + isibofInteractive = 0x0001, // интерактивный режим + isibofErrOnCompletedOrder = 0x0002 // если заказ по позиции orderItemIdx уже выполен, то функция возвращает 0 и устанавливает код ошибки PPERR_ORDISCOMPLETED + }; + // // ARG(maxQtty IN): Максимальное количество, которое необходимо вставить в документ pPack по заказу pOrderPack. // Если maxQtty <= 0.0, то это трактуется как "вставляй столько, сколько заказано". + // ARG(flags IN): @flags PPObjBill::isibofXXX (see above) // - int InsertShipmentItemByOrder(PPBillPacket * pPack, const PPBillPacket * pOrderPack, int orderItemIdx, PPID srcLotID, double maxQtty, int interactive); + int InsertShipmentItemByOrder(PPBillPacket * pPack, const PPBillPacket * pOrderPack, int orderItemIdx, PPID srcLotID, double maxQtty, uint flags); int AdjustIntrPrice(const PPBillPacket * pPack, PPID goodsID, double * pAdjPrice); int CmpSnrWithLotSnr(PPID lotID, const char * pSerial, bool serialIsRefB); int ConvertBasket(const PPBasketPacket & rBasket, PPBillPacket * pPack); @@ -34856,7 +34866,7 @@ class PPObjBill : public PPObject { class PPObjAccTurn : public PPObject { public: - PPObjAccTurn(void * extraPtr = 0); + explicit PPObjAccTurn(void * extraPtr = 0); ~PPObjAccTurn(); int CreateBlankAccTurn(PPID opID, PPBillPacket *, long * pFlags, int use_ta); int CreateBlankAccTurnBySample(PPBillPacket * pPack, const PPBillPacket * pSamplePack, long * pFlags); @@ -44571,7 +44581,8 @@ struct GoodsOpAnalyzeFilt : public PPBaseFilt { ffldDiff = 0x00000004L }; - char ReserveStart[8]; // @anchor + char ReserveStart[4]; // @anchor // @v12.1.12 [8]-->[4] + PPID MarketplaceGuaID; // @v12.1.12 Ид глобальной учетной записи для взаимодействия с маркетплейсом. Используется если OpGrpID==ogMarketplaceSalesAnalyze PPID FreightAgentID; // ->Person.ID Транспортный брокер SubstGrpBill Sgb; // Подстановка документа. // Если !!Sgb то отчет строится не в разрезе товаров (или их подстановок), а в разрезе подстановочного diff --git a/Src/PPLib/Billdlg.cpp b/Src/PPLib/Billdlg.cpp index 27e47b6640..8fd3daff99 100644 --- a/Src/PPLib/Billdlg.cpp +++ b/Src/PPLib/Billdlg.cpp @@ -388,7 +388,7 @@ int BillExtraDialog(const PPBillPacket * pPack, PPBillExt * pData, ObjTagList * if(p_agt_combo) { PPIDArray agt_list; if(pData->AgtBillID || pPack->Rec.Object) { - p_bobj->P_Tbl->GetListOfActualAgreemts(pPack->Rec.Object, pPack->Rec.Dt, 365*2, 20, agt_list); + p_bobj->P_Tbl->GetListOfActualAgreemts(pPack->Rec.Object, pPack->Rec.Dt, 365*10, 20, agt_list); agt_list.addnz(pData->AgtBillID); } if(agt_list.getCount()) { diff --git a/Src/PPLib/Objbill.cpp b/Src/PPLib/Objbill.cpp index 5b352d16ad..e09ab20c65 100644 --- a/Src/PPLib/Objbill.cpp +++ b/Src/PPLib/Objbill.cpp @@ -697,7 +697,7 @@ void PPObjBill::DiagGoodsTurnError(const PPBillPacket * pPack) } } -int PPObjBill::InsertShipmentItemByOrder(PPBillPacket * pPack, const PPBillPacket * pOrderPack, int orderItemIdx, PPID srcLotID, double maxQtty, int interactive) +int PPObjBill::InsertShipmentItemByOrder(PPBillPacket * pPack, const PPBillPacket * pOrderPack, int orderItemIdx, PPID srcLotID, double maxQtty, uint flags) { int ok = -1; SString temp_buf; @@ -718,181 +718,187 @@ int PPObjBill::InsertShipmentItemByOrder(PPBillPacket * pPack, const PPBillPacke PPID isales_support_discount_qk = -1; // @v11.0.6 Опорная котировка для расчета скидки по заказам iSales THROW(GObj.Fetch(goods_id, &goods_rec) > 0); THROW(pPack->RestByOrderLot(p_ord_item->LotID, 0, -1, &qtty)); - // PPERR_ORDISCOMPLETED "Заказ уже исполнен (%s)" // @v12.1.11 if(qtty <= 0.0) { - SString msg_buf; - PPObjBill::MakeCodeString(&pOrderPack->Rec, 0, temp_buf); - msg_buf.Cat(temp_buf).Space().CatEq("ord_lot_id", p_ord_item->LotID).CatDiv('-', 1).Cat(goods_rec.Name); - PPObjBill::MakeCodeString(&pPack->Rec, 0, temp_buf); - msg_buf.Space().Cat("->").Space().Cat(temp_buf); - CALLEXCEPT_PP_S(PPERR_ORDISCOMPLETED, msg_buf); - } - // @v12.1.2 { - if(maxQtty > 0.0 && qtty > maxQtty) - qtty = maxQtty; - // } @v12.1.2 - if(pPack->CheckGoodsForRestrictions(-1, goods_id, TISIGN_MINUS, qtty, PPBillPacket::cgrfAll, 0)) { - // - // Если данная отгрузка осуществляется по резервирующему заказу, то - // не проверяем наличие других резервирующих заказов на этот товар: - // действует правило "кто первый встал - того и сапоги". - // - ReceiptTbl::Rec ord_lot_rec; - const int i_am_reserve_order = (trfr->Rcpt.Search(p_ord_item->LotID, &ord_lot_rec) > 0 && ord_lot_rec.Flags & LOTF_ORDRESERVE) ? 1 : 0; - if(!i_am_reserve_order) { - // - // Уменьшаем отгружаемое количество на величину зарезервированного - // товара (резервирующий заказ не принадлежит данному контрагенту и - // не является собственно заказом, по которому осуществляется данная отгрузка. - // - trfr->Rcpt.GetListOfOpenedLots(-1, -goods_id, loc_id, MAXDATE, &lot_list); - for(uint i = 0; i < lot_list.getCount(); i++) { - const ReceiptTbl::Rec & r_lot_rec = lot_list.at(i); - if(r_lot_rec.Flags & LOTF_ORDRESERVE && r_lot_rec.SupplID != pPack->Rec.Object && r_lot_rec.BillID != pOrderPack->Rec.ID) { - trfr->GetRest(r_lot_rec.ID, MAXDATE, &rest); - reserve += rest; - } - } + if(flags & isibofErrOnCompletedOrder) { + SString msg_buf; + PPObjBill::MakeCodeString(&pOrderPack->Rec, 0, temp_buf); + msg_buf.Cat(temp_buf).Space().CatEq("ord_lot_id", p_ord_item->LotID).CatDiv('-', 1).Cat(goods_rec.Name); + PPObjBill::MakeCodeString(&pPack->Rec, 0, temp_buf); + msg_buf.Space().Cat("->").Space().Cat(temp_buf); + // PPERR_ORDISCOMPLETED "Заказ уже исполнен (%s)" // @v12.1.11 + CALLEXCEPT_PP_S(PPERR_ORDISCOMPLETED, msg_buf); } - lot_list.clear(); - trfr->Rcpt.GetListOfOpenedLots(-1, goods_id, loc_id, pPack->Rec.Dt, &lot_list); - if(srcLotID) { + else + ok = -1; + } + else { + // @v12.1.2 { + if(maxQtty > 0.0 && qtty > maxQtty) + qtty = maxQtty; + // } @v12.1.2 + if(pPack->CheckGoodsForRestrictions(-1, goods_id, TISIGN_MINUS, qtty, PPBillPacket::cgrfAll, 0)) { // - // Если вызывающая функция задала лот, из которого следует расходовать товар, - // и этот лот в списке, то перемещаем его вверх списка для того, чтобы применить с приоритетом. + // Если данная отгрузка осуществляется по резервирующему заказу, то + // не проверяем наличие других резервирующих заказов на этот товар: + // действует правило "кто первый встал - того и сапоги". // - uint src_lot_pos = 0; - if(lot_list.lsearch(&srcLotID, &src_lot_pos, CMPF_LONG) && src_lot_pos != 0) - lot_list.swap(src_lot_pos, 0); - } - for(uint lotidx = 0; lotidx < lot_list.getCount() && qtty > 0.0; lotidx++) { - const ReceiptTbl::Rec & r_lot_rec = lot_list.at(lotidx); - THROW(pPack->BoundsByLot(r_lot_rec.ID, 0, -1, &rest, 0)); - if(reserve > 0.0) { // Снижаем доступный остаток на величину резерва. - const double decr = MIN(rest, reserve); - rest -= decr; - reserve -= decr; - } - rest = MIN(rest, qtty); - if(rest > 0.0) { - SString edi_channel; - if(pOrderPack->Rec.EdiOp == PPEDIOP_SALESORDER) - pOrderPack->BTagL.GetItemStr(PPTAG_BILL_EDICHANNEL, edi_channel); - const bool ord_price_low_prior = LOGIC(GetConfig().Flags & BCF_ORDPRICELOWPRIORITY); - const bool is_isales_order = (pOrderPack->Rec.EdiOp == PPEDIOP_SALESORDER && edi_channel.IsEqiAscii("ISALES-PEPSI")); - const bool is_coke_order = (pOrderPack->Rec.EdiOp == PPEDIOP_SALESORDER && edi_channel.IsEqiAscii("COKE")); // @v11.5.4 - const double ord_qtty = fabs(p_ord_item->Quantity_); - const double ord_price = fabs(p_ord_item->Price) * ord_qtty; - const double ord_dis = p_ord_item->Discount * ord_qtty; - const double ord_pct_dis = (ord_price > 0.0 && ord_dis > 0.0) ? R4(ord_dis / ord_price) : 0.0; - double isales_support_quot = 0.0; - if(is_isales_order && ord_pct_dis > 0.0) { - if(isales_support_discount_qk < 0) { - PPObjQuotKind qk_obj; - PPID _temp_qk_id = 0; - isales_support_discount_qk = (qk_obj.SearchBySymb("ISALES-SUPPORT", &_temp_qk_id, 0) > 0) ? _temp_qk_id : 0; - } - if(isales_support_discount_qk > 0) { - const QuotIdent qi(QIDATE(pPack->Rec.Dt), loc_id, isales_support_discount_qk, pPack->Rec.CurID, pPack->Rec.Object); - GObj.GetQuotExt(goods_id, qi, r_lot_rec.Cost, r_lot_rec.Price, &isales_support_quot, 1); + ReceiptTbl::Rec ord_lot_rec; + const int i_am_reserve_order = (trfr->Rcpt.Search(p_ord_item->LotID, &ord_lot_rec) > 0 && ord_lot_rec.Flags & LOTF_ORDRESERVE) ? 1 : 0; + if(!i_am_reserve_order) { + // + // Уменьшаем отгружаемое количество на величину зарезервированного + // товара (резервирующий заказ не принадлежит данному контрагенту и + // не является собственно заказом, по которому осуществляется данная отгрузка. + // + trfr->Rcpt.GetListOfOpenedLots(-1, -goods_id, loc_id, MAXDATE, &lot_list); + for(uint i = 0; i < lot_list.getCount(); i++) { + const ReceiptTbl::Rec & r_lot_rec = lot_list.at(i); + if(r_lot_rec.Flags & LOTF_ORDRESERVE && r_lot_rec.SupplID != pPack->Rec.Object && r_lot_rec.BillID != pOrderPack->Rec.ID) { + trfr->GetRest(r_lot_rec.ID, MAXDATE, &rest); + reserve += rest; } } - THROW(ti.Init(&pPack->Rec)); - THROW(ti.SetupGoods(goods_id)); - THROW(ti.SetupLot(r_lot_rec.ID, &r_lot_rec, 0)); - // @v11.0.6 @iSales { - if(is_isales_order && ord_pct_dis > 0.0 && isales_support_quot > 0.0) { - const double sq = isales_support_quot; - const double quot = R5(sq * (1 - ord_pct_dis)); - ti.Discount = ti.Price - quot; - ti.SetupQuot(quot, 1); - } - // } @v11.0.6 - else if(p_ord_item->NetPrice() <= 0.0 || (ord_price_low_prior && CheckOpFlags(pOrderPack->Rec.OpID, OPKF_ORDERBYLOC)) || - (ord_price_low_prior && LConfig.Flags & CFGFLG_AUTOQUOT)) { - double quot = 0.0; - if(quot > 0.0 || SelectQuotKind(pPack, &ti, 0/*strictly noninteractive*/, ") > 0) { - if(is_isales_order && ord_pct_dis > 0.0) { - // @v11.1.2 Для того чтобы избежать двойной скидки и от агента и по цене общего прайса промо к цене заказа - quot = R5(fabs(p_ord_item->Price) * (1 - ord_pct_dis)); + } + lot_list.clear(); + trfr->Rcpt.GetListOfOpenedLots(-1, goods_id, loc_id, pPack->Rec.Dt, &lot_list); + if(srcLotID) { + // + // Если вызывающая функция задала лот, из которого следует расходовать товар, + // и этот лот в списке, то перемещаем его вверх списка для того, чтобы применить с приоритетом. + // + uint src_lot_pos = 0; + if(lot_list.lsearch(&srcLotID, &src_lot_pos, CMPF_LONG) && src_lot_pos != 0) + lot_list.swap(src_lot_pos, 0); + } + for(uint lotidx = 0; lotidx < lot_list.getCount() && qtty > 0.0; lotidx++) { + const ReceiptTbl::Rec & r_lot_rec = lot_list.at(lotidx); + THROW(pPack->BoundsByLot(r_lot_rec.ID, 0, -1, &rest, 0)); + if(reserve > 0.0) { // Снижаем доступный остаток на величину резерва. + const double decr = MIN(rest, reserve); + rest -= decr; + reserve -= decr; + } + rest = MIN(rest, qtty); + if(rest > 0.0) { + SString edi_channel; + if(pOrderPack->Rec.EdiOp == PPEDIOP_SALESORDER) + pOrderPack->BTagL.GetItemStr(PPTAG_BILL_EDICHANNEL, edi_channel); + const bool ord_price_low_prior = LOGIC(GetConfig().Flags & BCF_ORDPRICELOWPRIORITY); + const bool is_isales_order = (pOrderPack->Rec.EdiOp == PPEDIOP_SALESORDER && edi_channel.IsEqiAscii("ISALES-PEPSI")); + const bool is_coke_order = (pOrderPack->Rec.EdiOp == PPEDIOP_SALESORDER && edi_channel.IsEqiAscii("COKE")); // @v11.5.4 + const double ord_qtty = fabs(p_ord_item->Quantity_); + const double ord_price = fabs(p_ord_item->Price) * ord_qtty; + const double ord_dis = p_ord_item->Discount * ord_qtty; + const double ord_pct_dis = (ord_price > 0.0 && ord_dis > 0.0) ? R4(ord_dis / ord_price) : 0.0; + double isales_support_quot = 0.0; + if(is_isales_order && ord_pct_dis > 0.0) { + if(isales_support_discount_qk < 0) { + PPObjQuotKind qk_obj; + PPID _temp_qk_id = 0; + isales_support_discount_qk = (qk_obj.SearchBySymb("ISALES-SUPPORT", &_temp_qk_id, 0) > 0) ? _temp_qk_id : 0; + } + if(isales_support_discount_qk > 0) { + const QuotIdent qi(QIDATE(pPack->Rec.Dt), loc_id, isales_support_discount_qk, pPack->Rec.CurID, pPack->Rec.Object); + GObj.GetQuotExt(goods_id, qi, r_lot_rec.Cost, r_lot_rec.Price, &isales_support_quot, 1); } + } + THROW(ti.Init(&pPack->Rec)); + THROW(ti.SetupGoods(goods_id)); + THROW(ti.SetupLot(r_lot_rec.ID, &r_lot_rec, 0)); + // @v11.0.6 @iSales { + if(is_isales_order && ord_pct_dis > 0.0 && isales_support_quot > 0.0) { + const double sq = isales_support_quot; + const double quot = R5(sq * (1 - ord_pct_dis)); ti.Discount = ti.Price - quot; + ti.SetupQuot(quot, 1); + } + // } @v11.0.6 + else if(p_ord_item->NetPrice() <= 0.0 || (ord_price_low_prior && CheckOpFlags(pOrderPack->Rec.OpID, OPKF_ORDERBYLOC)) || + (ord_price_low_prior && LConfig.Flags & CFGFLG_AUTOQUOT)) { + double quot = 0.0; + if(quot > 0.0 || SelectQuotKind(pPack, &ti, 0/*strictly noninteractive*/, ") > 0) { + if(is_isales_order && ord_pct_dis > 0.0) { + // @v11.1.2 Для того чтобы избежать двойной скидки и от агента и по цене общего прайса промо к цене заказа + quot = R5(fabs(p_ord_item->Price) * (1 - ord_pct_dis)); + } + ti.Discount = ti.Price - quot; + ti.SetupQuot(quot, 1); + } + } + else if(is_isales_order && ord_pct_dis > 0.0) { + const double sq = ti.Price; // @v11.0.6 + const double quot = R5(sq * (1 - ord_pct_dis)); + ti.Discount = sq - quot; ti.SetupQuot(quot, 1); } - } - else if(is_isales_order && ord_pct_dis > 0.0) { - const double sq = ti.Price; // @v11.0.6 - const double quot = R5(sq * (1 - ord_pct_dis)); - ti.Discount = sq - quot; - ti.SetupQuot(quot, 1); - } - else if(is_coke_order && ord_dis > 0.0 && p_ord_item->Discount <= ti.Price) { // @v11.5.4 - // Для заказов кока-кола (COKE) скидка в заказе трактуется как абсолютная скидка предоставляемая к той цене, которую выставляет дистрибьютор - ti.Discount = p_ord_item->Discount; - } - else if(p_ord_item->NetPrice() > 0.0) - ti.Discount = ti.Price - p_ord_item->NetPrice(); - ti.OrdLotID = p_ord_item->LotID; // @ordlotid - ti.Flags |= PPTFR_ONORDER; - ti.Quantity_ = interactive ? rest : -rest; - { - uint sh_lot_row_pos = 0; - // - // После двух следующих строк индекс sh_lot_row_pos правильно указывает - // позицию строки теневого документа, которой соответствует наша новая строка - // - if(!pPack->SearchShLot(ti.OrdLotID, &sh_lot_row_pos)) // @ordlotid - THROW(pPack->AddShadowItem(p_ord_item, &sh_lot_row_pos)); - THROW(pPack->InsertRow(&ti, &row_idx_list)); - tmp_sti = &pPack->P_ShLots->at(sh_lot_row_pos); - THROW(pPack->CalcShadowQuantity(tmp_sti->LotID, &tmp_sti->Quantity_)); - } - qtty -= rest; - zero_rest = 0; - ok = 1; - } - } - if(zero_rest) { - if(goods_rec.Flags & GF_UNLIM) { - THROW(ti.Init(&pPack->Rec)); - THROW(ti.SetupGoods(goods_id)); - ti.LotID = 0; - ti.Price = p_ord_item->Price; - ti.Discount = 0.0; - ti.OrdLotID = p_ord_item->LotID; // @ordlotid - ti.Flags |= PPTFR_ONORDER; - ti.Quantity_ = p_ord_item->LotID ? qtty : fabs(p_ord_item->Quantity_); - { - uint sh_lot_row_pos = 0; - if(!pPack->SearchShLot(ti.OrdLotID, &sh_lot_row_pos)) // @ordlotid - THROW(pPack->AddShadowItem(p_ord_item, &sh_lot_row_pos)); - THROW(pPack->InsertRow(&ti, &row_idx_list)); - if(p_ord_item->LotID) { + else if(is_coke_order && ord_dis > 0.0 && p_ord_item->Discount <= ti.Price) { // @v11.5.4 + // Для заказов кока-кола (COKE) скидка в заказе трактуется как абсолютная скидка предоставляемая к той цене, которую выставляет дистрибьютор + ti.Discount = p_ord_item->Discount; + } + else if(p_ord_item->NetPrice() > 0.0) + ti.Discount = ti.Price - p_ord_item->NetPrice(); + ti.OrdLotID = p_ord_item->LotID; // @ordlotid + ti.Flags |= PPTFR_ONORDER; + ti.Quantity_ = (flags & isibofInteractive) ? rest : -rest; + { + uint sh_lot_row_pos = 0; + // + // После двух следующих строк индекс sh_lot_row_pos правильно указывает + // позицию строки теневого документа, которой соответствует наша новая строка + // + if(!pPack->SearchShLot(ti.OrdLotID, &sh_lot_row_pos)) // @ordlotid + THROW(pPack->AddShadowItem(p_ord_item, &sh_lot_row_pos)); + THROW(pPack->InsertRow(&ti, &row_idx_list)); tmp_sti = &pPack->P_ShLots->at(sh_lot_row_pos); THROW(pPack->CalcShadowQuantity(tmp_sti->LotID, &tmp_sti->Quantity_)); } + qtty -= rest; + zero_rest = 0; + ok = 1; } - ok = 1; } - else if(goods_rec.Flags & GF_AUTOCOMPL) { - THROW(ti.Init(&pPack->Rec)); - THROW(ti.SetupGoods(goods_id)); - ti.LotID = 0; - ti.Price = p_ord_item->Price; - ti.Discount = 0.0; - ti.OrdLotID = p_ord_item->LotID; // @ordlotid - ti.Flags |= (PPTFR_ONORDER | PPTFR_AUTOCOMPL); - ti.Quantity_ = qtty; - { - uint sh_lot_row_pos = 0; - if(!pPack->SearchShLot(ti.OrdLotID, &sh_lot_row_pos)) { // @ordlotid - THROW(pPack->AddShadowItem(p_ord_item, &sh_lot_row_pos)); + if(zero_rest) { + if(goods_rec.Flags & GF_UNLIM) { + THROW(ti.Init(&pPack->Rec)); + THROW(ti.SetupGoods(goods_id)); + ti.LotID = 0; + ti.Price = p_ord_item->Price; + ti.Discount = 0.0; + ti.OrdLotID = p_ord_item->LotID; // @ordlotid + ti.Flags |= PPTFR_ONORDER; + ti.Quantity_ = p_ord_item->LotID ? qtty : fabs(p_ord_item->Quantity_); + { + uint sh_lot_row_pos = 0; + if(!pPack->SearchShLot(ti.OrdLotID, &sh_lot_row_pos)) // @ordlotid + THROW(pPack->AddShadowItem(p_ord_item, &sh_lot_row_pos)); + THROW(pPack->InsertRow(&ti, &row_idx_list)); + if(p_ord_item->LotID) { + tmp_sti = &pPack->P_ShLots->at(sh_lot_row_pos); + THROW(pPack->CalcShadowQuantity(tmp_sti->LotID, &tmp_sti->Quantity_)); + } } - THROW(pPack->InsertRow(&ti, &row_idx_list, interactive ? PCUG_USERCHOICE : PCUG_CANCEL)); - tmp_sti = &pPack->P_ShLots->at(sh_lot_row_pos); + ok = 1; + } + else if(goods_rec.Flags & GF_AUTOCOMPL) { + THROW(ti.Init(&pPack->Rec)); + THROW(ti.SetupGoods(goods_id)); + ti.LotID = 0; + ti.Price = p_ord_item->Price; + ti.Discount = 0.0; + ti.OrdLotID = p_ord_item->LotID; // @ordlotid + ti.Flags |= (PPTFR_ONORDER | PPTFR_AUTOCOMPL); + ti.Quantity_ = qtty; + { + uint sh_lot_row_pos = 0; + if(!pPack->SearchShLot(ti.OrdLotID, &sh_lot_row_pos)) { // @ordlotid + THROW(pPack->AddShadowItem(p_ord_item, &sh_lot_row_pos)); + } + THROW(pPack->InsertRow(&ti, &row_idx_list, (flags & isibofInteractive) ? PCUG_USERCHOICE : PCUG_CANCEL)); + tmp_sti = &pPack->P_ShLots->at(sh_lot_row_pos); + } + THROW(pPack->CalcShadowQuantity(tmp_sti->LotID, &tmp_sti->Quantity_)); + ok = 1; } - THROW(pPack->CalcShadowQuantity(tmp_sti->LotID, &tmp_sti->Quantity_)); - ok = 1; } } } @@ -2057,7 +2063,7 @@ int PPObjBill::AddExpendByOrder(PPID * pBillID, PPID sampleBillID, const SelAddB if(pos_to_src_lot_list.Search(sample_pack_tiidx, &rcpt_ti_pos, &pos)) src_lot_id = p_rcpt_bpack->ConstTI(rcpt_ti_pos).LotID; }*/ - THROW(InsertShipmentItemByOrder(&pack, &sample_pack, sample_pack_tiidx, src_lot_id, 0.0, 0/*noninteractive*/)); + THROW(InsertShipmentItemByOrder(&pack, &sample_pack, sample_pack_tiidx, src_lot_id, 0.0, 0U)); } } if(pParam->Flags & pParam->fNonInteractive) { diff --git a/Src/PPLib/V_gdsopr.cpp b/Src/PPLib/V_gdsopr.cpp index 792028e402..ce081073ea 100644 --- a/Src/PPLib/V_gdsopr.cpp +++ b/Src/PPLib/V_gdsopr.cpp @@ -466,15 +466,130 @@ class GoodsOpAnlzFiltDialog : public WLDialog { addGroup(ctlgroupLoc, new LocationCtrlGroup(CTLSEL_BILLFLT_LOC, 0, 0, cmLocList, 0, LocationCtrlGroup::fEnableSelUpLevel, 0)); // @v12.1.5 LocationCtrlGroup::fEnableSelUpLevel SetupCalPeriod(CTLCAL_BILLFLT_PERIOD, CTL_BILLFLT_PERIOD); } - int setDTS(const GoodsOpAnalyzeFilt *); - int getDTS(GoodsOpAnalyzeFilt *); + DECL_DIALOG_SETDTS() + { + RVALUEPTR(Data, pData); + int ok = 1; + PPID acc_sheet_id = 0; + PPID parent_grp_id = 0; + PPObjOprKind opk_obj; + PPObjGoods goods_obj; + SetPeriodInput(this, CTL_BILLFLT_PERIOD, &Data.Period); + SetupOpCombo(); + GetOpCommonAccSheet(Data.OpID, &acc_sheet_id, 0); + SetupAccSheet(Data.AccSheetID ? Data.AccSheetID : acc_sheet_id); + goods_obj.GetParentID(Data.GoodsGrpID, &parent_grp_id); + GoodsFiltCtrlGroup::Rec gf_rec(Data.GoodsGrpID, 0, 0, GoodsCtrlGroup::enableSelUpLevel, reinterpret_cast(parent_grp_id)); + setGroupData(ctlgroupGoodsFilt, &gf_rec); + LocationCtrlGroup::Rec loc_rec(&Data.LocList); + setGroupData(ctlgroupLoc, &loc_rec); + SetupPPObjCombo(this, CTLSEL_BILLFLT_MPGUA, PPOBJ_GLOBALUSERACC, Data.MarketplaceGuaID, 0, /*reinterpret_cast(PPGLS_WILDBERRIES)*/0); // @v12.1.12 + setWL(BIN(Data.Flags & GoodsOpAnalyzeFilt::fLabelOnly)); + // + // В диалоге флаги расчета сумм НДС в цп и цр устанавливаются (снимаются) одновременно + // + SETFLAG(Data.Flags, GoodsOpAnalyzeFilt::fCalcCVat, BIN(Data.Flags & (GoodsOpAnalyzeFilt::fCalcCVat|GoodsOpAnalyzeFilt::fCalcPVat))); + SETFLAG(Data.Flags, GoodsOpAnalyzeFilt::fCalcPVat, BIN(Data.Flags & (GoodsOpAnalyzeFilt::fCalcCVat|GoodsOpAnalyzeFilt::fCalcPVat))); + // + AddClusterAssoc(CTL_BILLFLT_DIFFBYPRICE, 0, GoodsOpAnalyzeFilt::fDiffByPrice); + AddClusterAssoc(CTL_BILLFLT_DIFFBYPRICE, 1, GoodsOpAnalyzeFilt::fDiffByNetPrice); + AddClusterAssoc(CTL_BILLFLT_DIFFBYPRICE, 2, GoodsOpAnalyzeFilt::fPriceWithoutExcise); + AddClusterAssoc(CTL_BILLFLT_DIFFBYPRICE, 3, GoodsOpAnalyzeFilt::fCalcRest); + AddClusterAssoc(CTL_BILLFLT_DIFFBYPRICE, 4, GoodsOpAnalyzeFilt::fCalcOrder); + AddClusterAssoc(CTL_BILLFLT_DIFFBYPRICE, 5, GoodsOpAnalyzeFilt::fShowSStatSales); + AddClusterAssoc(CTL_BILLFLT_DIFFBYPRICE, 6, GoodsOpAnalyzeFilt::fUnprofitableGoods); + AddClusterAssoc(CTL_BILLFLT_DIFFBYPRICE, 7, GoodsOpAnalyzeFilt::fBadSellingGoods); + AddClusterAssoc(CTL_BILLFLT_DIFFBYPRICE, 8, GoodsOpAnalyzeFilt::fTradePlanGoodsOnly); + AddClusterAssoc(CTL_BILLFLT_DIFFBYPRICE, 9, GoodsOpAnalyzeFilt::fAddNzRestItems); + AddClusterAssoc(CTL_BILLFLT_DIFFBYPRICE, 10, GoodsOpAnalyzeFilt::fCalcCVat); + SetClusterData(CTL_BILLFLT_DIFFBYPRICE, Data.Flags); + SetupFlags(); + // @v12.1.7 setCtrlData(CTL_BILLFLT_OPRSET, &(v = (ushort)Data.OpGrpID)); + // @v12.1.7 { + AddClusterAssocDef(CTL_BILLFLT_OPRSET, 0, GoodsOpAnalyzeFilt::ogSelected); + AddClusterAssoc(CTL_BILLFLT_OPRSET, 1, GoodsOpAnalyzeFilt::ogIncoming); + AddClusterAssoc(CTL_BILLFLT_OPRSET, 2, GoodsOpAnalyzeFilt::ogProfitable); + AddClusterAssoc(CTL_BILLFLT_OPRSET, 3, GoodsOpAnalyzeFilt::ogPayed); + AddClusterAssoc(CTL_BILLFLT_OPRSET, 4, GoodsOpAnalyzeFilt::ogInOutAnalyze); + AddClusterAssoc(CTL_BILLFLT_OPRSET, 5, GoodsOpAnalyzeFilt::ogMarketplaceSalesAnalyze); + SetClusterData(CTL_BILLFLT_OPRSET, Data.OpGrpID); + // } @v12.1.7 + disableCtrls(!oneof2(Data.OpGrpID, GoodsOpAnalyzeFilt::ogSelected, GoodsOpAnalyzeFilt::ogInOutAnalyze), /*CTL_BILLFLT_PERIOD,*/ CTL_BILLFLT_OPRKIND, CTL_BILLFLT_AMOUNT, 0); + AddClusterAssoc(CTL_BILLFLT_INTRREVAL, 0, GoodsOpAnalyzeFilt::fIntrReval); + SetClusterData(CTL_BILLFLT_INTRREVAL, Data.Flags); + AddClusterAssoc(CTL_BILLFLT_FLAGS, 0, GoodsOpAnalyzeFilt::fDisplayWoPacks); + AddClusterAssoc(CTL_BILLFLT_FLAGS, 1, GoodsOpAnalyzeFilt::fCompareWithReceipt); + SetClusterData(CTL_BILLFLT_FLAGS, Data.Flags); + AddClusterAssoc(CTL_BILLFLT_EACHLOC, 0, GoodsOpAnalyzeFilt::fEachLocation); + AddClusterAssoc(CTL_BILLFLT_EACHLOC, 1, GoodsOpAnalyzeFilt::fCrosstab); + SetClusterData(CTL_BILLFLT_EACHLOC, Data.Flags); + AddClusterAssoc(CTL_BILLFLT_USEABCANLZ, 0, GoodsOpAnalyzeFilt::fUseABCAnlz); + AddClusterAssoc(CTL_BILLFLT_USEABCANLZ, 1, GoodsOpAnalyzeFilt::fABCAnlzByGGrps); + SetupCtrls(Data.Flags); + disableCtrls(Data.BillList.IsExists(), CTL_BILLFLT_OPRSET, + CTLSEL_BILLFLT_OBJECT, CTLSEL_BILLFLT_OPRKIND, CTL_BILLFLT_PERIOD, CTLCAL_BILLFLT_PERIOD, 0); + if(Data.BillList.IsExists()) { + disableCtrl(CTLSEL_BILLFLT_LOC, 1); + enableCommand(cmLocList, 0); + } + return ok; + } + DECL_DIALOG_GETDTS() + { + int ok = 1; + ushort v; + GoodsFiltCtrlGroup::Rec gf_rec; + LocationCtrlGroup::Rec loc_rec; + THROW(GetPeriodInput(this, CTL_BILLFLT_PERIOD, &Data.Period)); + getCtrlData(CTLSEL_BILLFLT_OPRKIND, &Data.OpID); + Data.ObjectID = (Data.OpID || Data.AccSheetID) ? getCtrlLong(CTLSEL_BILLFLT_OBJECT) : 0; + //getCtrlData(CTLSEL_BILLFLT_SUPPL, &Data.SupplID); + getCtrlData(CTLSEL_BILLFLT_GGRP, &Data.GoodsGrpID); + SETFLAG(Data.Flags, GoodsOpAnalyzeFilt::fLabelOnly, getWL()); + GetClusterData(CTL_BILLFLT_DIFFBYPRICE, &Data.Flags); + // + // В диалоге флаги расчета сумм НДС в цп и цр устанавливаются (снимаются) одновременно + // + SETFLAG(Data.Flags, GoodsOpAnalyzeFilt::fCalcCVat, BIN(Data.Flags & (GoodsOpAnalyzeFilt::fCalcCVat|GoodsOpAnalyzeFilt::fCalcPVat))); + SETFLAG(Data.Flags, GoodsOpAnalyzeFilt::fCalcPVat, BIN(Data.Flags & (GoodsOpAnalyzeFilt::fCalcCVat|GoodsOpAnalyzeFilt::fCalcPVat))); + GetClusterData(CTL_BILLFLT_INTRREVAL, &Data.Flags); + // @v12.1.7 getCtrlData(CTL_BILLFLT_OPRSET, &(v = 0)); + // @v12.1.7 Data.OpGrpID = v; + GetClusterData(CTL_BILLFLT_OPRSET, &Data.OpGrpID); // @v12.1.7 + GetClusterData(CTL_BILLFLT_USEABCANLZ, &Data.Flags); + Data.ABCAnlzGroup = BIN(Data.Flags & GoodsOpAnalyzeFilt::fUseABCAnlz); + if(Data.Flags & GoodsOpAnalyzeFilt::fUseABCAnlz) + Data.ABCAnlz.CheckFracts(0); + else + MEMSZERO(Data.ABCAnlz); + v = getCtrlUInt16(CTL_BILLFLT_PRICEDEV); + SETFLAG(Data.Flags, GoodsOpAnalyzeFilt::fPriceDeviation, v & 0x01); + GetClusterData(CTL_BILLFLT_FLAGS, &Data.Flags); + GetClusterData(CTL_BILLFLT_EACHLOC, &Data.Flags); + THROW(getGroupData(ctlgroupGoodsFilt, &gf_rec)); + Data.GoodsGrpID = gf_rec.GoodsGrpID; + THROW(getGroupData(ctlgroupLoc, &loc_rec)); + Data.LocList = loc_rec.LocList; + getCtrlData(CTLSEL_BILLFLT_MPGUA, &Data.MarketplaceGuaID); + if(!(Data.Flags & GoodsOpAnalyzeFilt::fCrosstab) && Data.CmpPeriod.IsZero()) + Data.CompareItems.freeAll(); + if(!AdjustPeriodToRights(Data.Period, 1)) { + selectCtrl(CTL_BILLFLT_PERIOD); + CALLEXCEPT(); + } + else { + ASSIGN_PTR(pData, Data); + } + CATCHZOKPPERR + return ok; + } private: DECL_HANDLE_EVENT; - void replyOprGrpChanged(); - void setupOpCombo(); - void setupAccSheet(PPID accSheetID); - int editCompareItems(); - int editABCAnlzFilt(ABCAnlzFilt * pFilt); + void ReplyOprGrpChanged(); + void SetupOpCombo(); + void SetupAccSheet(PPID accSheetID); + int EditCompareItems(); + int EditABCAnlzFilt(ABCAnlzFilt * pFilt); void SetupCtrls(long prevFlags); void SetupFlags(); }; @@ -484,8 +599,9 @@ void GoodsOpAnlzFiltDialog::SetupCtrls(long prevFlags) const PPID op_type = GetOpType(Data.OpID); const bool enbl = (Data.OpGrpID != GoodsOpAnalyzeFilt::ogInOutAnalyze && !(Data.Flags & GoodsOpAnalyzeFilt::fIntrReval) && op_type != PPOPT_GOODSREVAL); const bool cmp_f = LOGIC(Data.Flags & GoodsOpAnalyzeFilt::fCompareWithReceipt); - uint disable_abc = 0; + bool disable_abc = false; ushort v = 0; + showCtrl(CTLSEL_BILLFLT_MPGUA, Data.OpGrpID == GoodsOpAnalyzeFilt::ogMarketplaceSalesAnalyze); // @v12.1.12 DisableClusterItem(CTL_BILLFLT_EACHLOC, 1, BIN(!(Data.Flags & GoodsOpAnalyzeFilt::fEachLocation))); if(!(Data.Flags & GoodsOpAnalyzeFilt::fEachLocation)) { Data.Flags &= ~GoodsOpAnalyzeFilt::fCrosstab; @@ -495,7 +611,7 @@ void GoodsOpAnlzFiltDialog::SetupCtrls(long prevFlags) SETFLAG(v, 0x01, (Data.Flags & GoodsOpAnalyzeFilt::fPriceDeviation) && enbl && (!cmp_f)); SETFLAG(Data.Flags, GoodsOpAnalyzeFilt::fPriceDeviation, v & 0x01); Data.QuotKindID = (enbl && (!(Data.Flags & GoodsOpAnalyzeFilt::fPriceDeviation))) ? Data.QuotKindID : 0; - disable_abc = BIN(Data.QuotKindID > 0 || (Data.Flags & GoodsOpAnalyzeFilt::fPriceDeviation) || !enbl || cmp_f || is_crosstab); + disable_abc = (Data.QuotKindID > 0 || (Data.Flags & GoodsOpAnalyzeFilt::fPriceDeviation) || !enbl || cmp_f || is_crosstab); disableCtrl(CTL_BILLFLT_PRICEDEV, !enbl || cmp_f); setCtrlData(CTL_BILLFLT_PRICEDEV, &v); v = 0; @@ -547,7 +663,7 @@ void GoodsOpAnlzFiltDialog::SetupFlags() SetClusterData(CTL_BILLFLT_FLAGS, flags); } -void GoodsOpAnlzFiltDialog::setupOpCombo() +void GoodsOpAnlzFiltDialog::SetupOpCombo() { PPIDArray op_list; if(Data.OpGrpID == GoodsOpAnalyzeFilt::ogInOutAnalyze) { @@ -561,123 +677,6 @@ void GoodsOpAnlzFiltDialog::setupOpCombo() SetupOprKindCombo(this, CTLSEL_BILLFLT_OPRKIND, Data.OpID, 0, &op_list, 0); } -int GoodsOpAnlzFiltDialog::setDTS(const GoodsOpAnalyzeFilt * pFilt) -{ - RVALUEPTR(Data, pFilt); - int ok = 1; - //ushort v; - PPID acc_sheet_id = 0; - PPID parent_grp_id = 0; - PPObjOprKind opk_obj; - PPObjGoods goods_obj; - SetPeriodInput(this, CTL_BILLFLT_PERIOD, &Data.Period); - setupOpCombo(); - GetOpCommonAccSheet(Data.OpID, &acc_sheet_id, 0); - setupAccSheet(Data.AccSheetID ? Data.AccSheetID : acc_sheet_id); - goods_obj.GetParentID(Data.GoodsGrpID, &parent_grp_id); - GoodsFiltCtrlGroup::Rec gf_rec(Data.GoodsGrpID, 0, 0, GoodsCtrlGroup::enableSelUpLevel, reinterpret_cast(parent_grp_id)); - setGroupData(ctlgroupGoodsFilt, &gf_rec); - LocationCtrlGroup::Rec loc_rec(&Data.LocList); - setGroupData(ctlgroupLoc, &loc_rec); - setWL(BIN(Data.Flags & GoodsOpAnalyzeFilt::fLabelOnly)); - // - // В диалоге флаги расчета сумм НДС в цп и цр устанавливаются (снимаются) одновременно - // - SETFLAG(Data.Flags, GoodsOpAnalyzeFilt::fCalcCVat, BIN(Data.Flags & (GoodsOpAnalyzeFilt::fCalcCVat|GoodsOpAnalyzeFilt::fCalcPVat))); - SETFLAG(Data.Flags, GoodsOpAnalyzeFilt::fCalcPVat, BIN(Data.Flags & (GoodsOpAnalyzeFilt::fCalcCVat|GoodsOpAnalyzeFilt::fCalcPVat))); - // - AddClusterAssoc(CTL_BILLFLT_DIFFBYPRICE, 0, GoodsOpAnalyzeFilt::fDiffByPrice); - AddClusterAssoc(CTL_BILLFLT_DIFFBYPRICE, 1, GoodsOpAnalyzeFilt::fDiffByNetPrice); - AddClusterAssoc(CTL_BILLFLT_DIFFBYPRICE, 2, GoodsOpAnalyzeFilt::fPriceWithoutExcise); - AddClusterAssoc(CTL_BILLFLT_DIFFBYPRICE, 3, GoodsOpAnalyzeFilt::fCalcRest); - AddClusterAssoc(CTL_BILLFLT_DIFFBYPRICE, 4, GoodsOpAnalyzeFilt::fCalcOrder); - AddClusterAssoc(CTL_BILLFLT_DIFFBYPRICE, 5, GoodsOpAnalyzeFilt::fShowSStatSales); - AddClusterAssoc(CTL_BILLFLT_DIFFBYPRICE, 6, GoodsOpAnalyzeFilt::fUnprofitableGoods); - AddClusterAssoc(CTL_BILLFLT_DIFFBYPRICE, 7, GoodsOpAnalyzeFilt::fBadSellingGoods); - AddClusterAssoc(CTL_BILLFLT_DIFFBYPRICE, 8, GoodsOpAnalyzeFilt::fTradePlanGoodsOnly); - AddClusterAssoc(CTL_BILLFLT_DIFFBYPRICE, 9, GoodsOpAnalyzeFilt::fAddNzRestItems); - AddClusterAssoc(CTL_BILLFLT_DIFFBYPRICE, 10, GoodsOpAnalyzeFilt::fCalcCVat); - SetClusterData(CTL_BILLFLT_DIFFBYPRICE, Data.Flags); - SetupFlags(); - // @v12.1.7 setCtrlData(CTL_BILLFLT_OPRSET, &(v = (ushort)Data.OpGrpID)); - // @v12.1.7 { - AddClusterAssocDef(CTL_BILLFLT_OPRSET, 0, GoodsOpAnalyzeFilt::ogSelected); - AddClusterAssoc(CTL_BILLFLT_OPRSET, 1, GoodsOpAnalyzeFilt::ogIncoming); - AddClusterAssoc(CTL_BILLFLT_OPRSET, 2, GoodsOpAnalyzeFilt::ogProfitable); - AddClusterAssoc(CTL_BILLFLT_OPRSET, 3, GoodsOpAnalyzeFilt::ogPayed); - AddClusterAssoc(CTL_BILLFLT_OPRSET, 4, GoodsOpAnalyzeFilt::ogInOutAnalyze); - AddClusterAssoc(CTL_BILLFLT_OPRSET, 5, GoodsOpAnalyzeFilt::ogMarketplaceSalesAnalyze); - SetClusterData(CTL_BILLFLT_OPRSET, Data.OpGrpID); - // } @v12.1.7 - disableCtrls(!oneof2(Data.OpGrpID, GoodsOpAnalyzeFilt::ogSelected, GoodsOpAnalyzeFilt::ogInOutAnalyze), /*CTL_BILLFLT_PERIOD,*/ CTL_BILLFLT_OPRKIND, CTL_BILLFLT_AMOUNT, 0); - AddClusterAssoc(CTL_BILLFLT_INTRREVAL, 0, GoodsOpAnalyzeFilt::fIntrReval); - SetClusterData(CTL_BILLFLT_INTRREVAL, Data.Flags); - AddClusterAssoc(CTL_BILLFLT_FLAGS, 0, GoodsOpAnalyzeFilt::fDisplayWoPacks); - AddClusterAssoc(CTL_BILLFLT_FLAGS, 1, GoodsOpAnalyzeFilt::fCompareWithReceipt); - SetClusterData(CTL_BILLFLT_FLAGS, Data.Flags); - AddClusterAssoc(CTL_BILLFLT_EACHLOC, 0, GoodsOpAnalyzeFilt::fEachLocation); - AddClusterAssoc(CTL_BILLFLT_EACHLOC, 1, GoodsOpAnalyzeFilt::fCrosstab); - SetClusterData(CTL_BILLFLT_EACHLOC, Data.Flags); - AddClusterAssoc(CTL_BILLFLT_USEABCANLZ, 0, GoodsOpAnalyzeFilt::fUseABCAnlz); - AddClusterAssoc(CTL_BILLFLT_USEABCANLZ, 1, GoodsOpAnalyzeFilt::fABCAnlzByGGrps); - SetupCtrls(Data.Flags); - disableCtrls(Data.BillList.IsExists(), CTL_BILLFLT_OPRSET, - CTLSEL_BILLFLT_OBJECT, CTLSEL_BILLFLT_OPRKIND, CTL_BILLFLT_PERIOD, CTLCAL_BILLFLT_PERIOD, 0); - if(Data.BillList.IsExists()) { - disableCtrl(CTLSEL_BILLFLT_LOC, 1); - enableCommand(cmLocList, 0); - } - return ok; -} - -int GoodsOpAnlzFiltDialog::getDTS(GoodsOpAnalyzeFilt * pFilt) -{ - int ok = 1; - ushort v; - GoodsFiltCtrlGroup::Rec gf_rec; - LocationCtrlGroup::Rec loc_rec; - THROW(GetPeriodInput(this, CTL_BILLFLT_PERIOD, &Data.Period)); - getCtrlData(CTLSEL_BILLFLT_OPRKIND, &Data.OpID); - Data.ObjectID = (Data.OpID || Data.AccSheetID) ? getCtrlLong(CTLSEL_BILLFLT_OBJECT) : 0; - //getCtrlData(CTLSEL_BILLFLT_SUPPL, &Data.SupplID); - getCtrlData(CTLSEL_BILLFLT_GGRP, &Data.GoodsGrpID); - SETFLAG(Data.Flags, GoodsOpAnalyzeFilt::fLabelOnly, getWL()); - GetClusterData(CTL_BILLFLT_DIFFBYPRICE, &Data.Flags); - // - // В диалоге флаги расчета сумм НДС в цп и цр устанавливаются (снимаются) одновременно - // - SETFLAG(Data.Flags, GoodsOpAnalyzeFilt::fCalcCVat, BIN(Data.Flags & (GoodsOpAnalyzeFilt::fCalcCVat|GoodsOpAnalyzeFilt::fCalcPVat))); - SETFLAG(Data.Flags, GoodsOpAnalyzeFilt::fCalcPVat, BIN(Data.Flags & (GoodsOpAnalyzeFilt::fCalcCVat|GoodsOpAnalyzeFilt::fCalcPVat))); - GetClusterData(CTL_BILLFLT_INTRREVAL, &Data.Flags); - // @v12.1.7 getCtrlData(CTL_BILLFLT_OPRSET, &(v = 0)); - // @v12.1.7 Data.OpGrpID = v; - GetClusterData(CTL_BILLFLT_OPRSET, &Data.OpGrpID); // @v12.1.7 - GetClusterData(CTL_BILLFLT_USEABCANLZ, &Data.Flags); - Data.ABCAnlzGroup = BIN(Data.Flags & GoodsOpAnalyzeFilt::fUseABCAnlz); - if(Data.Flags & GoodsOpAnalyzeFilt::fUseABCAnlz) - Data.ABCAnlz.CheckFracts(0); - else - MEMSZERO(Data.ABCAnlz); - v = getCtrlUInt16(CTL_BILLFLT_PRICEDEV); - SETFLAG(Data.Flags, GoodsOpAnalyzeFilt::fPriceDeviation, v & 0x01); - GetClusterData(CTL_BILLFLT_FLAGS, &Data.Flags); - GetClusterData(CTL_BILLFLT_EACHLOC, &Data.Flags); - THROW(getGroupData(ctlgroupGoodsFilt, &gf_rec)); - Data.GoodsGrpID = gf_rec.GoodsGrpID; - THROW(getGroupData(ctlgroupLoc, &loc_rec)); - Data.LocList = loc_rec.LocList; - if(!(Data.Flags & GoodsOpAnalyzeFilt::fCrosstab) && Data.CmpPeriod.IsZero()) - Data.CompareItems.freeAll(); - if(!AdjustPeriodToRights(Data.Period, 1)) { - selectCtrl(CTL_BILLFLT_PERIOD); - CALLEXCEPT(); - } - else - *pFilt = Data; - CATCHZOKPPERR - return ok; -} - class GoodsOpAnlzCmpFiltDialog : public PPListDialog { DECL_DIALOG_DATA(GoodsOpAnalyzeFilt); public: @@ -824,7 +823,7 @@ void GoodsOpAnlzCmpFiltDialog::SetupFlags() PrevID = item.ObjID; } -int GoodsOpAnlzFiltDialog::editCompareItems() +int GoodsOpAnlzFiltDialog::EditCompareItems() { GetClusterData(CTL_BILLFLT_EACHLOC, &Data.Flags); GetPeriodInput(this, CTL_BILLFLT_PERIOD, &Data.Period); @@ -978,7 +977,7 @@ IMPL_HANDLE_EVENT(GoodsOpAnlzFiltDialog) if(getCtrlView(CTLSEL_BILLFLT_OBJECT)) { PPID acc_sheet_id = 0; GetOpCommonAccSheet(Data.OpID, &acc_sheet_id, 0); - setupAccSheet(acc_sheet_id); + SetupAccSheet(acc_sheet_id); if(IsIntrExpndOp(Data.OpID)) disableCtrl(CTL_BILLFLT_INTRREVAL, 0); else { @@ -991,7 +990,7 @@ IMPL_HANDLE_EVENT(GoodsOpAnlzFiltDialog) else if(event.isCmd(cmClusterClk)) { const uint ctl_id = event.getCtlID(); if(ctl_id == CTL_BILLFLT_OPRSET) - replyOprGrpChanged(); + ReplyOprGrpChanged(); else if(ctl_id == CTL_BILLFLT_DIFFBYPRICE) { GetClusterData(CTL_BILLFLT_DIFFBYPRICE, &Data.Flags); SetupFlags(); @@ -1040,22 +1039,19 @@ IMPL_HANDLE_EVENT(GoodsOpAnlzFiltDialog) } } else if(event.isCmd(cmCompare)) - editCompareItems(); + EditCompareItems(); else if(event.isCmd(cmABCAnlzOptions)) - editABCAnlzFilt(&Data.ABCAnlz); + EditABCAnlzFilt(&Data.ABCAnlz); else return; clearEvent(event); } -void GoodsOpAnlzFiltDialog::replyOprGrpChanged() +void GoodsOpAnlzFiltDialog::ReplyOprGrpChanged() { - ushort v = 0; - // @v12.1.7 if(getCtrlData(CTL_BILLFLT_OPRSET, &v)) { - if(GetClusterData(CTL_BILLFLT_OPRSET, &Data.OpGrpID)) { // @v12.1.7 - // @v12.1.7 Data.OpGrpID = v; + if(GetClusterData(CTL_BILLFLT_OPRSET, &Data.OpGrpID)) { SetupCtrls(Data.Flags); - setupOpCombo(); + SetupOpCombo(); if(!oneof2(Data.OpGrpID, GoodsOpAnalyzeFilt::ogSelected, GoodsOpAnalyzeFilt::ogInOutAnalyze)) { disableCtrl(CTLSEL_BILLFLT_OPRKIND, 1); Data.OpID = 0; @@ -1066,7 +1062,7 @@ void GoodsOpAnlzFiltDialog::replyOprGrpChanged() if(op_rec.Flags & OPKF_PROFITABLE && op_rec.AccSheetID) last = (last && op_rec.AccSheetID != last) ? -1 : op_rec.AccSheetID; } - setupAccSheet((last == -1) ? 0 : last); + SetupAccSheet((last == -1) ? 0 : last); } } else @@ -1074,7 +1070,7 @@ void GoodsOpAnlzFiltDialog::replyOprGrpChanged() } } -void GoodsOpAnlzFiltDialog::setupAccSheet(PPID accSheetID) +void GoodsOpAnlzFiltDialog::SetupAccSheet(PPID accSheetID) { if(getCtrlView(CTLSEL_BILLFLT_OBJECT)) { Data.AccSheetID = accSheetID; @@ -1084,7 +1080,7 @@ void GoodsOpAnlzFiltDialog::setupAccSheet(PPID accSheetID) } } -int GoodsOpAnlzFiltDialog::editABCAnlzFilt(ABCAnlzFilt * pFilt) +int GoodsOpAnlzFiltDialog::EditABCAnlzFilt(ABCAnlzFilt * pFilt) { class ABCAnlzFiltDialog : public TDialog { DECL_DIALOG_DATA(ABCAnlzFilt); @@ -2145,6 +2141,7 @@ int PPViewGoodsOpAnalyze::CreateTempTable(double * pUfpFactors) assert(pUfpFactors != 0); int ok = 1; + bool debug_mark = false; PPIDArray op_list; PPIDArray neg_op_list; PPOprKind op_rec; @@ -2154,11 +2151,10 @@ int PPViewGoodsOpAnalyze::CreateTempTable(double * pUfpFactors) double payment = 0.0; PPBillPacket pack; PPObjOprKind op_obj; - PPObjLocation loc_obj; // Support for PPObjPerson::GetCity if Filt.ObjCityID PPIDArray ext_bill_list; PPIDArray suppl_bill_list; PPIDArray * p_suppl_bill_list = 0; - int use_ext_list = 0; + bool use_ext_list = false; ZDELETE(P_CmpView); ZDELETE(P_TempTbl); if(!Filt.CmpPeriod.IsZero() || (Filt.OpGrpID == GoodsOpAnalyzeFilt::ogMarketplaceSalesAnalyze)) { @@ -2192,7 +2188,7 @@ int PPViewGoodsOpAnalyze::CreateTempTable(double * pUfpFactors) // @todo Опционально использовать индивидуальную фильтрацию по расширению документа THROW(P_BObj->P_Tbl->GetBillListByExt(Filt.AgentID, 0L, ext_bill_list)); // Сортировку выполняет GetBillListByExt - use_ext_list = 1; + use_ext_list = true; } if(Filt.SupplAgentID) { // @todo Опционально использовать индивидуальную фильтрацию по расширению документа @@ -2214,7 +2210,25 @@ int PPViewGoodsOpAnalyze::CreateTempTable(double * pUfpFactors) PPIDArray seen_ord_lot_list; // Идентификаторы лотов заказов, которые мы уже учли в отчете PPIDArray temp_list; PPIDArray goods_list; + PPIDArray wh_list; + PPID mp_acc_id = 0; + PPID mp_acs_id = 0; + PrcssrMarketplaceInterchange * p_mp_prc = 0; MpDBlk.Z(); + if(Filt.MarketplaceGuaID) { + MarketplaceInterchangeFilt mp_filt; + mp_filt.GuaID = Filt.MarketplaceGuaID; + p_mp_prc = new PrcssrMarketplaceInterchange(); + if(p_mp_prc->Init(&mp_filt)) { + mp_acc_id = p_mp_prc->Helper_GetMarketplaceOpsAccount(false, 0); + if(mp_acc_id) { + mp_acs_id = p_mp_prc->Helper_GetMarketplaceOpsAccSheetID(false, false, 0); + } + } + else { + ZDELETE(p_mp_prc); + } + } { // Продажи BExtQuery q(p_bt, 2); @@ -2268,12 +2282,12 @@ int PPViewGoodsOpAnalyze::CreateTempTable(double * pUfpFactors) PPBillPacket bpack; if(P_BObj->ExtractPacket(bill_id, &bpack) > 0) { bpack.GetOrderList(local_ord_list); + wh_list.add(bpack.Rec.LocID); { long subst_bill_val = 0; GoaAddingBlock blk; double part = 1.0; int sign = 0; - goods_list.Z(); InitAddingBlock(&bpack, part, sign, &blk); if(!!Filt.Sgb) P_BObj->Subst(&bpack, &subst_bill_val, &Bsp); @@ -2281,6 +2295,7 @@ int PPViewGoodsOpAnalyze::CreateTempTable(double * pUfpFactors) const PPTransferItem & r_ti = bpack.ConstTI(tiidx); int r; THROW(PPCheckUserBreak()); + goods_list.add(labs(r_ti.GoodsID)); THROW(r = PreprocessTi(&r_ti, p_suppl_bill_list, subst_bill_val, &blk)); if(r > 0) { const double ti_qtty = fabs(r_ti.Quantity_); @@ -2337,6 +2352,7 @@ int PPViewGoodsOpAnalyze::CreateTempTable(double * pUfpFactors) if(P_BObj->trfr->Rcpt.Search(r_ti.OrdLotID, &lot_rec) > 0) { PPBillPacket ord_bpack; if(P_BObj->ExtractPacket(lot_rec.BillID, &ord_bpack) > 0) { + wh_list.add(ord_bpack.Rec.LocID); p_iv->Add(PPBZSI_ORDCOUNT, 1.0); p_iv->Add(PPBZSI_ORDQTTY, fabs(lot_rec.Quantity)); // @@ -2372,13 +2388,14 @@ int PPViewGoodsOpAnalyze::CreateTempTable(double * pUfpFactors) GoaAddingBlock blk; double part = 1.0; int sign = 0; - goods_list.Z(); + wh_list.add(bpack.Rec.LocID); InitAddingBlock(&bpack, part, sign, &blk); if(!!Filt.Sgb) P_BObj->Subst(&bpack, &subst_bill_val, &Bsp); for(uint tiidx = 0; tiidx < bpack.GetTCount(); tiidx++) { const PPTransferItem & r_ti = bpack.ConstTI(tiidx); int r; + goods_list.add(labs(r_ti.GoodsID)); { PPTransferItem _ret_ti(r_ti); _ret_ti.Quantity_ = 0.0; @@ -2441,7 +2458,7 @@ int PPViewGoodsOpAnalyze::CreateTempTable(double * pUfpFactors) GoaAddingBlock blk; double part = 1.0; int sign = 0; - goods_list.Z(); + wh_list.add(bpack.Rec.LocID); InitAddingBlock(&bpack, part, sign, &blk); if(!!Filt.Sgb) P_BObj->Subst(&bpack, &subst_bill_val, &Bsp); @@ -2449,6 +2466,7 @@ int PPViewGoodsOpAnalyze::CreateTempTable(double * pUfpFactors) const PPTransferItem & r_ti = bpack.ConstTI(tiidx); if(!seen_ord_lot_list.lsearch(r_ti.LotID)) { int r; + goods_list.add(labs(r_ti.GoodsID)); PPTransferItem _ord_ti(r_ti); _ord_ti.Quantity_ = 0.0; _ord_ti.Cost = 0.0; @@ -2478,22 +2496,93 @@ int PPViewGoodsOpAnalyze::CreateTempTable(double * pUfpFactors) p_iv->Add(PPBZSI_ORDCANCELLEDQTTY, fabs(r_ti.Quantity_)); MpDBlk.CancelledOrdList.add(bpack.Rec.ID); } - /* - if(local_ord_list.getCount()) { - if(r_ti.Flags & PPTFR_ONORDER && r_ti.OrdLotID && !seen_ord_lot_list.lsearch(r_ti.OrdLotID)) { - uint sh_lot_pos = 0; - if(bpack.SearchShLot(r_ti.OrdLotID, &sh_lot_pos)) { - ReceiptTbl::Rec lot_rec; - if(P_BObj->trfr->Rcpt.Search(r_ti.OrdLotID, &lot_rec) > 0) { - p_iv->Add(PPBZSI_ORDCOUNT, 1.0); - p_iv->Add(PPBZSI_ORDQTTY, fabs(lot_rec.Quantity)); - long ord_shipm_delay = diffdate(bpack.Rec.Dt, lot_rec.Dt); - p_iv->Add(PPBZSI_ORDSHIPMDELAYDAYS, static_cast(ord_shipm_delay)); - seen_ord_lot_list.add(lot_rec.ID); + } + } + } + } + } + } + if(goods_list.getCount()) { + if(mp_acc_id && mp_acs_id) { + goods_list.sortAndUndup(); + assert(wh_list.getCount()); + wh_list.sortAndUndup(); + DateRange period(Filt.Period); + RAssocArray avg_rest_result; + double total_storage = 0.0; // Общие расходы на хранение (без разбивки, ибо wildberries не дает таковой) + if(P_BObj->trfr->EvaluateAverageRestByGoods(wh_list, goods_list, period, avg_rest_result) > 0) { + debug_mark = true; + { + PPViewAccAnlz aa_view; + AccAnlzFilt aa_filt; + AccAnlzTotal aa_total; + aa_filt.Period = Filt.Period; + aa_filt.AcctId.ac = mp_acc_id; + ArticleTbl::Rec ar_rec; + if(P_BObj->ArObj.P_Tbl->SearchNum(mp_acs_id, ARTN_MRKTPLCACC_STORAGE, &ar_rec) > 0) { + aa_filt.AcctId.ar = ar_rec.ID; + aa_filt.Aco = ACO_3; + if(P_BObj->atobj->P_Tbl->AcctIDToRel(&aa_filt.AcctId, &aa_filt.AccID)) { + aa_filt.Flags |= AccAnlzFilt::fTotalOnly; + aa_filt.Flags &= ~AccAnlzFilt::fTrnovrBySheet; + if(aa_view.Init_(&aa_filt)) { + aa_view.GetTotal(&aa_total); + double dbt = 0.0; + double crd = 0.0; + aa_total.DbtTrnovr.Get(0L, 0L, &dbt); + aa_total.CrdTrnovr.Get(0L, 0L, &crd); + total_storage = crd - dbt; + } + } + } + } + if(total_storage > 0.0) { + const double avg_rest_total = avg_rest_result.GetTotal(); + for(uint arlidx = 0; arlidx < avg_rest_result.getCount(); arlidx++) { + const PPID goods_id = avg_rest_result.at(arlidx).Key; + const double avg_rest = avg_rest_result.at(arlidx).Val; + double ord_qtty = 0; + double shipm_qtty = 0; + uint item_count = 0; // Количество элементов в IndicatorList имеющих общий ид товара + { + for(uint i = 0; i < IndicatorList.getCount(); i++) { + const IndicatorVector * p_iv = IndicatorList.at(i); + if(p_iv && p_iv->GoodsID == goods_id) { + item_count++; + double v = 0.0; + if(p_iv->Get(PPBZSI_ORDQTTY, &v)) + ord_qtty += v; + if(p_iv->Get(PPBZSI_SALEQTTY, &v)) + shipm_qtty += v; + } + } + } + if(item_count) { + for(uint i = 0; i < IndicatorList.getCount(); i++) { + IndicatorVector * p_iv = IndicatorList.at(i); + if(p_iv && p_iv->GoodsID == goods_id) { + const double avg_rest_part = avg_rest / avg_rest_total; + double storage_cost = 0.0; + if(item_count == 1) { + storage_cost = total_storage * avg_rest_part; + } + else { + double v = 0.0; + if(shipm_qtty > 0.0) { + p_iv->Get(PPBZSI_SALEQTTY, &v); + storage_cost = (v / shipm_qtty) * total_storage * avg_rest_part; + } + else if(ord_qtty > 0.0) { + p_iv->Get(PPBZSI_ORDQTTY, &v); + storage_cost = (v / ord_qtty) * total_storage * avg_rest_part; + } + else { + storage_cost = (1.0 / static_cast(item_count)) * total_storage * avg_rest_part; } } + p_iv->Add(PPBZSI_MPSTORAGE, storage_cost); } - }*/ + } } } } @@ -4232,7 +4321,6 @@ void PPViewGoodsOpAnalyze::PreprocessBrowser(PPViewBrowser * pBrw) if(MpDBlk.RetList.getCount()) { // @v12.1.11 pBrw->InsColumn(-1, "@qtty", 122, T_DOUBLE, MKSFMTD(0, 3, NMBF_NOTRAILZ), BCO_USERPROC); pBrw->InsColumn(-1, "@sumcost", 123, T_DOUBLE, SFMT_MONEY, BCO_USERPROC); - { BroGroup grp; grp.First = column_idx; @@ -4243,7 +4331,7 @@ void PPViewGoodsOpAnalyze::PreprocessBrowser(PPViewBrowser * pBrw) column_idx += grp.Count; } } - pBrw->insertColumn(-1, "Seller's earnings", 107, T_DOUBLE, SFMT_MONEY, BCO_USERPROC); + pBrw->insertColumn(-1, "@sellersincome", 107, T_DOUBLE, SFMT_MONEY, BCO_USERPROC); column_idx += 1; { pBrw->insertColumn(-1, "@commission_s", 108, T_DOUBLE, SFMT_MONEY, BCO_USERPROC); @@ -4260,7 +4348,7 @@ void PPViewGoodsOpAnalyze::PreprocessBrowser(PPViewBrowser * pBrw) } } pBrw->insertColumn(-1, "@profit", 1116, T_DOUBLE, SFMT_MONEY, BCO_USERPROC); - pBrw->insertColumn(-1, "Shipm days", 1111, T_DOUBLE, SFMT_MONEY, BCO_USERPROC); + pBrw->insertColumn(-1, "@bzsi_ordshipmdelaydaysavg", 1111, T_DOUBLE, SFMT_MONEY, BCO_USERPROC); CALLPTRMEMB(pBrw, SetDefUserProc(PPViewGoodsOpAnalyze::GetDataForBrowser, this)); } else if(brw_id == BROWSER_GOODSOPER && Filt.Flags & GoodsOpAnalyzeFilt::fCalcRest) { @@ -4839,8 +4927,7 @@ int PPViewGoodsOpAnalyze::ProcessCommand(uint ppvCmd, const void * pHdr, PPViewB if(hdr.GoodsID) { if(oneof2(Filt.Sgg, sggSuppl, sggSupplAgent)) { PPID _id_to_edit = (hdr.GoodsID & ~GOODSSUBSTMASK); - PPObjArticle ar_obj; - if(ar_obj.Edit(&_id_to_edit, 0) == cmOK) + if(P_BObj->ArObj.Edit(&_id_to_edit, 0) == cmOK) ok = 1; } else if(Filt.Sgg == sggLocation) { diff --git a/Src/PPLib/bitmbrow.cpp b/Src/PPLib/bitmbrow.cpp index 0602febe9d..d356e6579d 100644 --- a/Src/PPLib/bitmbrow.cpp +++ b/Src/PPLib/bitmbrow.cpp @@ -2044,7 +2044,7 @@ int BillItemBrowser::_moveItem2(int srcRowIdx) int BillItemBrowser::addItemByOrder(const PPBillPacket * pOrderPack, int line) { - int ok = P_BObj->InsertShipmentItemByOrder(P_Pack, pOrderPack, line, 0/*srcLotID*/, 0.0, 1/*interactive*/); + int ok = P_BObj->InsertShipmentItemByOrder(P_Pack, pOrderPack, line, 0/*srcLotID*/, 0.0, PPObjBill::isibofInteractive); if(ok > 0 && !P_Pack->Rec.SCardID && pOrderPack->Rec.SCardID > 0) P_Pack->Rec.SCardID = pOrderPack->Rec.SCardID; return ok; diff --git a/Src/PPLib/marketplace.cpp b/Src/PPLib/marketplace.cpp index c950f9eb71..cd249c0177 100644 --- a/Src/PPLib/marketplace.cpp +++ b/Src/PPLib/marketplace.cpp @@ -2982,7 +2982,7 @@ int PPMarketplaceInterface_Wildberries::ImportSales() R_Prc.GetLogger().Log(msg_buf); } else { - const int isibor = p_bobj->InsertShipmentItemByOrder(&pack, &ord_pack, static_cast(ord_ti_idx)-1, lot_id/*srcLotID*/, 1.0, 0); + const int isibor = p_bobj->InsertShipmentItemByOrder(&pack, &ord_pack, static_cast(ord_ti_idx)-1, lot_id/*srcLotID*/, 1.0, PPObjBill::isibofErrOnCompletedOrder); if(isibor > 0) { const long new_row_idx = 0;//row_idx_list.get(0); ReceiptTbl::Rec lot_rec; @@ -3090,8 +3090,11 @@ int PPMarketplaceInterface_Wildberries::ImportSales() int PPMarketplaceInterface_Wildberries::ImportOrders() { int ok = -1; + bool debug_mark = false; PPObjBill * p_bobj = BillObj; SString temp_buf; + SString fmt_buf; + SString msg_buf; TSCollection order_list; RequestOrders(order_list); if(order_list.getCount()) { @@ -3106,10 +3109,32 @@ 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; + BillTbl::Rec ex_bill_rec; + if(p_wb_item->SrID == "20977596600611035.0.0") { + debug_mark = true; + } 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) { - ; + if(p_bobj->P_Tbl->SearchByCode(bill_code, order_op_id, ZERODATE, &ex_bill_rec) > 0) { + if(!(ex_bill_rec.Flags2 & BILLF2_DECLINED) && p_wb_item->Flags & Sale::fIsCancel) { + PPBillPacket ex_pack; + if(p_bobj->ExtractPacketWithFlags(ex_bill_rec.ID, &ex_pack, BPLD_FORCESERIALS) > 0) { + ex_pack.Rec.Flags2 |= BILLF2_DECLINED; + ex_pack.InitAmounts(); + p_bobj->FillTurnList(&ex_pack); + if(p_bobj->UpdatePacket(&ex_pack, 1)) { + PPObjBill::MakeCodeString(&ex_pack.Rec, PPObjBill::mcsAddLocName|PPObjBill::mcsAddObjName, temp_buf); + PPLoadText(PPTXT_ORDERCANCELLED, fmt_buf); + msg_buf.Printf(fmt_buf, temp_buf.cptr()); + R_Prc.GetLogger().Log(msg_buf); + ok = 1; + } + else { + R_Prc.GetLogger().LogLastError(); + } + + } + } } else { PPBillPacket pack; diff --git a/Src/PPLib/transfer.cpp b/Src/PPLib/transfer.cpp index d26798dc83..8f361c1412 100644 --- a/Src/PPLib/transfer.cpp +++ b/Src/PPLib/transfer.cpp @@ -1125,9 +1125,49 @@ int Transfer::GetAvailableGoodsRest(PPID goodsID, PPID locID, const DateRange & return ok; } -int Transfer::EvaluateAverageRestByLot(PPID lotID, const DateRange & rPeriod, double * pAvgQtty) // @v12.1.11 @construction +int Transfer::FixUpPeriodForAverageRestEvaluating(const PPIDArray & rLocList, const PPIDArray & rGoodsList, DateRange & rPeriod) // @v12.1.12 { int ok = -1; + DateRange period(rPeriod); + period.Actualize(ZERODATE); + if(!period.low) { + if(rLocList.getCount() && rGoodsList.getCount()) { + PPIDArray loc_list; + { + PPObjLocation loc_obj; + loc_obj.ResolveWarehouseList(&rLocList, loc_list); + } + loc_list.sortAndUndup(); + for(uint locidx = 0; locidx < loc_list.getCount(); locidx++) { + const PPID loc_id = loc_list.get(locidx); + for(uint gidx = 0; gidx < rGoodsList.getCount(); gidx++) { + const PPID goods_id = labs(rGoodsList.get(gidx)); + ReceiptTbl::Rec lot_rec; + if(Rcpt.GetFirstLot(goods_id, loc_id, &lot_rec) > 0) { + if(!period.low || period.low > lot_rec.Dt) + period.low = lot_rec.Dt; + } + } + } + } + } + if(!checkdate(period.low)) + ok = 0; + else { + if(!checkdate(period.upp)) + period.upp = getcurdate_(); + assert(checkdate(period.low) && checkdate(period.upp)); + if(period != rPeriod) { + rPeriod = period; + ok = 1; + } + } + return ok; +} + +int Transfer::EvaluateAverageRestByLot(PPID lotID, const DateRange & rPeriod, double * pAvgQtty) // @v12.1.11 @construction +{ + int ok = 1; double avg_qtty = 0.0; DateRange period(rPeriod); period.Actualize(ZERODATE); @@ -1176,6 +1216,47 @@ int Transfer::EvaluateAverageRestByLot(PPID lotID, const DateRange & rPeriod, do return ok; } +int Transfer::EvaluateAverageRestByGoods(const PPIDArray & rLocList, const PPIDArray & rGoodsList, DateRange & rPeriod, RAssocArray & rList) // @v12.1.12 +{ + int ok = -1; + rList.clear(); + if(rLocList.getCount() && rGoodsList.getCount()) { + PPObjLocation loc_obj; + PPIDArray loc_list; + PPIDArray goods_list(rGoodsList); + goods_list.sortAndUndup(); + loc_obj.ResolveWarehouseList(&rLocList, loc_list); + loc_list.sortAndUndup(); + if(FixUpPeriodForAverageRestEvaluating(loc_list, goods_list, rPeriod)) { + for(uint gidx = 0; gidx < goods_list.getCount(); gidx++) { + const PPID goods_id = labs(goods_list.get(gidx)); + LotArray lot_rec_list; + double result = 0.0; + for(uint locidx = 0; locidx < loc_list.getCount(); locidx++) { + const PPID loc_id = loc_list.get(locidx); + Rcpt.GetList(goods_id, loc_id, 0, rPeriod.upp, 0, &lot_rec_list); + } + // + // В общем случае среднее значение не аддитивно, однако функция Transfer::EvaluateAverageRestByLot + // гарантированно считает средний остаток за один и тот же набор дней и по этому в этом частном случае + // мы можем складывать средние остатки по каждому лоту дабы получить общий средний остаток по товару. + // + for(uint i = 0; i < lot_rec_list.getCount(); i++) { + const ReceiptTbl::Rec & r_lot_rec = lot_rec_list.at(i); + double pv = 0.0; + if(EvaluateAverageRestByLot(r_lot_rec.ID, rPeriod, &pv) > 0) { + ok = 1; + } + result += pv; + } + assert(!rList.Has(goods_id)); + rList.Add(goods_id, result, 0, 0); + } + } + } + return ok; +} + int Transfer::PreprocessCorrectionExp(PPTransferItem & rTi, const PPIDArray & rBillChain) { int ok = 1; diff --git a/Src/PPMain/ppw.rc b/Src/PPMain/ppw.rc index 41031a6e6e..ecb3de8629 100644 --- a/Src/PPMain/ppw.rc +++ b/Src/PPMain/ppw.rc @@ -11535,28 +11535,28 @@ BEGIN PUSHBUTTON "@but_cancel",STDCTL_CANCELBUTTON,245,110,45,13 END -DLG_GOODSOPRE DIALOGEX 20, 0, 322, 155 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +DLG_GOODSOPRE DIALOGEX 20, 0, 331, 187 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "@goodsopanlzfilt_compareitems" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "@goodsopanlzfilt_cmpperiod",4001,5,5,140,8 - EDITTEXT CTL_GOODSOPRE_PERIOD,150,5,135,13,ES_AUTOHSCROLL - PUSHBUTTON "",CTLCAL_GOODSOPRE_PERIOD,285,5,13,13,BS_BITMAP | NOT WS_TABSTOP - PUSHBUTTON "",CTLMNU_GOODSOPRE_PERIOD,300,5,13,13,BS_BITMAP | NOT WS_TABSTOP - LTEXT "@goodsopanlzfilt_cmprestcalcdate",4002,5,20,140,8 - EDITTEXT CTL_GOODSOPRE_RESTDT,150,20,105,13,ES_AUTOHSCROLL - PUSHBUTTON "",CTLCAL_GOODSOPRE_RESTDT,255,20,13,13,BS_BITMAP | NOT WS_TABSTOP - PUSHBUTTON "",CTLMNU_GOODSOPRE_RESTDT,270,20,13,13,BS_BITMAP | NOT WS_TABSTOP - LTEXT "@indicator",4003,5,35,120,8 - LISTBOX CTL_GOODSOPRE_VALLIST,5,45,195,105,LBS_NOINTEGRALHEIGHT | LBS_WANTKEYBOARDINPUT | WS_TABSTOP - GROUPBOX "",CTL_GOODSOPRE_FLAGS,205,40,110,45,WS_GROUP - CONTROL "@goodsopanlzfilt_ffldmainperiod",5300,"Button",BS_AUTOCHECKBOX | BS_NOTIFY | WS_TABSTOP,210,50,100,10 - CONTROL "@goodsopanlzfilt_ffldcmpperiod",9396,"Button",BS_AUTOCHECKBOX | BS_NOTIFY | WS_TABSTOP,210,60,100,10 - CONTROL "@goodsopanlzfilt_fflddiff",13492,"Button",BS_AUTOCHECKBOX | BS_NOTIFY | WS_TABSTOP,210,70,100,10 - CONTROL "@goodsopanlzfilt_fcomparepctdiff",5302,"Button",BS_AUTOCHECKBOX | BS_NOTIFY | WS_TABSTOP,210,100,105,13 - DEFPUSHBUTTON "@but_ok",STDCTL_OKBUTTON,205,135,50,13 - PUSHBUTTON "@but_cancel",STDCTL_CANCELBUTTON,265,135,50,13 + LTEXT "@goodsopanlzfilt_cmpperiod",4001,10,10,225,8 + EDITTEXT CTL_GOODSOPRE_PERIOD,10,20,135,13,ES_AUTOHSCROLL + PUSHBUTTON "",CTLCAL_GOODSOPRE_PERIOD,145,20,13,13,BS_BITMAP | NOT WS_TABSTOP + PUSHBUTTON "",CTLMNU_GOODSOPRE_PERIOD,159,20,13,13,BS_BITMAP | NOT WS_TABSTOP + LTEXT "@goodsopanlzfilt_cmprestcalcdate",4002,10,34,220,8 + EDITTEXT CTL_GOODSOPRE_RESTDT,10,45,105,13,ES_AUTOHSCROLL + PUSHBUTTON "",CTLCAL_GOODSOPRE_RESTDT,115,45,13,13,BS_BITMAP | NOT WS_TABSTOP + PUSHBUTTON "",CTLMNU_GOODSOPRE_RESTDT,129,45,13,13,BS_BITMAP | NOT WS_TABSTOP + LTEXT "@indicator",4003,10,65,120,8 + LISTBOX CTL_GOODSOPRE_VALLIST,10,74,195,105,LBS_NOINTEGRALHEIGHT | LBS_WANTKEYBOARDINPUT | WS_TABSTOP + GROUPBOX "",CTL_GOODSOPRE_FLAGS,210,70,110,45,WS_GROUP + CONTROL "@goodsopanlzfilt_ffldmainperiod",5300,"Button",BS_AUTOCHECKBOX | BS_NOTIFY | WS_TABSTOP,215,79,100,10 + CONTROL "@goodsopanlzfilt_ffldcmpperiod",9396,"Button",BS_AUTOCHECKBOX | BS_NOTIFY | WS_TABSTOP,215,90,100,10 + CONTROL "@goodsopanlzfilt_fflddiff",13492,"Button",BS_AUTOCHECKBOX | BS_NOTIFY | WS_TABSTOP,215,100,100,10 + CONTROL "@goodsopanlzfilt_fcomparepctdiff",5302,"Button",BS_AUTOCHECKBOX | BS_NOTIFY | WS_TABSTOP,215,130,105,13 + DEFPUSHBUTTON "@but_ok",STDCTL_OKBUTTON,210,164,50,13 + PUSHBUTTON "@but_cancel",STDCTL_CANCELBUTTON,270,164,50,13 END DLG_GOODSFLT DIALOGEX 5, 0, 615, 307 @@ -16869,16 +16869,19 @@ BEGIN LTEXT "@goodsopanlzfilt_object",4004,220,65,260,8 EDITTEXT CTL_BILLFLT_OBJECT,220,75,265,13,ES_AUTOHSCROLL | ES_READONLY PUSHBUTTON "",CTLSEL_BILLFLT_OBJECT,485,75,13,13,BS_BITMAP | NOT WS_TABSTOP - LTEXT "@goodsopanlzfilt_loclist",4005,5,140,235,8 + EDITTEXT CTL_BILLFLT_MPGUA,220,100,265,13,ES_AUTOHSCROLL | ES_READONLY + LTEXT "@goodsopanlzfilt_marketplacegua",4005,220,90,250,8 + PUSHBUTTON "",CTLSEL_BILLFLT_MPGUA,485,100,12,13,BS_BITMAP + LTEXT "@goodsopanlzfilt_loclist",4006,5,140,235,8 EDITTEXT CTL_BILLFLT_LOC,5,150,240,13,ES_AUTOHSCROLL | ES_READONLY PUSHBUTTON "",CTLSEL_BILLFLT_LOC,245,150,13,13,BS_BITMAP | NOT WS_TABSTOP - PUSHBUTTON "...",4006,260,150,20,13 + PUSHBUTTON "...",4007,260,150,20,13 CONTROL "@goodsopanlzfilt_feachlocation",5369,"Button",BS_AUTOCHECKBOX | BS_NOTIFY | WS_TABSTOP,285,150,123,10 CONTROL "@goodsopanlzfilt_fcrosstab",9465,"Button",BS_AUTOCHECKBOX | BS_NOTIFY | WS_TABSTOP,285,160,123,10 - LTEXT "@goodsopanlzfilt_goodsgrp",4007,5,170,210,8 + LTEXT "@goodsopanlzfilt_goodsgrp",4008,5,170,210,8 EDITTEXT CTL_BILLFLT_GGRP,5,180,285,13,ES_AUTOHSCROLL | ES_READONLY PUSHBUTTON "",CTLSEL_BILLFLT_GGRP,290,180,13,13,BS_BITMAP | NOT WS_TABSTOP - PUSHBUTTON "@but_filt",4008,305,180,40,13 + PUSHBUTTON "@but_filt",4009,305,180,40,13 GROUPBOX "",CTL_BILLFLT_DIFFBYPRICE,5,200,235,135,WS_GROUP CONTROL "@goodsopanlzfilt_fdiffbyprice",5338,"Button",BS_AUTOCHECKBOX | BS_NOTIFY | WS_TABSTOP,10,210,225,10 CONTROL "@goodsopanlzfilt_fdiffbynetprice",9434,"Button",BS_AUTOCHECKBOX | BS_NOTIFY | WS_TABSTOP,10,220,225,10 @@ -16896,12 +16899,12 @@ BEGIN GROUPBOX "",CTL_BILLFLT_FLAGS,245,225,170,33,WS_GROUP CONTROL "@goodsopanlzfilt_fdisplaywopacks",5307,"Button",BS_AUTOCHECKBOX | BS_NOTIFY | WS_TABSTOP,250,235,160,10 CONTROL "@goodsopanlzfilt_fcomparewithreceipt",9403,"Button",BS_AUTOCHECKBOX | BS_NOTIFY | WS_TABSTOP,250,245,160,10 - PUSHBUTTON "@but_addendum",4009,245,265,75,13 - PUSHBUTTON "@{goodsopanlzfilt_comparison}...",4010,340,265,75,13 + PUSHBUTTON "@but_addendum",4010,245,265,75,13 + PUSHBUTTON "@{goodsopanlzfilt_comparison}...",4011,340,265,75,13 GROUPBOX "",CTL_BILLFLT_USEABCANLZ,245,280,170,55,WS_GROUP CONTROL "@goodsopanlzfilt_fuseabcanlz",5363,"Button",BS_AUTOCHECKBOX | BS_NOTIFY | WS_TABSTOP,251,290,159,10 CONTROL "@goodsopanlzfilt_fabcanlzbyggrp",9459,"Button",BS_AUTOCHECKBOX | BS_NOTIFY | WS_TABSTOP,251,300,154,10 - PUSHBUTTON "@{goodsopanlzfilt_abcfilt}...",4011,300,315,75,13 + PUSHBUTTON "@{goodsopanlzfilt_abcfilt}...",4012,300,315,75,13 DEFPUSHBUTTON "@but_ok",STDCTL_OKBUTTON,300,340,50,13 PUSHBUTTON "@but_cancel",STDCTL_CANCELBUTTON,365,340,50,13 END @@ -33167,7 +33170,8 @@ BEGIN DLG_GOODSOPRE, DIALOG BEGIN - RIGHTMARGIN, 309 + RIGHTMARGIN, 318 + BOTTOMMARGIN, 155 END DLG_GOODSFLT, DIALOG diff --git a/Src/PPMain/wsctl-main.cpp b/Src/PPMain/wsctl-main.cpp index 407fd80651..090881b3d0 100644 --- a/Src/PPMain/wsctl-main.cpp +++ b/Src/PPMain/wsctl-main.cpp @@ -611,6 +611,7 @@ class WsCtl_ImGuiSceneBlock : public ImGuiSceneBase { PPID SelectedTecGoodsID; // Выбранные товар для техсессии DTSess AutonomousTSessEntry; // На случай, если связь с сервером будет потеряна во время рабочей сессии, // это поле обязано поддерживать информацию о сеансе для своевременной остановки и прочих рабочих функций. + DbInfo Dbi; // @v12.1.11 После успешного выполнения // }; int GetScreen() const { return Screen; } int SetScreen(int scr); @@ -844,56 +845,57 @@ class WsCtl_ImGuiSceneBlock : public ImGuiSceneBase { int QueryProgramList2(WsCtl_ProgramCollection & rPgmL, WsCtl_ClientPolicy & rPolicyL); void LoadProgramList2(); void EmitProgramGallery(ImGuiWindowByLayout & rW, SUiLayout & rTl); - void * QueryImageTextureByOid(PPObjID oid) // @construction { + void * QueryImageTextureByOid(PPObjID oid, const char * pImgSignature) { void * p_result = 0; - //Cache_Texture SString temp_buf; SString signature; - DConnectionStatus conn_status; - St.D_ConnStatus.GetData(conn_status); - SBinaryChunk gi(&conn_status.Dbi.Uuid, sizeof(conn_status.Dbi.Uuid)); - PPObject::MakeBlobSignature(gi, oid, 1, signature); + if(!isempty(pImgSignature)) { + signature = pImgSignature; + } + else { + DConnectionStatus conn_status; + St.D_ConnStatus.GetData(conn_status); + SBinaryChunk gi(&conn_status.Dbi.Uuid, sizeof(conn_status.Dbi.Uuid)); + PPObject::MakeBlobSignature(gi, oid, 1, signature); + } Texture_CachedFileEntity * p_te = Cache_Texture.Get(signature); - { - if(!p_te || p_te->GetState() != Texture_CachedFileEntity::rstUnresolved) { - if(!Cache_Texture.GetFileStorate().GetFilePath(signature, temp_buf)) { - WsCtl_ImGuiSceneBlock::DImageLoading st_data; - St.D_ImgLd.GetData(st_data); - //PPObjID oid(PPOBJ_SWPROGRAM, p_pe_->ID); - const WsCtl_ImGuiSceneBlock::DImageLoading::Entry * p_il_entry = st_data.SearchOid(oid); - if(p_il_entry && p_il_entry->Status == -1) { - if(!p_te) { - Texture_CachedFileEntity * p_cfe = new Texture_CachedFileEntity(); - if(p_cfe) { - p_cfe->SetAsUnresolved(); - Cache_Texture.Put(p_cfe); // put program-entry img texture - p_cfe = 0; // ! prevent deletion below - } - } - else { - p_te->SetAsUnresolved(); + if(!p_te) { + if(!Cache_Texture.GetFileStorate().GetFilePath(signature, temp_buf)) { + WsCtl_ImGuiSceneBlock::DImageLoading st_data; + St.D_ImgLd.GetData(st_data); + const WsCtl_ImGuiSceneBlock::DImageLoading::Entry * p_il_entry = st_data.SearchOid(oid); + if(p_il_entry && p_il_entry->Status == -1) { + if(!p_te) { + Texture_CachedFileEntity * p_cfe = new Texture_CachedFileEntity(); + if(p_cfe) { + p_cfe->SetAsUnresolved(); + Cache_Texture.Put(p_cfe); // put img texture to the cache + p_cfe = 0; // ! prevent deletion below } } - { - WsCtlReqQueue::Req req(PPSCMD_GETIMAGE); - STRNSCPY(req.P.NameTextUtf8, signature); - req.P.Oid = oid; - P_CmdQ->Push(req); + else { + p_te->SetAsUnresolved(); } } - else { - Texture_CachedFileEntity * p_cfe = new Texture_CachedFileEntity(); - if(p_cfe && p_cfe->Init(temp_buf)) { - if(p_cfe->Reload(true, &ImgRtb)) { - Cache_Texture.Put(p_cfe); // put program-entry img texture - p_cfe = 0; // ! prevent deletion below - } + { + WsCtlReqQueue::Req req(PPSCMD_GETIMAGE); + STRNSCPY(req.P.NameTextUtf8, signature); + req.P.Oid = oid; + P_CmdQ->Push(req); + } + } + else { + Texture_CachedFileEntity * p_cfe = new Texture_CachedFileEntity(); + if(p_cfe && p_cfe->Init(temp_buf)) { + if(p_cfe->Reload(true, &ImgRtb)) { + Cache_Texture.Put(p_cfe); // put img texture to the cache + p_cfe = 0; // ! prevent deletion below } - delete p_cfe; - // - p_te = Cache_Texture.Get(signature); } + delete p_cfe; + // + p_te = Cache_Texture.Get(signature); } } if(p_te) @@ -908,21 +910,21 @@ class WsCtl_ImGuiSceneBlock : public ImGuiSceneBase { DConnectionStatus conn_status; St.D_ConnStatus.GetData(conn_status); if(conn_status.Dbi.MainOrgID) { - void * p_texture = QueryImageTextureByOid(PPObjID(PPOBJ_PERSON, conn_status.Dbi.MainOrgID)); + void * p_texture = QueryImageTextureByOid(PPObjID(PPOBJ_PERSON, conn_status.Dbi.MainOrgID), 0); if(p_texture) { const float _x = ImGui::GetWindowWidth(); const float _y = ImGui::GetWindowHeight(); ImGui::Image(p_texture, ImVec2(_x, _y)); } } - else { + /*else { Texture_CachedFileEntity * p_logo_te = Cache_Texture.Get(GetFilePathS(fnLogo, true, SLS.AcquireRvlStr())); if(p_logo_te && p_logo_te->GetTexture()) { const float _x = ImGui::GetWindowWidth(); const float _y = ImGui::GetWindowHeight(); ImGui::Image(p_logo_te->GetTexture(), ImVec2(_x, _y)); } - } + }*/ } return result; } @@ -2743,12 +2745,14 @@ void WsCtl_ImGuiSceneBlock::EmitProgramGallery(ImGuiWindowByLayout & rW, SUiLayo if(p_pe_) { bool do_default_frame = true; // Случай когда нет картинки if(p_pe_->PicSymb.NotEmpty()) { + PPObjID oid(PPOBJ_SWPROGRAM, p_pe_->ID); + void * p_texture = QueryImageTextureByOid(oid, p_pe_->PicSymb); + /* Texture_CachedFileEntity * p_te = Cache_Texture.Get(p_pe_->PicSymb); // @v12.1.11 { if(false) { // Если поставить true, то картинки будут грузиться в real-time, но возникнет торможение :( if(!p_te || p_te->GetState() != Texture_CachedFileEntity::rstUnresolved) { if(!Cache_Texture.GetFileStorate().GetFilePath(p_pe_->PicSymb, temp_buf)) { - PPObjID oid(PPOBJ_SWPROGRAM, p_pe_->ID); const WsCtl_ImGuiSceneBlock::DImageLoading::Entry * p_il_entry = st_data.SearchOid(oid); if(p_il_entry && p_il_entry->Status == -1) { if(!p_te) { @@ -2763,12 +2767,12 @@ void WsCtl_ImGuiSceneBlock::EmitProgramGallery(ImGuiWindowByLayout & rW, SUiLayo p_te->SetAsUnresolved(); } } - /* Запрос отправлять здесь не станем (считаем пока, что все запрос отправлены при инициализации сеанса) - WsCtlReqQueue::Req req(PPSCMD_GETIMAGE); - STRNSCPY(req.P.NameTextUtf8, p_pe_->PicSymb); - req.P.Oid.Set(PPOBJ_SWPROGRAM, p_pe_->ID); - P_CmdQ->Push(req); - */ + // Запрос отправлять здесь не станем (считаем пока, что все запрос отправлены при инициализации сеанса) + //WsCtlReqQueue::Req req(PPSCMD_GETIMAGE); + //STRNSCPY(req.P.NameTextUtf8, p_pe_->PicSymb); + //req.P.Oid.Set(PPOBJ_SWPROGRAM, p_pe_->ID); + //P_CmdQ->Push(req); + // } else { Texture_CachedFileEntity * p_cfe = new Texture_CachedFileEntity(); @@ -2785,12 +2789,14 @@ void WsCtl_ImGuiSceneBlock::EmitProgramGallery(ImGuiWindowByLayout & rW, SUiLayo } } // } @v12.1.11 - if(p_te && p_te->GetTexture()) { + */ + //if(p_te && p_te->GetTexture()) { + if(p_texture) { if(p_pe_->Title.NotEmpty()) ImGui::Text(p_pe_->Title); const SPoint2F __s = p_lo_entry->GetFrame().GetSize(); ImVec2 sz(__s.x-4.0f, __s.y-16.0f); - ImGui::Image(p_te->GetTexture(), sz); + ImGui::Image(/*p_te->GetTexture()*/p_texture, sz); do_default_frame = false; } } @@ -2909,6 +2915,7 @@ int WsCtl_ImGuiSceneBlock::QueryProgramList2(WsCtl_ProgramCollection & rPgmL, Ws //THROW(WsCtlApp::GetLocalCachePath(cache_path)); { DConnectionStatus srv_conn_status; + // @debug St.D_ConnStatus.GetData(srv_conn_status); { THROW(cli.Connect(JsP.Server, JsP.Port)); if(JsP.DbSymb.NotEmpty() && JsP.User.NotEmpty()) { @@ -2971,6 +2978,10 @@ int WsCtl_ImGuiSceneBlock::QueryProgramList2(WsCtl_ProgramCollection & rPgmL, Ws void WsCtl_ImGuiSceneBlock::LoadProgramList2() { + //WsCtl_ClientPolicy policy_list; + //WsCtl_ProgramCollection pgm_list; + //bool policy_list_settled = false; + //bool pgm_list_settled = false; SString temp_buf; { bool do_resolve = false; @@ -2993,13 +3004,8 @@ void WsCtl_ImGuiSceneBlock::LoadProgramList2() PolicyL = _policy_l_from_cache; } if(r_srv & 0x01) { // WsCtl_ProgramCollection is loaded successfully - //if(!(r_cache & 0x01) || _pgm_l_from_server != _pgm_l_from_cache) { - PgmL = _pgm_l_from_server; - do_resolve = true; - //} - //else { - // PgmL = _pgm_l_from_cache; - //} + PgmL = _pgm_l_from_server; + do_resolve = true; } else if(r_cache & 0x01) { PgmL = _pgm_l_from_cache; @@ -3037,6 +3043,7 @@ void WsCtl_ImGuiSceneBlock::LoadProgramList2() } } } + PgmL.MakeCatList(); { SString pic_base_path; WsCtlApp::GetLocalCachePath(pic_base_path); @@ -3044,7 +3051,6 @@ void WsCtl_ImGuiSceneBlock::LoadProgramList2() SFile::CreateDir(pic_base_path); if(pathValid(pic_base_path, 1)) { SString file_path; - //SFileStorage fs(GetBlobStoragePathS()); for(uint i = 0; i < PgmL.getCount(); i++) { WsCtl_ProgramEntry * p_pe = PgmL.at(i); if(p_pe) { @@ -3070,7 +3076,6 @@ void WsCtl_ImGuiSceneBlock::LoadProgramList2() } } } - PgmL.MakeCatList(); } } diff --git a/Src/Rsrc/Dlg/f_goanlz.dlg b/Src/Rsrc/Dlg/f_goanlz.dlg index e114300b9782443f8e0af53eace9a60fa3ffad56..966d9a98bef3ac60b65e0e38e3d7578956e28d5b 100644 GIT binary patch delta 661 zcmccWvek2f468E3S4OkR@0mn5+cO1lvNJPqGiWn#Pp)T?+`OJUgGEM-ft`Vwfsp|W z6c~UkK?Xr)ATL0kZ?dt#bVkO>|3$^Q)ARFFiqnhoOAGiWzZEEDW@iwaJX1_=aLv5MxwDZ>9+_FfoXu zxWo|X61C>l>lQ9p{bucg_X>}nFMR}}moHeq;^7;GH47fBTKZ`H>ZL0mE)ZiNQsLx_ zELxN81?3Gv4rIpVKrvtdfC7P0o`HcqEi*MI#n57+zm}|sbBIr{t53X>r;m@DPe{CP zfP1JTP#qBD22Ji2um<~z8R9E-5}YJr05k$*D+oYsG@mRWqBq$~TyipxEH5kAs>zN* zlB_=%85vk7Gm6PGN={Z3D`W-vgmrQ!qt+zG7O?%SVEex-Ffy<(aAJfgheLirQFdlt zip=B<;*f}9!4(cNlNT|zg3V-s#*~}HFGjh|j*`+WjEa+EWs6xEfqHpCX<_qcSq?@4 gegQON*|Q02)6@-mD{n>FOMnVEzb02fKE*8l(j delta 305 zcmXYryH3ME5JhKqvwniT#)>w6$PcBnE80{PG>8Vl2hbon4Kk3VfG?mU(kP-%lRmO& zkoW~UiikEHAAq1@Z8F7ZMo0JRyqtU-&tp9Ula9bZ&l!+D_WcD@Ke|pxB)-Z8Z>fe$ zS>S#+T_TIncHcpQzT{i!Z`JIaLRVa(egA(amx$!0001is@*}R2i1?R{tRa z^j+C>uu)XQvmhn`UI+hF+tF3{OQL2OMLm+>TRPzs7-X$QbCDTDL|}8JeF{=-s>nQ# MN!mQ-C8GlV008|#Z2$lO diff --git a/Src/Rsrc/Str/ppstr2.symb b/Src/Rsrc/Str/ppstr2.symb index 3fc2fbd51e..14a1057e18 100644 --- a/Src/Rsrc/Str/ppstr2.symb +++ b/Src/Rsrc/Str/ppstr2.symb @@ -1,8 +1,8 @@ [common] LastAutoGrpCode=1001 -LastSignatureCode=2147494946 -LastAutoCodeList=1,12253;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,10356;125,10064 +LastSignatureCode=2147494949 +LastAutoCodeList=1,12253;102,10177;103,10072;110,10000;111,12122;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,10356;125,10064 [SignatureList] testsign1=2147483649 @@ -1229,6 +1229,7 @@ expense_pl=2147494932 total=2147484644 totals=2147484645 result=2147493730 +sellersincome=2147494947 fraction=2147484646 grouping=2147484647 opgrouping=2147484648 @@ -7966,6 +7967,7 @@ goodsopanlzfilt_accsheet=2147490651 goodsopanlzfilt_object=2147490652 goodsopanlzfilt_object2=2147490653 goodsopanlzfilt_objcity=2147490654 +goodsopanlzfilt_marketplacegua=2147494949 goodsopanlzfilt_suppl=2147490655 goodsopanlzfilt_agent=2147490656 goodsopanlzfilt_freightagent=2147490657 @@ -15899,6 +15901,7 @@ PPTXT_MP_PROCESSING_FINTRANSACTIONS=7286613 PPTXT_MP_PROCESSING_STOCK=7286617 PPTXT_MP_FINTRA_WB_REQ=7286614 PPTXT_MP_FINTRA_WB_REPEMPTY=7286615 +PPTXT_ORDERCANCELLED=7286618 PPSSYM_SYMB=7481105 PPSSYM_ACCSIDE=7481106 PPSSYM_CMDLINEOP=7481107 diff --git a/Src/Rsrc/Str/ppstr2.txt b/Src/Rsrc/Str/ppstr2.txt index 7c4d971ca0..a18d49dad2 100644 --- a/Src/Rsrc/Str/ppstr2.txt +++ b/Src/Rsrc/Str/ppstr2.txt @@ -5084,6 +5084,7 @@ PPTXT_MP_PROCESSING_FINTRANSACTIONS "Маркетплейс: обработка PPTXT_MP_PROCESSING_STOCK "Маркетплейс: обработка остатков" PPTXT_MP_FINTRA_WB_REQ "Запрос отчета о продажах по реализации за период %s" PPTXT_MP_FINTRA_WB_REPEMPTY "Сервер Wildberries вернул пустой результат" +PPTXT_ORDERCANCELLED "Заказ '%s' отменен" // // LastText @@ -7182,6 +7183,7 @@ IMPEXPCMD_DECLNORDER "DECLNORDER" @total "Итого" @totals "Итоги" @result "Результат" +@sellersincome "Доход продавца" // специализированное понятие, применяемое в анализе торговли на маркетплейсе @fraction "Доля" // Числовое выражение части чего-либо @grouping "Группировка" @opgrouping "Группировка операций" @@ -14306,6 +14308,7 @@ IMPEXPCMD_DECLNORDER "DECLNORDER" @goodsopanlzfilt_object "@{contractor}" @goodsopanlzfilt_object2 "@{bill_object2}" @goodsopanlzfilt_objcity "Город контрагента" +@goodsopanlzfilt_marketplacegua "Глобальная учетная запись маркетплейса" // @v12.1.12 @goodsopanlzfilt_suppl "@{supplier}" @goodsopanlzfilt_agent "@{agent}" @goodsopanlzfilt_freightagent "@{freightagent}" diff --git a/Src/Rsrc/Version/genver-open.dat b/Src/Rsrc/Version/genver-open.dat index 9bc2cabcd8..21131feeb5 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 =11 -AssemblyVer=40743 +AssemblyVer=40750 MinMajorVer =9 MinMinorVer =8 MinRevision =11 diff --git a/Src/Rsrc/dl600/ppexp.dl6 b/Src/Rsrc/dl600/ppexp.dl6 index 01b9b3e9a6..49c5ba63b3 100644 --- a/Src/Rsrc/dl600/ppexp.dl6 +++ b/Src/Rsrc/dl600/ppexp.dl6 @@ -2312,8 +2312,7 @@ data GoodsBillBase { link Goods GoodsID; // link Lot LotID; // string CLB[28]; // - string GoodsGrpName[64]; // - // . + string GoodsGrpName[64]; // ( ). double Cost; // double Price; // double Discount; //