====== 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 }