#include "declarations.h"
#include "dll/gcomp.h"
#include "commonfunctions.h"
#include "storage.h"
#include "mms_filter.h"
#include "nametable.h"
#include "ordering.h"
#include "mms_buh.h"
#include "mms.h"
///////////////////////////////////////////////////////////////////////
/////////// class CMMSAccount methods ///////////////////////////////
///////////////////////////////////////////////////////////////////////
CAccountSubconto* CAccountSubconto::DefVal = new CAccountSubconto;
CObjectProperty CAccountSubconto::Props[] = {
{_U("ID"), 0, CObjectProperty::t_int, VAR_OFFSET(DefVal, ID)},
{_U("Идентификатор"), 1, CObjectProperty::t_string, VAR_OFFSET(DefVal, sID)},
{_U("Комментарий"), 2, CObjectProperty::t_string, VAR_OFFSET(DefVal, Comment)},
{_U("Синоним"), 3, CObjectProperty::t_string, VAR_OFFSET(DefVal, Synonym)},
{_U("Тип"), 4, CObjectProperty::t_subobject, VAR_OFFSET(DefVal, Type)},
{_U("Param9"), 8, CObjectProperty::t_prop, VAR_OFFSET(DefVal, Param9)},
{_U("Param10"), 9, CObjectProperty::t_prop, VAR_OFFSET(DefVal, Param10)},
{_U("Вид субконто"), 10, CObjectProperty::t_prop, VAR_OFFSET(DefVal, SbKind)},
{_U("Только обороты"), 11, CObjectProperty::t_prop, VAR_OFFSET(DefVal, OnlyMovement)},
{_U("Учёт по сумме"), 12, CObjectProperty::t_prop, VAR_OFFSET(DefVal, BySum)},
{_U("Учёт по валютной сумме"), 13, CObjectProperty::t_prop, VAR_OFFSET(DefVal, ByCurrencySum)},
{_U("Учёт по количеству"), 14, CObjectProperty::t_prop, VAR_OFFSET(DefVal, ByAmount)},
{wxEmptyString, -1, CObjectProperty::t_int}
};
CPropertySet CAccountSubconto::PropSet(Props, DefVal);
void CAccountSubconto::BeautyString(CBeautyString& String, int level)
{
CMMSObjectAttribute::BeautyString(String, level, false);
}
//--------------------------------------------------------------
CMMSAccount* CMMSAccount::DefVal = new CMMSAccount;
CObjectProperty CMMSAccount::Props[] = {
{_U("ID"), 0, CObjectProperty::t_int, VAR_OFFSET(DefVal, ID)},
{_U("Код"), 4, CObjectProperty::t_string, VAR_OFFSET(DefVal, Code)},
{_U("Идентификатор"), 1, CObjectProperty::t_string, VAR_OFFSET(DefVal, sID)},
{_U("Наименование"), 2, CObjectProperty::t_string, VAR_OFFSET(DefVal, Name)},
{_U("Param2"), 3, CObjectProperty::t_string, VAR_OFFSET(DefVal, Param2)},
{_U("Валютный"), 5, CObjectProperty::t_prop, VAR_OFFSET(DefVal, IsCurrency)},
{_U("Количественный"), 6, CObjectProperty::t_prop, VAR_OFFSET(DefVal, IsAmount)},
{_U("Забалансовый"), 7, CObjectProperty::t_prop, VAR_OFFSET(DefVal, IsSingle)},
{_U("Это группа"), 8, CObjectProperty::t_prop, VAR_OFFSET(DefVal, IsGroup)},
{_U("Активный"), 9, CObjectProperty::t_prop, VAR_OFFSET(DefVal, IsActive)},
{_U("Субконто"), 10, CObjectProperty::t_object, VAR_OFFSET(DefVal, SubcontoList)},
{wxEmptyString, -1, CObjectProperty::t_int}
};
CPropertySet CMMSAccount::PropSet(Props, DefVal);
static CStoredSet::TSetPair Account_IsActive[] = {
{1, _U("Активный")},
{2, _U("Пассивный")},
{3, _U("Активно-пассивный")},
{0, wxEmptyString}
};
CMMSAccount::CMMSAccount()
{
MMS_Type = MMS_Account;
ID_Type = IDT_BothIDs;
IsActive = 0;
IsActive.SetTable(Account_IsActive);
ToDestroyChildren = false;
}
void CMMSAccount::BeautyString(CBeautyString& String, int level)
{
String.add_parameter(level, Code, _U(""), _U(""), true);
String.add_brace(level, '{');
CPropertySet* pPropSet = GetPropSet();
if( pPropSet != NULL )
{
for( int i = 2; i < pPropSet->nProps; i++ ) //пропускаем ID и Code
pPropSet->BeautyString(String, level+1, this, i);
}
String.add_brace(level, '}');
}
void CMMSAccount::SetIDs(const wxString& Name, const wxString& Value)
{
Code = Name;
ID = wxAtoi(Value);
}
///////////////////////////////////////////////////////////////////////
/////////// class CMMSAccountPlan methods ///////////////////////////
///////////////////////////////////////////////////////////////////////
CMMSAccountPlan* CMMSAccountPlan::DefVal = new CMMSAccountPlan;
CObjectProperty CMMSAccountPlan::Props[] = {
{_U("ID"), 0, CObjectProperty::t_int, VAR_OFFSET(DefVal, ID)},
{_U("Идентификатор"), 1, CObjectProperty::t_string, VAR_OFFSET(DefVal, sID)},
{_U("Комментарий"), 2, CObjectProperty::t_string, VAR_OFFSET(DefVal, Comment)},
{_U("Синоним"), 3, CObjectProperty::t_string, VAR_OFFSET(DefVal, Synonym)},
{_U("Маска счёта 1"), 4, CObjectProperty::t_string, VAR_OFFSET(DefVal, AccountMask1)},
{_U("Маска счёта"), 5, CObjectProperty::t_string, VAR_OFFSET(DefVal, AccountMask2)},
{_U("Accounts"), 6, CObjectProperty::t_object, VAR_OFFSET(DefVal, Accounts)},
{_U("MigrationRules"), 7, CObjectProperty::t_object, VAR_OFFSET(DefVal, Migration)},
{wxEmptyString, -1, CObjectProperty::t_int}
};
CPropertySet CMMSAccountPlan::PropSet(Props, DefVal);
CMMSObject* CMMSAccountPlan::CreateChild(const wxString& Name, int MMS_Index)
{
if( !Name.IsNull() )
{
if( wxStrcoll(Name, Accounts.BeautyName()) == 0 )
return &Accounts;
if( wxStrcoll(Name, Migration.BeautyName()) == 0 )
return &Migration;
}
if( AccMaskAmount == 0 )
{
if( MMS_Index == 5 )
AccMaskAmount = 1;
else
AccMaskAmount = 2;
}
if( AccMaskAmount == 1 )
{
switch( MMS_Index )
{
case 5: return &Accounts;
case 6: return &Migration;
}
}
else
{
switch( MMS_Index )
{
case 6: return &Accounts;
case 7: return &Migration;
}
}
return NULL;
}
CMMSAccountPlan::CMMSAccountPlan()
{
MMS_Type = MMS_Plan;
ID_Type = IDT_BothIDs;
AccMaskAmount = 0;
ToDestroyChildren = false;
}
void CMMSAccountPlan::BeautyString(CBeautyString& String, int level)
{
if( AccountMask2.IsEmpty() ) AccountMask2 = AccountMask1;
CPropertySet* pPropSet = GetPropSet();
String.add_parameter(level, sID, _U(""), _U(""), true);
String.add_brace(level, '{');
CPropertySet& PropSet = *pPropSet;
for( int i = 2; i < PropSet.nProps; i++ )
{
CObjectProperty& Prop = PropSet[i];
if( TaskParameters.CompoundType != external_report && Prop.MMS_Index == 6 )
continue; //не выводим счета, если это МДшник - они будут в отдельном каталоге
else if( Prop.MMS_Index == 4 )
continue; //Пока у нас ММС приводится к формату 10009 будем насильно оставлять первую маску пустой
PropSet.BeautyString(String, level+1, this, i);
}
String.add_brace(level, '}');
}
void CMMSAccountPlan::ToString(CMMSString& String)
{
if( AccountMask2.IsEmpty() ) AccountMask2 = AccountMask1;
String += _U("\r\n{");
CPropertySet& PropSet = *GetPropSet();
bool AddComma = false;
for( int MMS_Index = 0; MMS_Index <= PropSet.MaxMMS_Index; MMS_Index++ )
{
int i = PropSet.FindByMMSIndex(MMS_Index);
if( i >= 0 )
{
if( PropSet[i].MMS_Index == 4 )
continue; //Пока у нас ММС приводится к формату 10009 будем насильно оставлять первую маску пустой
PropSet.ToString(String, this, i, AddComma);
AddComma = true;
}
}
String += _U("}");
}
///////////////////////////////////////////////////////////////////////
/////////// class CMMSAccountPlans methods ///////////////////////////
///////////////////////////////////////////////////////////////////////
CMMSAccountPlanList::CMMSAccountPlanList()
{
MMS_Type = MMS_Plans;
}
//-------------------------------------------------------------------------
CMMSBuhSbKindRepr* CMMSBuhSbKindRepr::DefVal = new CMMSBuhSbKindRepr;
CObjectProperty CMMSBuhSbKindRepr::Props[] = {
{_U("Поле"), 0, CObjectProperty::t_prop, VAR_OFFSET(DefVal, Field)},
{_U("Заголовок"), 1, CObjectProperty::t_quotstring, VAR_OFFSET(DefVal, Name)},
{_U("С новой строки"), 2, CObjectProperty::t_prop, VAR_OFFSET(DefVal, FromNewLine)},
{wxEmptyString, -1, CObjectProperty::t_int}
};
CPropertySet CMMSBuhSbKindRepr::PropSet(Props, DefVal);
void CMMSBuhSbKindReprList::ToString(CMMSString& String)
{
String += _U("\r\n{");
int n = GetNChildren();
for( int i = 0; i < n; i++ )
{
CMMSObject* attr = GetChild(i);
if( i > 0 )
String += _U(",");
attr->ToString(String);
}
String += _U("}");
}
CMMSBuhSbKind* CMMSBuhSbKind::DefVal = new CMMSBuhSbKind;
CObjectProperty CMMSBuhSbKind::Props[] = {
{_U("ID"), 0, CObjectProperty::t_int, VAR_OFFSET(DefVal, ID)},
{_U("Идентификатор"), 1, CObjectProperty::t_string, VAR_OFFSET(DefVal, sID)},
{_U("Комментарий"), 2, CObjectProperty::t_quotstring, VAR_OFFSET(DefVal, Comment)},
{_U("Синоним"), 3, CObjectProperty::t_quotstring, VAR_OFFSET(DefVal, Synonym)},
{_U("Тип"), 4, CObjectProperty::t_subobject, VAR_OFFSET(DefVal, Type)},
{_U("Разделять триады"), 8, CObjectProperty::t_prop, VAR_OFFSET(DefVal, DivideTriades)},
{_U("Неотрицательный"), 9, CObjectProperty::t_prop, VAR_OFFSET(DefVal, NonNegative)},
{_U("Отбор"), 10, CObjectProperty::t_prop, VAR_OFFSET(DefVal, Selection)},
{_U("Цена"), 11, CObjectProperty::t_prop, VAR_OFFSET(DefVal, Price)},
{_U("Валютная цена"), 12, CObjectProperty::t_prop, VAR_OFFSET(DefVal, CurrencyPrice)},
{_U("Представление"), 13, CObjectProperty::t_object, VAR_OFFSET(DefVal, Representation)},
{_U("Быстрый выбор"), 14, CObjectProperty::t_prop, VAR_OFFSET(DefVal, FastSelection)},
{_U("Ввод пустых субконто"), 15, CObjectProperty::t_prop, VAR_OFFSET(DefVal, AllowEmpty)},
{wxEmptyString, -1, CObjectProperty::t_int}
};
CPropertySet CMMSBuhSbKind::PropSet(Props, DefVal);
CMMSObject* CMMSBuhSbKind::CreateChild(const wxString& Name, int MMS_Index)
{
if( Name.IsNull() )
{
if( wxStrcoll(Name, Representation.BeautyName()) == 0 )
return &Representation;
}
switch( MMS_Index )
{
case 13: return &Representation;
//case 14: return &FastSelection;
//case 15: return &AllowEmpty;
}
return NULL;
}
//-------------------------------------------------------------------------
CMMSTypOper* CMMSTypOper::DefVal = new CMMSTypOper;
CObjectProperty CMMSTypOper::Props[] = {
{_U("ID"), 0, CObjectProperty::t_int, VAR_OFFSET(DefVal, ID)},
{_U("sID"), 1, CObjectProperty::t_string, VAR_OFFSET(DefVal, sID)},
{_U("Комментарий"), 2, CObjectProperty::t_quotstring, VAR_OFFSET(DefVal, Comment)},
{_U("Синоним"), 3, CObjectProperty::t_quotstring, VAR_OFFSET(DefVal, Synonym)},
{_U("Правила миграции"), 4, CObjectProperty::t_object, VAR_OFFSET(DefVal, MigrationRules)},
{wxEmptyString, -1, CObjectProperty::t_int}
};
CPropertySet CMMSTypOper::PropSet(Props, DefVal);
void CMMSTypOper::BeautyString(CBeautyString& String, int level)
{
String.add_brace(level, '{');
CMMSSynonymedObject::BeautyString(String, level + 1);
String.add_brace(level, '}');
}
void CMMSTypOperList::ToString(CMMSString& String)
{
if( GetNChildren() == 0 )
AddChild(CreateChild(wxEmptyString, -1));
CMMSAttributes::ToString(String);
}
void CMMSCorrProvsDefList::ToString(CMMSString& String)
{
if( GetNChildren() == 0 )
AddChild(CreateChild(wxEmptyString, -1));
CMMSAttributes::ToString(String);
}
void CMMSProvHardFldDefList::ToString(CMMSString& String)
{
while( GetNChildren() < 2 )
AddChild(CreateChild(wxEmptyString, -1));
CMMSAttributes::ToString(String);
}
//-------------------------------------------------------------------------
CMMSTypedField* CMMSTypedField::DefVal = new CMMSTypedField;
CObjectProperty CMMSTypedField::Props[] = {
{_U("ID"), 0, CObjectProperty::t_int, VAR_OFFSET(DefVal, ID)},
{_U("Идентификатор"), 1, CObjectProperty::t_string, VAR_OFFSET(DefVal, sID)},
{_U("Комментарий"), 2, CObjectProperty::t_quotstring, VAR_OFFSET(DefVal, Comment)},
{_U("Синоним"), 3, CObjectProperty::t_quotstring, VAR_OFFSET(DefVal, Synonym)},
{_U("Тип"), 4, CObjectProperty::t_subobject, VAR_OFFSET(DefVal, Type)},
{_U("Неотрицательный"), 8, CObjectProperty::t_prop, VAR_OFFSET(DefVal, NonNegative)},
{_U("Разделять триады"), 9, CObjectProperty::t_prop, VAR_OFFSET(DefVal, DivideTriades)},
{_U("Отбор"), 10, CObjectProperty::t_prop, VAR_OFFSET(DefVal, Selection)},
{_U("Периодический"), 11, CObjectProperty::t_prop, VAR_OFFSET(DefVal, Periodical)},
{wxEmptyString, -1, CObjectProperty::t_int}
};
CPropertySet CMMSTypedField::PropSet(Props, DefVal);
//-------------------------------------------------------------------------
CMMSTypedDocField* CMMSTypedDocField::DefVal = new CMMSTypedDocField;
CObjectProperty CMMSTypedDocField::Props[] = {
{_U("ID"), 0, CObjectProperty::t_int, VAR_OFFSET(DefVal, ID)},
{_U("Идентификатор"), 1, CObjectProperty::t_string, VAR_OFFSET(DefVal, sID)},
{_U("Комментарий"), 2, CObjectProperty::t_quotstring, VAR_OFFSET(DefVal, Comment)},
{_U("Синоним"), 3, CObjectProperty::t_quotstring, VAR_OFFSET(DefVal, Synonym)},
{_U("Тип"), 4, CObjectProperty::t_subobject, VAR_OFFSET(DefVal, Type)},
{_U("Разделять триады"), 8, CObjectProperty::t_prop, VAR_OFFSET(DefVal, DivideTriades)},
{_U("Неотрицательный"), 9, CObjectProperty::t_prop, VAR_OFFSET(DefVal, NonNegative)},
{_U("Отбор"), 10, CObjectProperty::t_prop, VAR_OFFSET(DefVal, Selection)},
{wxEmptyString, -1, CObjectProperty::t_int}
};
CPropertySet CMMSTypedDocField::PropSet(Props, DefVal);
///////////////////////////////////////////////////////////////////////
/////////// class CMMSOperJournalList methods ///////////////////////
///////////////////////////////////////////////////////////////////////
void CMMSOperJournalList::ToString(CMMSString& String)
{
if( GetNChildren() == 0 )
AddChild(CreateChild(wxEmptyString, -1));
CMMSAttributes::ToString(String);
}
///////////////////////////////////////////////////////////////////////
/////////// class CMMSBuh methods ///////////////////////////////////
///////////////////////////////////////////////////////////////////////
CMMSBuh* CMMSBuh::DefVal = new CMMSBuh;
CObjectProperty CMMSBuh::Props[] = {
{_U("ID"), 0, CObjectProperty::t_int, VAR_OFFSET(DefVal, ID)},
{_U("Идентификатор"), 1, CObjectProperty::t_string, VAR_OFFSET(DefVal, sID)},
{_U("Комментарий"), 2, CObjectProperty::t_string, VAR_OFFSET(DefVal, Comment)},
{_U("Синоним"), 3, CObjectProperty::t_string, VAR_OFFSET(DefVal, Synonym)},
{_U("Редактировать"), 4, CObjectProperty::t_prop, VAR_OFFSET(DefVal, EditWay)},
{_U("Форма для выбора"), 5, CObjectProperty::t_prop, VAR_OFFSET(DefVal, ChoosingListForm)},
{_U("Основная форма"), 6, CObjectProperty::t_prop, VAR_OFFSET(DefVal, MainListForm)},
{_U("Длина наименования счета"), 7, CObjectProperty::t_int, VAR_OFFSET(DefVal, AccountNameLen)},
{_U("Длина кода счета"), 8, CObjectProperty::t_int, VAR_OFFSET(DefVal, AccountCodeLen)},
{_U("Максимальное количествово субконто"), 9, CObjectProperty::t_int, VAR_OFFSET(DefVal, MaxSubcontoNum)},
{_U("Длина содержания операции"), 10, CObjectProperty::t_int, VAR_OFFSET(DefVal, OperCommentLen)},
{_U("Длина суммы операции"), 11, CObjectProperty::t_int, VAR_OFFSET(DefVal, OperSumLen)},
{_U("Точность суммы операции"), 12, CObjectProperty::t_int, VAR_OFFSET(DefVal, OperSumPrec)},
{_U("Длина суммы проводки"), 13, CObjectProperty::t_int, VAR_OFFSET(DefVal, EntrySumLen)},
{_U("Точность суммы проводки"), 14, CObjectProperty::t_int, VAR_OFFSET(DefVal, EntrySumPrec)},
{_U("Длина валютной суммы проводки"), 15, CObjectProperty::t_int, VAR_OFFSET(DefVal, EntryCurrencySumLen)},
{_U("Точность валютной суммы проводки"), 16, CObjectProperty::t_int, VAR_OFFSET(DefVal, EntryCurrencySumPrec)},
{_U("Длина количества проводки"), 17, CObjectProperty::t_int, VAR_OFFSET(DefVal, EntryAmountLen)},
{_U("Точность количества проводки"), 18, CObjectProperty::t_int, VAR_OFFSET(DefVal, EntryAmountPrec)},
{_U("Param20"), 19, CObjectProperty::t_int, VAR_OFFSET(DefVal, Param20)},
{_U("Param21"), 20, CObjectProperty::t_int, VAR_OFFSET(DefVal, Param21)},
{_U("Param22"), 21, CObjectProperty::t_int, VAR_OFFSET(DefVal, Param22)},
{_U("Param23"), 22, CObjectProperty::t_int, VAR_OFFSET(DefVal, Param23)},
{_U("Справочник валют"), 23, CObjectProperty::t_prop, VAR_OFFSET(DefVal, Currency_Subconto)},
{_U("Реквизит курс"), 24, CObjectProperty::t_prop, VAR_OFFSET(DefVal, Currency_Rate)},
{_U("Param26"), 25, CObjectProperty::t_string, VAR_OFFSET(DefVal, Param26)},
{_U("Отбор по сумме операции"), 26, CObjectProperty::t_prop, VAR_OFFSET(DefVal, SelectByOperSum)},
{_U("Отбор по содержанию операции"), 27, CObjectProperty::t_prop, VAR_OFFSET(DefVal, SelectByOperComment)},
{_U("Расчет суммы операции"), 28, CObjectProperty::t_prop, VAR_OFFSET(DefVal, CalcOperSum)},
{_U("Разрешить отбор проводок"), 29, CObjectProperty::t_prop, VAR_OFFSET(DefVal, EnableEntrySelect)},
{_U("Количество уровней для отбора проводок"), 30, CObjectProperty::t_int, VAR_OFFSET(DefVal, LevelAmountForSelection)},
{_U("Разделять триады сумма операции"), 31, CObjectProperty::t_prop, VAR_OFFSET(DefVal, OperSum_DivideTriades)},
{_U("Разделять триады сумма проводки"), 32, CObjectProperty::t_prop, VAR_OFFSET(DefVal, EntrySum_DivideTriades)},
{_U("Разделять триады валютной суммы проводки"), 33, CObjectProperty::t_prop, VAR_OFFSET(DefVal, EntryCurrSum_DivideTriades)},
{_U("Разделять триады количества проводки"), 34, CObjectProperty::t_prop, VAR_OFFSET(DefVal, EntryAmount_DivideTriades)},
{_U("Отбор по сумме проводки"), 35, CObjectProperty::t_prop, VAR_OFFSET(DefVal, SelectByEntrySum)},
{_U("Отбор по валюте проводки"), 36, CObjectProperty::t_prop, VAR_OFFSET(DefVal, SelectByEntryCurr)},
{_U("Отбор по валютной сумме проводки"), 37, CObjectProperty::t_prop, VAR_OFFSET(DefVal, SelectByEntryCurrSum)},
{_U("Отбор по количеству проводки"), 38, CObjectProperty::t_prop, VAR_OFFSET(DefVal, SelectByEntryAmount)},
{_U("Кратность"), 39, CObjectProperty::t_prop, VAR_OFFSET(DefVal, Currency_Multiple)},
{_U("Сложные проводки"), 40, CObjectProperty::t_prop, VAR_OFFSET(DefVal, EnableComplexEntries)},
{_U("Выбор режима расчета суммы"), 41, CObjectProperty::t_prop, VAR_OFFSET(DefVal, ToChooseCalcSumMode)},
{_U("Отбор проводок по Дебету/Кредиту"), 42, CObjectProperty::t_prop, VAR_OFFSET(DefVal, SelectEntryByDebCred)},
{_U("Редактировать операций документов"), 43, CObjectProperty::t_prop, VAR_OFFSET(DefVal, DocOperEditMode)},
{_U("Отбор по планам счетов проводки"), 44, CObjectProperty::t_prop, VAR_OFFSET(DefVal, SelectByEntryPlan)},
{_U("Количичественный учет только по аналитике"), 45, CObjectProperty::t_prop, VAR_OFFSET(DefVal, AmountOnlyByAnalytics)},
{_U("Разделитель учета"), 46, CObjectProperty::t_prop, VAR_OFFSET(DefVal, AccountingDividor)},
{_U("Основной план счетов"), 47, CObjectProperty::t_prop, VAR_OFFSET(DefVal, MainAccPlan)},
{_U("Param49"), 48, CObjectProperty::t_string, VAR_OFFSET(DefVal, Param49)},
{_U("Представление чего-то"), 49, CObjectProperty::t_object, VAR_OFFSET(DefVal, Param50)},
{_U("Param51"), 50, CObjectProperty::t_int, VAR_OFFSET(DefVal, Param51)},
{_U("Param52"), 51, CObjectProperty::t_int, VAR_OFFSET(DefVal, Param52)},
{_U("ProvHardFldDefs"), 62, CObjectProperty::t_object, VAR_OFFSET(DefVal, ProvHardFldDefs)},
{_U("EntryFields"), 54, CObjectProperty::t_object, VAR_OFFSET(DefVal, EntryFields)},
{_U("OperFields"), 55, CObjectProperty::t_object, VAR_OFFSET(DefVal, OperFields)},
{_U("AccListForms"), 56, CObjectProperty::t_object, VAR_OFFSET(DefVal, AccListForms)},
{_U("UnknownListForms"), 57, CObjectProperty::t_object, VAR_OFFSET(DefVal, UnknownListForms)},
{_U("ProvListForms"), 58, CObjectProperty::t_object, VAR_OFFSET(DefVal, ProvListForms)},
{_U("SbKinds"), 59, CObjectProperty::t_object, VAR_OFFSET(DefVal, SbKinds)},
{_U("AccountFields"), 52, CObjectProperty::t_object, VAR_OFFSET(DefVal, AccountFields)},
{_U("AccountPlans"), 53, CObjectProperty::t_object, VAR_OFFSET(DefVal, AccountPlans)},
{_U("TypOpers"), 60, CObjectProperty::t_object, VAR_OFFSET(DefVal, TypOpers)},
{_U("CorrProvsDefs"), 61, CObjectProperty::t_object, VAR_OFFSET(DefVal, CorrProvsDefs)},
{_U("OperJournal"), 63, CObjectProperty::t_object, VAR_OFFSET(DefVal, OperJournal)},
{wxEmptyString, -1, CObjectProperty::t_int}
};
CPropertySet CMMSBuh::PropSet(Props, DefVal);
static CStoredSet::TSetPair Buh_EditWay[] = {
{0, _U("В списке")},
{1, _U("В диалоге")},
{2, _U("Обоими способами")},
{0, wxEmptyString}
};
static CStoredSet::TSetPair Buh_CalcOperSum[] = {
{1, _U("По всем проводкам")},
{2, _U("По всем проводкам в валютной сумме")},
{3, _U("По первой проводке")},
{4, _U("По первой проводке в валютной сумме")},
{0, wxEmptyString}
};
static CStoredSet::TSetPair Buh_DocOperEditMode[] = {
{0, _U("Разрешить")},
{1, _U("Запретить")},
{2, _U("Выборочно")},
{0, wxEmptyString}
};
CMMSBuh::CMMSBuh()
{
MMS_Type = MMS_Buh;
EditWay = 0;
AccountNameLen = 0; //8. Длина наименования счета
AccountCodeLen = 0; //9. Длина кода счета
MaxSubcontoNum = 0; //10. Максимальное количествово субконто
OperCommentLen = 0; //11. Длина содержания операции
OperSumLen = 0; //12. Длина суммы операции
OperSumPrec = 0; //13. Точность суммы операции
EntrySumLen = 0; //14. Длина суммы проводки
EntrySumPrec = 0; //15. Точность суммы проводки
EntryCurrencySumLen = 0; //16. Длина валютной суммы проводки
EntryCurrencySumPrec = 0; //17. Точность валютной суммы проводки
EntryAmountLen = 0; //18. Длина количества проводки
EntryAmountPrec = 0; //19. Точность количества проводки
Param20 = 0;
Param21 = 0;
Param22 = 0;
Param23 = 0;
LevelAmountForSelection = 0;
Param51 = 0;
Param52 = 0;
EditWay.SetTable(Buh_EditWay);
CalcOperSum.SetTable(Buh_CalcOperSum);
DocOperEditMode.SetTable(Buh_DocOperEditMode);
ToDestroyChildren = false;
CMMSObjectAttribute::AddChild(&Param50);
CMMSObjectAttribute::AddChild(&AccountFields);
CMMSObjectAttribute::AddChild(&AccountPlans);
CMMSObjectAttribute::AddChild(&EntryFields);
CMMSObjectAttribute::AddChild(&OperFields);
CMMSObjectAttribute::AddChild(&AccListForms);
CMMSObjectAttribute::AddChild(&UnknownListForms);
CMMSObjectAttribute::AddChild(&ProvListForms);
CMMSObjectAttribute::AddChild(&SbKinds);
CMMSObjectAttribute::AddChild(&TypOpers);
CMMSObjectAttribute::AddChild(&CorrProvsDefs);
CMMSObjectAttribute::AddChild(&ProvHardFldDefs);
CMMSObjectAttribute::AddChild(&OperJournal);
}
CMMSObject* CMMSBuh::CreateChild(const wxString& Name, int MMS_Index)
{
switch( MMS_Index )
{
case 49: return &Param50;
case 52: return &AccountFields;
case 53: return &AccountPlans;
case 54: return &EntryFields;
case 55: return &OperFields;
case 56: return &AccListForms;
case 57: return &UnknownListForms;
case 58: return &ProvListForms;
case 59: return &SbKinds;
case 60: return &TypOpers;
case 61: return &CorrProvsDefs;
case 62: return &ProvHardFldDefs;
case 63: return &OperJournal;
}
return NULL;
}
CMMSObject* CMMSBuh::CreateChild(const wxString& Name, const wxString& Value)
{
if( wxStrcoll(Name, Param50.BeautyName()) == 0 )
return &Param50;
if( wxStrcoll(Name, AccountFields.BeautyName()) == 0 )
return &AccountFields;
if( wxStrcoll(Name, AccountPlans.BeautyName()) == 0 )
return &AccountPlans;
if( wxStrcoll(Name, EntryFields.BeautyName()) == 0 )
return &EntryFields;
if( wxStrcoll(Name, OperFields.BeautyName()) == 0 )
return &OperFields;
if( wxStrcoll(Name, SbKinds.BeautyName()) == 0 )
return &SbKinds;
if( wxStrcoll(Name, TypOpers.BeautyName()) == 0 )
return &TypOpers;
if( wxStrcoll(Name, CorrProvsDefs.BeautyName()) == 0 )
return &CorrProvsDefs;
if( wxStrcoll(Name, ProvHardFldDefs.BeautyName()) == 0 )
return &ProvHardFldDefs;
if( wxStrcoll(Name, AccListForms.BeautyName()) == 0 )
return &AccListForms;
if( wxStrcoll(Name, UnknownListForms.BeautyName()) == 0 )
return &UnknownListForms;
if( wxStrcoll(Name, ProvListForms.BeautyName()) == 0 )
return &ProvListForms;
if( wxStrcoll(Name, OperJournal.BeautyName()) == 0 )
return &OperJournal;
return NULL;
}
void CMMSBuh::BeautyString(CBeautyString& String, int level)
{
String.add_parameter(level, BeautyName(), _U(""), _U(""), true);
String.add_brace(level, '{');
CPropertySet& PropSet = *GetPropSet();
for( int i = 1; i < PropSet.nProps; i++ )
{
CObjectProperty& Prop = PropSet[i];
bool ToAdd = true;
if( TaskParameters.CompoundType != external_report )
{
switch( Prop.MMS_Index )
{
case 53:
case 56:
case 57:
case 58:
ToAdd = false;
break;
}
}
if( ToAdd )
PropSet.BeautyString(String, level+1, this, i);
}
String.add_brace(level, '}');
}
void CMMSBuh::ToString(CMMSString& String)
{
//вернём идентификаторы на место
sID = _U("");
AccListForms.sID = _U("Form");
ProvListForms.sID = _U("Form");
UnknownListForms.sID = _U("Form");
CMMSObject::ToString(String);
}
CMMSBuhContainer::CMMSBuhContainer()
{
MMS_Type = MMS_BuhContainer;
ToDestroyChildren = false;
CMMSAttributes::AddChild(&Buh);
}
///////////////////////////////////////////////////////////////////////
/////////// class CMMSBuh methods ///////////////////////////////////
///////////////////////////////////////////////////////////////////////
void CMMSBuh::ExtractForm(wxString& Dir, CStorage& Storage,
MMSObjectType StorType, MMSObjectType Type)
{
CNameTableRecord* nt_rec_stor = NameTable.Find(StorType);
if( Storage.Open(nt_rec_stor->PrepareStorageName(ID)) )
{
CNameTableRecord* nt_rec = NameTable.Find(Type);
if( Storage.Open(nt_rec->PrepareStorageName(ID)) )
{
wxString DestDir;
DestDir = nt_rec->PrepareDirName( nt_rec_stor->PrepareDirName(Dir) );
wxMkdir(DestDir);
ExtractWorkBook(DestDir, Storage, NULL);
Storage.Close();
}
Storage.Close();
}
}
void CMMSBuh::ImportForm(CStorage& Storage, wxString& SrcDir,
MMSObjectType StorType, MMSObjectType Type)
{
CNameTableRecord* nt_rec_stor = NameTable.Find(StorType);
if( !Storage.Create(nt_rec_stor->PrepareStorageName(ID)) ) return;
wxString FormDir = nt_rec_stor->PrepareDirName(SrcDir);
CNameTableRecord* nt_rec = NameTable.Find(Type);
CStorage FormStor(Storage);
FormStor.Create(nt_rec->PrepareStorageName(ID));
if( !ImportWorkBook(FormStor, nt_rec->PrepareDirName(FormDir)) )
{
FormStor.Close();
FormStor.Delete(nt_rec->PrepareStorageName(ID));
}
Storage.Close();
}
void CMMSBuh::ExtractListForm(wxString& Dir, CStorage& Storage, CStorage& TypedTextStorage,
MMSObjectType Type,
CFormDescrList& ListForms)
{
CNameTableRecord* nt_rec = NameTable.Find(Type);
wxString DestDir = nt_rec->PrepareDirName(Dir);
CStorage ListStor(Storage, nt_rec->StorageName);
wxMkdir(DestDir);
ExtractListForms(ListForms, DestDir, ListStor, nt_rec->StorageName+_U("_Number"));
ListForms.ExtractMetadata(Dir, Type, TypedTextStorage);
}
void CMMSBuh::ImportListForm(CStorage& Storage, wxString& SrcDir,
MMSObjectType Type,
CFormDescrList& ListForms)
{
CNameTableRecord* nt_rec = NameTable.Find(Type);
CStorage ListStor(Storage);
ListStor.Create(nt_rec->StorageName);
ImportListForms(ListForms, ListStor, nt_rec->PrepareDirName(SrcDir), nt_rec->StorageName+_U("_Number"));
}
////////////////////////////////////////////////////////
//Main decompilation method
void CMMSBuh::Decompile(wxString& Dir, CStorage& Storage, CStorage& TypedTextStorage)
{
CNameTableRecord* nt_rec = NameTable.Find(MMS_Buh);
MMS_Filter.Down();
if( MMS_Filter.Test(this, nt_rec) )
{
wxString BuhDir = nt_rec->PrepareDirName(Dir);
wxMkdir(BuhDir);
//Форма счета
ExtractForm(BuhDir, Storage, NT_AccFormStor, NT_AccForm);
//Форма операции
ExtractForm(BuhDir, Storage, NT_OperFormStor, NT_OperForm);
//Формы списка счетов
ExtractListForm(BuhDir, Storage, TypedTextStorage, NT_AccListForm, AccListForms);
//Журнал проводок
ExtractListForm(BuhDir, Storage, TypedTextStorage, NT_ProvListForm, ProvListForms);
//Журнал операций
CMMSOperJournal* Journ = (CMMSOperJournal*)OperJournal.GetChild(0);
if( Journ != NULL )
{
ExtractListForm(BuhDir, Storage, TypedTextStorage, NT_OperListForm, Journ->Forms);
CNameTableRecord* nt_rec = NameTable.Find(NT_OperListForm);
wxString DestDir = nt_rec->PrepareDirName(BuhDir);
Journ->ExtractDescriptions(DestDir+_U("/"), TypedTextStorage, true);
}
//Неизвестно чего форма. Кроме как в ММС нигде не обнаружена. Видимо, чего-то по умолчанию.
UnknownListForms.ExtractMetadata(BuhDir, NT_UnknownListForm, TypedTextStorage);
AccountPlans.Decompile(BuhDir, Storage, TypedTextStorage);
ExtractMetadata(BuhDir, TypedTextStorage);
ExtractDescriptions(BuhDir+_U("/"), TypedTextStorage, false);
}
MMS_Filter.Up();
}
////////////////////////////////////////////////////////
//Main compilation method
void CMMSBuh::Compile(CStorage& Storage, CStorage& TypedTextStorage, wxString& SrcDir)
{
CNameTableRecord* nt_rec_buh = NameTable.Find(MMS_Buh);
wxString BuhDir = nt_rec_buh->PrepareDirName(SrcDir);
MMS_Filter.Down();
if( MMS_Filter.Test(this, nt_rec_buh) )
{
Msg(1, _U("INF: Параметры бухгалтерии"));
//Форма счета
ImportForm(Storage, BuhDir, NT_AccFormStor, NT_AccForm);
//Форма операции
ImportForm(Storage, BuhDir, NT_OperFormStor, NT_OperForm);
//Формы списка счетов
ImportListForm(Storage, BuhDir, NT_AccListForm, AccListForms);
//Журнал проводок
ImportListForm(Storage, BuhDir, NT_ProvListForm, ProvListForms);
//Журнал операций
CMMSOperJournal* Journ = (CMMSOperJournal*)OperJournal.GetChild(0);
ImportListForm(Storage, BuhDir, NT_OperListForm, Journ->Forms);
CNameTableRecord* nt_rec = NameTable.Find(NT_OperListForm);
wxString JDir = nt_rec->PrepareDirName(BuhDir);
Journ->ImportDescriptions(TypedTextStorage, JDir+_U("/"), true);
//Описания
for( int i = 0; i < GetNChildren(); i++ )
{
GetChild(i)->Compile(Storage, TypedTextStorage, BuhDir);
}
ImportDescriptions(TypedTextStorage, BuhDir+_U("/"), false);
}
MMS_Filter.Up();
}
////////////////////////////////////////////////////////////
//// Планы счетов ////////////////////////////////////////
////////////////////////////////////////////////////////////
void CMMSAccount::Decompile(wxString& Dir, CStorage& Storage, CObjectOrdering& Order)
{
CNameTableRecord* nt_rec = NameTable.Find(MMS_Type);
wxString FName = nt_rec->PrepareFileName(wxString(), this);
FName.Replace(_U("%Code%"), Code);
Order.Add(ID, FName.c_str(), FName.c_str());
CBeautyString String;
BeautyString(String, 0);
Storage.CopyStringToFile(String, Dir+_U("/")+FName);
}
void CMMSAccountPlan::Decompile(wxString& Dir, CStorage& Storage, CStorage& TypedTextStorage, CObjectOrdering& Order)
{
CNameTableRecord* nt_rec = NameTable.Find(MMS_Type);
wxString PlanDir = nt_rec->PrepareDirName(wxString(), this);
Order.Add(ID, PlanDir.c_str(), PlanDir.c_str());
PlanDir = nt_rec->PrepareDirName(Dir, this);
wxMkdir(PlanDir);
CNameTableRecord* nt_rec_mdp = NameTable.Find(NT_MetadataPart);
wxString FName = nt_rec_mdp->PrepareFileName(PlanDir, this);
CBeautyString String;
BeautyString(String, 0);
Storage.CopyStringToFile(String, FName);
CObjectOrdering AccountsOrder(2);
for( int i = 0; i < Accounts.GetNChildren(); i++ )
{
CMMSAccount* Account = (CMMSAccount*)Accounts.GetChild(i);
Account->Decompile(PlanDir, Storage, AccountsOrder);
}
ExtractDescriptions(PlanDir+_U("/"), TypedTextStorage, true);
AccountsOrder.WriteFile(Storage, PlanDir);
}
void CMMSAccountPlanList::Decompile(wxString& Dir, CStorage& Storage, CStorage& TypedTextStorage)
{
CNameTableRecord* nt_rec = NameTable.Find(MMS_Type);
wxString PlansDir = nt_rec->PrepareDirName(Dir, this);
CObjectOrdering Order(2);
for( int i = 0; i < GetNChildren(); i++ )
{
CMMSAccountPlan* Plan = (CMMSAccountPlan*)GetChild(i);
Plan->Decompile(PlansDir, Storage, TypedTextStorage, Order);
}
ExtractDescriptions(PlansDir+_U("/"), TypedTextStorage, true);
Order.WriteFile(Storage, PlansDir);
}
void CMMSAccountPlan::Compile(CStorage& Storage, CStorage& TypedTextStorage, wxString& SrcDir)
{
CNameTableRecord* nt_rec = NameTable.Find(MMS_Type);
wxString PlanDir = nt_rec->PrepareDirName(SrcDir, this);
ImportDescriptions(TypedTextStorage, PlanDir+_U("/"), true);
}
void CMMSAccountPlanList::Compile(CStorage& Storage, CStorage& TypedTextStorage, wxString& SrcDir)
{
CNameTableRecord* nt_rec = NameTable.Find(MMS_Type);
wxString PlansDir = nt_rec->PrepareDirName(SrcDir, this);
for( int i = 0; i < GetNChildren(); i++ )
{
CMMSAccountPlan* Plan = (CMMSAccountPlan*)GetChild(i);
Plan->Compile(Storage, TypedTextStorage, PlansDir);
}
ImportDescriptions(TypedTextStorage, PlansDir+_U("/"), true);
}