====== Pravidla pisania zdrojovych kodov ticketIssueLogic kniznici ======
* ** V aplikacnych interface-och TicketIssueLogic( potomkovia od ETicketIssueLogic ) sa vykonavaju len VOLANIA nad jednotlivymi modulmi logiky. To znamena ze vsetka vydajova logika sa nachadza v moduloch ! **
* Navratova hodnota funkcie by mala predstavoat chybovy kod z enumu v EIssueLogicDefines::ReturnValues a hodnoty si predavat cez vstupne alebo vystupne parametre
* **Je zakazane pouzivat triedu EGlobData z kniznice EData !!!**
* Pouzitie funkcii z triedy ECP z kniznice EData pouzivat s rozumom !!!
Vseobecne pravidla pisania zdrojovych kodov : [[coding:coding#coding|pravidla]]
====== Zakladne kroky pre spravnu pracu s TicketIssueLogic ======
===== Vseobecne platne pravidla =====
Kniznica je rozdelena na styri celky:
==== Aplikacne interface-y ====
Vsetky triedy podedene od ETicketIssueLogic. Urcuju poradie volania logiky na modulmy. Aplikacne interfac-y si loaduju uzivatelom navolene moduly.
==== Logicke moduly ====
Logicke moduly niesu viditelne aplikaciou. Modul predstavuje cast logiky, ktora je potrebna pre vydaj listka.
\\ Funckie v moduloch su rozdelene na dve casti:
\\ **Public virtual funckie** - funkcie pristupne z interface-ov, umoznuju pracovat s modulom
\\ **Protected virtual funckie** - pomocne funckie, pri ktorych je predpoklad mozneho rozsirenia v potomkoch
\\
\\
Kazdy modul musi obsahovat:
- Obsahuje funckiu Init. Init funkcia sluzi na vytiahnutie inych modulov z ModuleManager-a
- Do konstuktoru predka Modulu ETicketIssueModule je potrebne nastavit typ rodiny, do ktorej modul patri.
\\
Verzia kniznice 4.1.0 podporuje nasledovne rodiny modulov:
* FamilyUndefinedModules
* FamilyPrintModules
* FamilyStatisticModules
* FamilyCommonModules
* FamilyOneWayTicketModules
* FamilyTimeTicketModules
* FamilyCreditRechargeModules
* FamilyInterchangeModules
* FamilyCancelationModules
* FamilyCardActivationModules
* FamilyCombinedTicketModules
* FamilyTimeTicketSellModules
* FamilyServiceModules
* FamilyCrossTransferModules
* FamilyZoneModules
* FamilyTimeTicketActivationModules
* FamilyReclamationModules
* FamilyCheckinCheckoutModules
* FamilyCalculatePriceModules
* FamilyRegionCardModules
* FamilyTripSectionModules
* FamilyWalletModules
* FamilyCommercialDiscountsModules
* FamilyAlternativeTripModules
==== Jadro ====
Jadro predstavuje zakladne a pomocne triedy pre pracu s kniznicou
* **EIssuedTicket** - pomocna trieda, ktora predstavuje jeden vydavany listok
* **ETemplateManager** - manager, ktory spravuje sablony pre tlac listkov
* **ETicketIssueLogicDataStorage** - sluzi na uchovavanie dat potrebnych pre vydaj. Nastavovacie funckie v interface-och nastavuju hodnoty tiez do DataStorage-u
* **ETripSection** - trieda potrebna pri kombinovanych listkov na rozdelenie useku, ktory pasazier jazdi
* **EDataConverter** - trieda, ktora je urcena na rekodovanie textov do inych kodovani, konvertovnie datovych typov na ine datove typy a pracu s datumom
==== Vystupne data ====
Vystupne data sluzia na ziskanie dat po vydaji listku.
Zivotny cyklus vydaja listka je rozdeleny na tri milniky:
- **PreIssueData** - data vytvorene pred vydajom listka
* tarifa
* cena
* priznak jazdy na CL
* index casoveho listka
* vystupna zastavka
* pouzity customer profile index na karte
- **PostIssueData** - data vytvorene po vydaji listka pred zapisom statistiky a tlacou
* priznak vystup //FlagWasCheckOut//
* priznak prestup //FlagWasInterchange//
* priznak ci bol vykonany doplatok //FlagWasAdditionalTariffAreaSurcharge//
* pocet vydanych listkov //TicketCount//
* hodnota sumy pre vratenie pri checkout-e //RefundPrice//
* skutocne vydana cena listka //TicketPrice//
- **StatisticData** - data vytvarane pri zapise statistiky
* vystupne data, ktore predstavuju serializovany statisticky listok
- **ValidTicketData** - informacie o platnom vydanom listku
* priznak ci je listok zapisany na karte
* priznak o jazde na CL
===== Inicializacia ticketIssueLogic =====
V aplikacii je potrebne vytvorit podla potreby instanciu triedy ETicketIssueLogic alebo jej potomkov ( new EGeneralTicketIssueLogic() , new ETicketIssueLogic() , ... ) \\ Po vytvoreni instancie je potrebne ticketIssueLogic inicializovat funkciou Init, napriklad:
if ( d->mIssueLogic->Init() != EIssueLogicDefines::Ok )
{
EERROR(" FATAL Error init ticket issue logic ");
}
Je dobre skontrolovat navratovu hodnotu a minimalne zalogovat navratovu hodnotu do logov. Najlepsie by bolo nastavit ticketIssueLogic na NULL a nedovolit pracu s nespravne inicializovanym ticketissuelogic
===== Nastavenie uzivatelskych vstupnych dat =====
Pred vydajom listka je potrebne ticketIssueLogic nastavit vstupne data potrebne pre spravny vydaj listka. \\
Potrebna funkcionalita pre nastavenie vstupnych dat sa nachadza v triede ETicketIssueLogic a data sa nastavuju ulozisku dat ETicketIssueLogicDataStorage, z ktoreho je nasledne mozny pristup z celej kniznice.
**Priklad nastaveni vo verzii 4.1.0**
bool SetOperationType( EIssueLogicDefines::OperationType operationType );
bool SetPaymentType( EIssueLogicDefines::PaymentType paymentType );
bool SetIssueType( EIssueLogicDefines::IssueType issueType );
bool SetTariff( const Strojcek::VstupneUdaje::TarifnySystem::ETarifa *tariff );
bool SetTariffGroup( const Strojcek::VstupneUdaje::TarifnySystem::ETarifnaSkupina *tariffGroup );
bool SetTripOrderCheckinBusStop( long tripCheckinBusStopOrder );
bool SetTripOrderCheckoutBusStop( long tripCheckoutBusStopOrder );
bool SetTripOrderOfBusStopForCheckOut( long tripOrderOfBusStopForCheckOut );
bool SetCreditRecharge( unsigned long creditRecharge );
bool SetTicketCount( short ticketCount );
bool SetCancelationStatisticTicketNumber( const long cancelationStatisticTicketNumber );
bool SetDeviceSerialNumber( unsigned long serialNumber );
bool SetAdvertisementEnabled( bool enableAdvertisement );
void SetCrossTransfer(const EM::Strojcek::VstupneUdaje::EPrestupSpoj crossTransfer);
bool SetMultipleTickets( const EHead *multipleTicketsCol );
bool SetCheckInZone( long checkInZone );
bool SetCheckOutZone( long checkOutZone );
bool SetZoneList( const std::list &zoneList );
bool SetCheckOutZoneBusStopID( unsigned long checkOutZoneBusStopID );
bool SetCheckInZoneBusStopID( unsigned long checkInZoneBusStopID );
bool SetPassNumber( unsigned long passNumber );
bool SetPriceListRow( unsigned short priceListRow );
bool SetFlagShowConfirmationMessageOnPortableEP( bool showConfirmationMessage );
bool SetFlagAllowIssueOnPortableEP( bool allowIssueOnPortableCard );
bool SetFlagTransferForAllTicketsOnCard( EIssueLogicDefines::TransferForAllTicketsOnCard transferForAllTicketsOnCard );
bool SetFlagProlongTicketsTimeValidity( EIssueLogicDefines::ProlongTicketsTimeValidity prolongTicketTimeValidity );
bool SetFlagRepeatedCheckIn( bool repeatedCheckIn );
bool SetFlagExplicitlySelectedTariff( bool explicitlySelectedTariff );
bool SetReclamationUID(long long uid);
bool SetCardWriteOperations( unsigned long cardWriteOperations );
bool SetTimeTicketCounter( unsigned char timeTicketCounter );
bool SetOneWayTicketCardPositioning(EIssueLogicDefines::OneWayTicketCardPositioning positioning);
bool SetSelectedCommercialDiscount( const long commercialDiscountIndexOnCard, const long discountCheckInBusStopLineOrder, const long discountCheckOutBusStopLineOrder , const Strojcek::VstupneUdaje::TarifnySystem::ETarifa *discountTariff );
bool GetOutputDataCollection( std::vector *&ticketIssueOutputData );
bool SetAlternativeTripData( unsigned long lineNumber, unsigned long tripNumber, long protectNumber, long lastBusStopTripOrder );
bool SetServiceCounter( unsigned char serviceCounter );
Do TicketIssueLogic je potrebne nastavit zakladne data pre vykonavanie vydaju listka:
* typ prace s kartou
* typ platy
* typ vydajovej operacie
\\
**Typ prace s kartou specifikuje bitovo orienotvany enum CardWriteOperations v triede EIssueLogicDefines a umoznuje nastavit struktury, ktore sa budu zapisovat na kartu:** \\
Pozor, pri hotovostnej operacii nastavujte CardWriteNothing !!! \\ \\
Priklad enumu pre pracu s kartou vo verzii ticketIssueLogic 0.0.96
enum CardWriteOperations
{
CardWriteNothing = 0x0,
CardWriteAuditor = 0x1,
CardWriteOneWayTickets = 0x2,
CardWriteWallet = 0x4,
CardWriteTimeTickets = 0x8,
CardWriteCommercialDiscounts = 0x10
};
\\
** Typ platby urcuje sposob platby za vydany listok a specifikuje ho enum PaymentType v triede EIssueLogicDefines:** \\
Priklad enumu typu platby vo verzii ticketIssueLogic 0.0.95
enum PaymentType
{
PaymentUndefined = -1,
PaymentCash = 0 ,
PaymentChipCard = 1,
PaymentBankCard = 2,
PaymentInvoice = 3,
PaymentMarker = 5,
PaymentCoiner = 11,
PaymentCoupon = 12,
};
\\
** Typ vydajovej operacie urcuje aka logika sa ma vykonavat a specifikuje ho enum OperationType v triede EIssueLogicDefines:** \\
Priklad enumu typu vydajovej operacie vo verzii ticketIssueLogic 0.0.95
enum OperationType
{
OperationUndefined = -1,
OperationSell = 0,
OperationCancel = 1,
OperationCreditRecharge = 2,
OperationCancelCreditRecharge = 3,
OperationCardActivation = 4,
OperationTimeTicketSell = 5,
OperationTimeTicketCancel = 6,
OperationAuditor = 7,
OperationSurchargeSell = 8,
OperationCoinerOverfall = 9,
OperationAdditionalTariffAreaSurcharge = 10
==== Ukazka nastavenia vstupnych dat do ticketIssueLogic pred operaciou vydaja listku: ====
V aplikacii je vytvorena instancia aplikacneho interface-u kniznice ETicketIssueLogic a je potrebne zapisovat jednorazove listky a penazenku na karte pri predaji listka z karty. \\
V aplikacii je teda potrebne nastavit z enumu CardWriteOperations bity CardWriteOneWayTicket a CardWriteWallet
\\
** Priklad: **
EGeneralTicketIssueLogic *ticketIssueLogic = new EGeneralTicketIssueLogic();
ticketIssueLogic->SetCardWriteOperations( EIssueLogicDefines::CardWriteOneWayTicket | EIssueLogicDefines::CardWriteWallet ); // logika vie ze ma zapisat len tieto veci na kartu
\\
===== Pristup k logike mame cez 4 zakladne funkcie : =====
** IssueTicket - najhlavenjsia funkcia, ktora reprezentuje vydaj listka **
* vypocet ceny
* kontrola podmienok vydaja
* priprava dat pre tlac
* priprava statistikcych listkov
EIssueLogicDefines::ReturnValues result = d->mIssueLogic->IssueTicket( &writeRequest );
if ( result != EIssueLogicDefines::Ok )
{
// osetrenie navratovych hodnot
}
** WriteStatistic - funkcia IssueTicket pripravi statisticke listky a na potrebnom mieste je uz potrebne len zavolat WriteStatistic, ktora zapise incicializvoane listky do statistiky **
EIssueLogicDefines::ReturnValues result = d->mIssueLogic->WriteStatistic( false ); // false - nie je nedokoncena operacia , true - nedokoncena operacia
if ( result != EIssueLogicDefines::Ok )
{
// osetrenie navratovych hodnot
}
** Print/PrintLastTicketCopy - vytlaci data, ktore funckia IssueTicket v priebehu vydaja listku vytvorila **
Pomocou funckie PrintLastTicketCopy je mozne viackrat vytlacit listok
EIssueLogicDefines::ReturnValues result = d->mIssueLogic->Print() / d->mIssueLogic->PrintLastTicketCopy();
if ( result != EIssueLogicDefines::Ok )
{
// osetrenie navratovych hodnot
}
** CalculatePrice - Funckia pripravena na vynutenie vypoctu ceny **
long calculatedPrice = 0;
double calculatedPriceDecimalFormat = 0;
EIssueLogicDefines::ReturnValues result = d->mIssueLogic->CalculatePrice( calculatedPrice, calculatedPriceDecimalFormat );
if ( result != EIssueLogicDefines::Ok )
{
// osetrenie navratovych hodnot
}