Class SlVO
- Namespace
- PHCBusinessLayer
- Assembly
- PHCBusinessLayer.dll
Stock Movement
[AttTable("SL", 20230509)]
[AttTableOrderBy("datalc,horalc", "D,D")]
[AttTableGama(Gamas.Corporate)]
[AttTableProducts(new Products[] { Products.STOCKS })]
[AttTableFlags(new TableFlags[] { TableFlags.MasterEntity, TableFlags.UseInternalRef, TableFlags.TableForJorge, TableFlags.AddOnNotDeployable, TableFlags.UseDimensions })]
[AttRelationShip(typeof(StVO), RelationShipTypes.OneToOne, new string[] { "[SL].[ref]", "[ST].[ref]" })]
[AttTableVOInfo(typeof(SlAttInfo))]
public class SlVO : BusinessVO, IBaseSerialization, ICloneVO, ICloneable, IChange, IParent, IGenericVO
- Inheritance
-
SlVO
Properties
Cm2LabelField
From Cm2.LabelField
[AttVirtualField]
[AttHidden]
public string Cm2LabelField { get; set; }
Property Value
Cm2VO
Código de movimento de stock associado a este movimento.
[AttExternalCollection(typeof(Cm2VO), new string[] { "cm2.cm", "cm" })]
public Cm2VO Cm2VO { get; }
Property Value
Remarks
Data type Cm2VO.
Field not sent to the frontend.
CountryVO
[AttExternalCollection(typeof(CountryVO), new string[] { "paisesstamp", "PaisesStamp" })]
public CountryVO CountryVO { get; }
Property Value
LastSLVO
[AttExternalCollection(typeof(SlVO))]
public SlVO LastSLVO { get; }
Property Value
LotVO
[AttExternalCollection(typeof(LotVO), new string[] { "Sl.ref", "Lot.ref", "Sl.lote", "Lot.lote" })]
public LotVO LotVO { get; }
Property Value
SaVO
Stock por armazém associado a este movimento.
[AttExternalCollection(typeof(SaVO), new string[] { "sa.ref", "ref", "sa.armazem", "armazem" })]
public SaVO SaVO { get; }
Property Value
Remarks
Data type SaVO.
Field not sent to the frontend.
StVO
Artigo ou serviço associado a este movimento.
[AttExternalCollection(typeof(StVO), new string[] { "st.ref", "ref" })]
public StVO StVO { get; }
Property Value
Remarks
Data type StVO.
Field not sent to the frontend.
adoc
Document number.
[AttLenght(50)]
[AttList]
public string adoc { get; set; }
Property Value
Remarks
Length 50.
Search Field.
Field available in the basic search results list.
armazem
Armazém.
[AttLenght(5)]
[AttFieldType(AttFieldType.InputTypes.integer)]
[AttMinValue(0)]
[AttMaxValue(99999)]
public int armazem { get; set; }
Property Value
Remarks
Length 5.
bistamp
Campo de ligação à linha do dossier interno BiVO.
[AttForeignKey(typeof(BiVO))]
[AttLenght(25)]
public string bistamp { get; set; }
Property Value
Remarks
Length 25.
Foreign Key field to another table.
cm
Código do Documento.
[AttLenght(6)]
[AttMandatory]
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.syncOnChange })]
public int cm { get; set; }
Property Value
Remarks
Length 6.
cmdesc
Description of the Movement Code.
[AttLenght(20)]
[AttMandatory]
[AttList]
public string cmdesc { get; set; }
Property Value
Remarks
Length 20.
Search Field.
Field available in the basic search results list.
codigo
Código de Barras.
[AttLenght(18)]
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public string codigo { get; set; }
Property Value
Remarks
Length 18.
componente
Controls whether the product is composed.
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public bool componente { get; set; }
Property Value
Remarks
It is a Logical type property.
compound
Indica se o artigo é um composto.
[AttVirtualField]
[AttHidden]
public bool compound { get; set; }
Property Value
design
Designation.
[AttLenght(60)]
[AttLogInfo(1)]
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
[AttList]
public string design { get; set; }
Property Value
Remarks
Length 60.
Search Field.
Field available in the basic search results list.
diaplano
Dia da data de contabilização.
[AttLenght(2)]
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public int diaplano { get; set; }
Property Value
Remarks
Data type Numeric.
Length 2.
dilnoplano
Nº lançamento no Diário de contabilização.
[AttLenght(10)]
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public int dilnoplano { get; set; }
Property Value
Remarks
Data type Numeric.
Length 10.
dinoplano
Diário de contabilização.
[AttLenght(50)]
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public string dinoplano { get; set; }
Property Value
Remarks
Data type String.
Length 50.
disableIntegration
Indica se no código de movimento tem a integração na contabilidade desativada.
[AttVirtualField]
[AttHidden]
public bool disableIntegration { get; set; }
Property Value
dplano
Document accounting date.
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public DateTime dplano { get; set; }
Property Value
Remarks
Data type DateTime.
Non Duplicable Field.
entrada
Movement of stock input.
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public bool entrada { get; set; }
Property Value
Remarks
Contains the indication if the stock movement code is input, this field is a denormalization of the corresponding field Input
epcpond
Weighted Cost Price after the move.
[AttLenght(19, 6)]
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public decimal epcpond { get; set; }
Property Value
Remarks
- Length 19.6
- Not Duplicable
ett
Total.
[AttLenght(19, 6)]
[AttFieldType(AttFieldType.InputTypes.currency, new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public decimal ett { get; set; }
Property Value
Remarks
Lenght of 19, where the units are 12 and decimals are 6.
evu
Preço Unitário.
[AttLenght(19, 6)]
[AttFieldType(AttFieldType.InputTypes.currency, new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.syncOnChange })]
[AttMinValue(0)]
public decimal evu { get; set; }
Property Value
Remarks
Lenght of 19, where the units are 12 and decimals are 6.
expensesSv
Valor de despesas vindas do SV.
[AttLenght(19, 6)]
[AttHidden]
[AttFieldType(AttFieldType.InputTypes.currency, new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public decimal expensesSv { get; set; }
Property Value
Remarks
Lenght of 19, where the units are 12 and decimals are 6.
fistamp
Campo de ligação à linha do documento de facturação FiVO.
[AttForeignKey(typeof(FiVO))]
[AttLenght(25)]
public string fistamp { get; set; }
Property Value
Remarks
Length 25.
Foreign Key field to another table.
fnstamp
Campo de ligação à linha da compra FnVO.
[AttForeignKey(typeof(FnVO))]
[AttLenght(25)]
public string fnstamp { get; set; }
Property Value
Remarks
Length 25.
Foreign Key field to another table.
frcl
Número da Empresa.
[AttLenght(10)]
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public decimal frcl { get; set; }
Property Value
Remarks
Length 10.
horalc
Moving Time
[AttLenght(12)]
[AttFieldType(AttFieldType.InputTypes.fullTime)]
[AttMandatory]
[AttLogInfo(3)]
[AttList]
public string horalc { get; set; }
Property Value
Remarks
- Length 8
- Appears on the Quick List
- Available in Quick Find
- Not Duplicable
- Mandatory Fill
This field accepts the format HH:mm:ss.fff where HH is the hour using a 24 hour clock from 00 to 23, mm is the minutes from 00 to 59, ss is the seconds from 00 to 59 and finally fff are thousandths from 000 to 999
Note that are included in the value of the field the two codes : and . for example if the time is 15 hours 14 minutes 13 seconds and 30 milliseconds the value of this field will be 15:14:13.030
lote
Lot
[AttLenght(40)]
[AttForeignKey(true, typeof(LotVO), HiddenField = false)]
[AttEntityAvailable(typeof(LotVO))]
[AttFieldType(AttFieldType.InputTypes.string, new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.syncOnChange })]
[AttList(Inactive = true)]
public string lote { get; set; }
Property Value
Remarks
ForeignKey to lote
lotepcpond
[AttLenght(19, 6)]
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public decimal lotepcpond { get; set; }
Property Value
lotrefdate
Expiration date for FEFO
[AttEntityAvailable(typeof(LotVO))]
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public DateTime lotrefdate { get; set; }
Property Value
lotstock
[AttLenght(14, 4)]
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public decimal lotstock { get; set; }
Property Value
lottype
[AttEntityAvailable(typeof(LotVO))]
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public LotTypes lottype { get; set; }
Property Value
lottypename
Name of lot type.
[AttLenght(50)]
[AttLocale(typeof(SlAttInfo), new string[] { "[SL].[lottype]" })]
public string lottypename { get; set; }
Property Value
market
Market.
[AttVirtualField]
[AttLenght(1)]
public int market { get; }
Property Value
movdescription
Moviment Sitation
[AttVirtualField]
[AttLenght(30)]
public string movdescription { get; set; }
Property Value
mudapcp
Movement configured for weighted cost price calculation.
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public bool mudapcp { get; set; }
Property Value
Remarks
Contains the indication if the stock movement code calculates the weighted cost price, this field is a denormalization of the corresponding field Calculates Weighted Cost Price .
mudapcult
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public bool mudapcult { get; set; }
Property Value
nome
Nome.
[AttLenght(55)]
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public string nome { get; set; }
Property Value
Remarks
Length 55.
nvol
Número de Volumes
[AttLenght(14, 4)]
[AttGama(Gamas.Advanced)]
[AttFieldType(AttFieldType.InputTypes.decimal, new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.syncOnChange })]
[AttMinValue(0)]
public decimal nvol { get; set; }
Property Value
Remarks
Length: 14.4
origem
Origem do movimento.
[AttLenght(20)]
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public string origem { get; set; }
Property Value
Remarks
Length 2.
origemLabelField
Origem Label Field
[AttVirtualField]
public string origemLabelField { get; set; }
Property Value
pais
País de Origem.
[AttLenght(70)]
[AttProducts(new Products[] { Products.Accounting })]
public string pais { get; set; }
Property Value
paisesstamp
Campo de ligação à entidade de países ().
[AttForeignKey(CanDuplicate = true, ForeignType = typeof(CountryVO), HiddenField = false)]
[AttLenght(25)]
[AttProducts(new Products[] { Products.Accounting })]
public string paisesstamp { get; set; }
Property Value
pbuni
Peso Bruto Unitário
[AttLenght(14, 4)]
[AttGama(Gamas.Advanced)]
[AttFieldType(AttFieldType.InputTypes.decimal, new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.syncOnChange })]
[AttMinValue(0)]
public decimal pbuni { get; set; }
Property Value
Remarks
Length: 14.4
pluni
Peso Líquido Unitário
[AttLenght(14, 4)]
[AttGama(Gamas.Advanced)]
[AttFieldType(AttFieldType.InputTypes.decimal, new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.syncOnChange })]
[AttMinValue(0)]
public decimal pluni { get; set; }
Property Value
Remarks
Length: 14.4
pncont
Iniciais do País de origem.
[AttLenght(2)]
[AttProducts(new Products[] { Products.Accounting })]
public string pncont { get; set; }
Property Value
poc
Indica se está contabilizado.
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public bool poc { get; set; }
Property Value
qtt
Quantidade.
[AttLenght(14, 4)]
[AttFieldType(AttFieldType.InputTypes.quantity, new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.syncOnChange })]
[AttMinValue(0)]
[AttList]
public decimal qtt { get; set; }
Property Value
Remarks
Lenght of 14, where the units are 9 and decimals are 4.
Field available in the basic search results list.
qttEntrada
[AttVirtualField]
[AttLenght(14, 4)]
public decimal qttEntrada { get; set; }
Property Value
qttSaida
[AttVirtualField]
[AttLenght(14, 4)]
public decimal qttSaida { get; set; }
Property Value
ref
Article Reference.
[AttLenght(18)]
[AttMandatory]
[AttLogInfo(0)]
[AttIndex(new string[] { "ref", "armazem", "lote", "datalc", "horalc", "entrada" }, new OrderTypes[] { OrderTypes.Ascending, OrderTypes.Ascending, OrderTypes.Ascending, OrderTypes.Descending, OrderTypes.Descending, OrderTypes.Descending }, new string[] { "slstamp", "design", "stock", "sastock", "epcpond", "stns" })]
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.syncOnChange })]
[AttList]
public string @ref { get; set; }
Property Value
Remarks
Length 18.
Search Field.
Field available in the basic search results list.
refInt
Referência interna
Contains the value of the user's internal reference that created the record.
[AttLenght(50)]
[AttEntityAvailable(typeof(RefInternaVO))]
[AttList(Inactive = true)]
public string refInt { get; set; }
Property Value
Remarks
Length 50 .
refuselot
Property to know if the ref use lot
[AttVirtualField]
[AttHidden]
public bool refuselot { get; set; }
Property Value
Remarks
It is a Logical type property.
salotstock
[AttLenght(14, 4)]
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public decimal salotstock { get; set; }
Property Value
sastock
[AttLenght(14, 4)]
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public decimal sastock { get; set; }
Property Value
segmento
Segmento de Mercado.
[AttLenght(25)]
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public string segmento { get; set; }
Property Value
Remarks
Length 25.
slmas
Colecção de numeros de série.
[AttCollection(typeof(SlMaVO))]
public List<SlMaVO> slmas { get; set; }
Property Value
Remarks
This field is a collection of type List (Of SlMaVO).
SlMaVOslstamp
Single registration field, used to link others to this entity.
[AttLenght(25)]
public string slstamp { get; set; }
Property Value
Remarks
This field uniquely identifies the record (primary key by default).
Length 25.
stns
Indica se a referência é um serviço.
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public bool stns { get; set; }
Property Value
stock
Stock total do artigo após o movimento.
[AttLenght(14, 4)]
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public decimal stock { get; set; }
Property Value
Remarks
- Length 14.4
- Not Duplicable
stocktakingLineStamp
ForeignKey to stamp
[AttForeignKey(typeof(StocktakingLineVO))]
[AttLenght(25)]
public string stocktakingLineStamp { get; set; }
Property Value
tnvol
Total Número de Volumes
[AttLenght(18, 4)]
[AttGama(Gamas.Advanced)]
[AttVirtualField]
[AttFieldType(AttFieldType.InputTypes.decimal, new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public decimal tnvol { get; set; }
Property Value
Remarks
- Length: 18.4
- Virtual
tpbrut
Total Peso Bruto
[AttLenght(18, 4)]
[AttGama(Gamas.Advanced)]
[AttVirtualField]
[AttFieldType(AttFieldType.InputTypes.decimal, new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public decimal tpbrut { get; set; }
Property Value
Remarks
- Length: 18.4
- Virtual
tpliq
Total Peso Líquido
[AttLenght(18, 4)]
[AttGama(Gamas.Advanced)]
[AttVirtualField]
[AttFieldType(AttFieldType.InputTypes.decimal, new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public decimal tpliq { get; set; }
Property Value
Remarks
- Length: 18.4
- Virtual
trfa
Transferência de armazém.
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public bool trfa { get; set; }
Property Value
tvol
Total Volume
[AttLenght(18, 4)]
[AttGama(Gamas.Advanced)]
[AttVirtualField]
[AttFieldType(AttFieldType.InputTypes.decimal, new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public decimal tvol { get; set; }
Property Value
Remarks
- Length: 18.4
- Virtual
uselot
[AttEntityAvailable(typeof(LotVO))]
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public bool uselot { get; set; }
Property Value
useserialnumber
usa serialnumbers
[AttVirtualField]
public bool useserialnumber { get; set; }
Property Value
usr1
Marca.
[AttLenght(20)]
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public string usr1 { get; set; }
Property Value
Remarks
Length 20.
usr2
Modelo.
[AttLenght(20)]
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
public string usr2 { get; set; }
Property Value
Remarks
Length 20.
vuni
Volume Unitário
[AttLenght(14, 6)]
[AttGama(Gamas.Advanced)]
[AttFieldType(AttFieldType.InputTypes.volumes, new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.syncOnChange })]
[AttMinValue(0)]
public decimal vuni { get; set; }
Property Value
Remarks
Length: 14.4
Explicit Interface Implementations
CanIntegrate()
Returns true if integration is available
bool CanIntegrate()
Returns
CleanIntegrationErrors()
Cleans the accounting integration errors
void CleanIntegrationErrors()
GetIntegrationConfig(int)
Get Accounting configuration if exists
PHCResult GetIntegrationConfig(int year)
Parameters
| Nome | Tipo | Descrição |
|---|---|---|
year |
int |
Returns
GetPendingIntegrationsCommands(int)
PHCCmdSql GetPendingIntegrationsCommands(int year = 0)
Parameters
| Nome | Tipo | Descrição |
|---|---|---|
year |
int |
Returns
HasAccountingIntegration()
Check for permission to integrate document
bool HasAccountingIntegration()
Returns
LogIntegrationErrors(List<MessageVO>)
Logs the accounting integration errors
void LogIntegrationErrors(List<MessageVO> errorMessages)
Parameters
| Nome | Tipo | Descrição |
|---|---|---|
errorMessages |
List<MessageVO> |
accounted
Mark document as accounted
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
[AttProducts(new Products[] { Products.Accounting })]
bool accounted { get; set; }
Returns
adate
Accounting Date
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
[AttProducts(new Products[] { Products.Accounting })]
DateTime adate { get; set; }
Returns
basevalue
Base value
[AttVirtualField]
decimal basevalue { get; set; }
Returns
datalc
Date of the Movement.
[AttMandatory]
[AttLogInfo(2)]
[AttFieldType(AttFieldType.InputTypes.date)]
[AttList]
DateTime datalc { get; set; }
Returns
Remarks
- Appears in Quick List.
- Available in Quick Search.
- Not Duplicable.
- Required field.
This field is used in conjunction with the Hour of Movement field to sort the records so as to achieve a chronological identification that allows you to be independent of the actual time that the record was entered into the system.
docarchivalnumber
ID: Journal + Period + DocNumber
[AttLenght(30)]
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
[AttProducts(new Products[] { Products.Accounting })]
string docarchivalnumber { get; set; }
Returns
documentdescription
Description of the document type (DC)
[AttFieldType(AttFieldType.InputTypes.memo, new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
[AttProducts(new Products[] { Products.Accounting })]
string documentdescription { get; set; }
Returns
documentid
Id of the accounting document (DC)
[AttLenght(6)]
[AttFieldType(AttFieldType.InputTypes.integer, new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
[AttProducts(new Products[] { Products.Accounting })]
decimal documentid { get; set; }
Returns
evaliva
Valor do IVA.
[AttLenght(19, 6)]
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
decimal evaliva { get; set; }
Returns
Remarks
Lenght of 19, where the units are 12 and decimals are 6.
integrationErrors
Accounting integrations message errors
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
[AttProducts(new Products[] { Products.Accounting })]
string integrationErrors { get; set; }
Returns
isaccounting
Is true if the document is in integrating process
[AttFieldType(new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
[AttProducts(new Products[] { Products.Accounting })]
bool isaccounting { get; set; }
Returns
journaldescription
Description of the journal (DI)
[AttLenght(200)]
[AttFieldType(AttFieldType.InputTypes.string, new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
[AttProducts(new Products[] { Products.Accounting })]
string journaldescription { get; set; }
Returns
journalid
Journal code (DI).
[AttLenght(6)]
[AttFieldType(AttFieldType.InputTypes.integer, new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
[AttProducts(new Products[] { Products.Accounting })]
decimal journalid { get; set; }
Returns
taxaiva
Vat Tax
[AttVirtualField]
decimal taxaiva { get; set; }
Returns
year
Year of Document (PCY).
[AttLenght(4)]
[AttFieldType(AttFieldType.InputTypes.integer, new AttFieldType.FieldFlags[] { AttFieldType.FieldFlags.isReadOnly })]
[AttProducts(new Products[] { Products.Accounting })]
int year { get; set; }