Замена контрагента договора с обновлением связанных данных

Замена контрагента договора с обновлением связанных данных#

Используется для массовой корректировки контрагента по договору и связанным с ним данным. Скрипт заменяет контрагента договора на головного контрагента, добавляет стороны договора, обновляет связанные платежные документы, регистры, объекты баланса, оплаты, акты, счета-фактуры и проводки.

Место применения: Сервис > Инструменты > Выполнить JEXL-скрипт

Внимание

Требует адаптации под конкретный договор и структуру данных. Перед запуском укажите актуальный идентификатор договора в переменной idvCnt, проверьте стороны договора в вызовах Cnt_SideApi.findByMnemoCode(...) и убедитесь, что прямые SQL-обновления соответствуют задаче. Скрипт изменяет данные сразу в нескольких связанных объектах.

Тип: JEXL-скрипт

const idvCnt = 49740L;//id договора
const ropCnt = Cnt_ContractApi.load(idvCnt);
const ropContr = Bs_ContrasApi.load(parseId(ropCnt.gidOtherSettler));
if (isNull(ropContr.idCorporation)) {
  raise("Не найден головной контрагент");
}
const gidvOldSettler = ropCnt.gidOtherSettler;
const gidvNewSettler = Bs_ContrasApi.getGid(ropContr.idCorporation);
if (ropCnt.gidOtherSettler == gidvNewSettler) {
  raise("В договоре уже стоит головной контрагент");
}


var rop_Cnt_ContractSide1 = Cnt_ContractSideApi.insertByParent(ropCnt);
Cnt_ContractSideApi.setidSide(rop_Cnt_ContractSide1, Cnt_SideApi.findByMnemoCode("consignor")); //!!!подставить нужное!!!
Cnt_ContractSideApi.setgidSettler(rop_Cnt_ContractSide1, gidvOldSettler);
var rop_Cnt_ContractSide2 = Cnt_ContractSideApi.insertByParent(ropCnt);
Cnt_ContractSideApi.setidSide(rop_Cnt_ContractSide2, Cnt_SideApi.findByMnemoCode("receiver")); //!!!подставить нужное!!!
Cnt_ContractSideApi.setgidSettler(rop_Cnt_ContractSide2, gidvOldSettler);
session.flush();

tsql(`update Cnt_Contract c set gidOtherSettler = '`+gidvNewSettler+`' where c.id = `+idvCnt).execute();
tsql(`update Cnt_Contract c set gidOtherSettler = '`+gidvNewSettler+`' where c.idParentContract = `+idvCnt).execute();
//tsql(`update Cnt_ContractSide c set gidSettler = '`+gidvNewSettler+`' where c.bMain = 1 and c.idContract = `+idvCnt).execute();

var func = function() {
  var sQ0 = `
			select t.id
			from Cnt_ContractSide t
			where  t.bMain = 1 and t.idContract = `+idvCnt;
	var qq = sql(sQ0).asList();
	for (w: qq) {
	  const rop = Cnt_ContractSideApi.load(w.id);
	  Cnt_ContractSideApi.setgidSettler(rop, gidvNewSettler);
	}
}
Cnt_ContractApi.forDisabledTaxType(func);
 
//график платежей
tsql(`update Cnt_PaySchedule c set gidSettler = '`+gidvNewSettler+`' where c.idMainContract = `+idvCnt).execute();
//все ДПП
tsql(`update Pm_ExpectedPay c set gidSettler = '`+gidvNewSettler+`' where c.idContract = `+idvCnt).execute();
//все ЗнП
tsql(`update pm_payrequest c set gidSettlerPayFor = '`+gidvNewSettler+`' where c.idContract = `+idvCnt).execute();
tsql(`update Pm_PayRequestSumDistrJournal c set gidSettlerPayFor = '`+gidvNewSettler+`' where c.idContract = `+idvCnt).execute();
//все ПП
tsql(`update Pm_OrderBankOut c set gidSettlerPayFor = '`+gidvNewSettler+`' where c.idContract = `+idvCnt).execute();
//ПМ регистр
tsql(`update Pm_PayMoveReg c set gidSettler = '`+gidvNewSettler+`' where c.idContract = `+idvCnt).execute();
//Объекты баланса
tsql(`update Pm_BalObj c set gidSettler = '`+gidvNewSettler+`' where c.idContract = `+idvCnt).execute();
//ключи поисковые обновить
var sQ1 = `
select t.id
from Pm_BalObj t
where  t.idContract = `+idvCnt
;
var l1 = sql(sQ1).asList();
for (w: l1) {
  const rop = Pm_BalObjApi.load(w.id);
  Pm_BalObjApi.setsFindKey(rop, Pm_BalObjApi.gensFindKey(w.id));
}
flush();

tsql(`update Pm_PayMoveReg c set sFindKey = t.sFindKey from Pm_BalObj t where c.idBalObj = t.id and c.idContract = `+idvCnt).execute();
tsql(`update Pm_PayMoveReg c set sFindKeyFrom = t.sFindKey from Pm_BalObj t where c.idBalObjFrom = t.id and c.idContract = `+idvCnt).execute();

//оплаты
tsql(`update Pm_PayMove c set gidSettlerFrom = '`+gidvNewSettler+`' where c.idContractFrom = `+idvCnt).execute();
tsql(`update Pm_PayMove c set gidSettlerTo = '`+gidvNewSettler+`' where c.idContractTo = `+idvCnt).execute();

var sQ2 = `
select t.id
from Pm_PayMove t
where  t.idContractFrom = `+idvCnt+`
union
select t.id
from Pm_PayMove t
where  t.idContractTo = `+idvCnt
;
var l2 = sql(sQ2).asList();
for (w: l2) {
  const rop = Pm_PayMoveApi.load(w.id);
  Pm_PayMoveApi.refreshFindKeyFrom(rop);
  Pm_PayMoveApi.refreshFindKeyTo(rop);
}
flush();
//акты
tsql(`update Stm_ActIn c set gidSettler = '`+gidvNewSettler+`' where c.idContract = `+idvCnt).execute();
// с.ф.
tsql(`update Stm_InvBillDocIn c set gidSettler = '`+gidvNewSettler+`' from stm_actin a where c.id = a.idInvBillDocIn and a.idContract = `+idvCnt).execute();
tsql(`update Stm_BookInclSetting c set gidSettler = a.gidSettler from Stm_InvBillDocIn a where c.gidDoc = a.gid and a.gidSettler = '`+gidvNewSettler+`'`).execute();
//проводки
var sQ3 = `
select distinct t.idtrans id
from act_transreg t
where  t.idContract = `+idvCnt+`
and    t.gidSettler = '`+gidvOldSettler+`' 
and    t.bCredit = 1
`;
var l3 = sql(sQ3).asList();

for (w: l3) {
  const rop = Act_TransApi.load(w.id);
  Act_TransApi.setAttrCr(rop,"gidSettlerBranch",gidvOldSettler);
  Act_TransApi.setAttrCr(rop,"gidSettler",gidvNewSettler);
}
flush();
var sQ4 = `
select distinct t.idtrans id
from act_transreg t
where  t.idContract = `+idvCnt+`
and    t.gidSettler = '`+gidvOldSettler+`' 
and    t.bCredit = 0
`;
var l4 = sql(sQ4).asList();

for (w: l4) {
  const rop = Act_TransApi.load(w.id);
  Act_TransApi.setAttrDeb(rop,"gidSettlerBranch",gidvOldSettler);
  Act_TransApi.setAttrDeb(rop,"gidSettler",gidvNewSettler);
}
commit();