This event is generated when the POS has mostly completed a modification to the sale and allows you to change any pricing on any saleline you wish.
Trapping the Event
In your main dispatch loop, detect the event
while (bRun) { // Read a packet, wait up to 60 seconds then return anyway. FieldpinePacket pPacket = Fdl.SimpleRead(pBuffer, 10*1000*1000, 60*1000); // Did we get anything? if (pPacket) { // Is this an evnt packet? if (memcmp(pBuffer, "EVNT", 4) == 0) { // Extract the Event number from the packet // Every event packet includes this field to say what it is exactly long EventNo = 0; Fdl.GetInt(pPacket, FIELDPINE_EVNT_EVENTNO, &EventNo); if (EventNo == FIELDPINE_EVENT_PRICE_ALL_SALE) { // This is a global pricing event request. Lets do it FieldpinePacket pReply = MyPricingEngine(pPacket); if (pReply) { Fdl.ReplyTo_InOut(pPacket, pReply); Fdl.FreePacket(pReply); } } } Fdl.FreePacket(pPacket); } }
Extracting and Processing the Sale Details
This event includes a SALE object that describes the sales current state. Your code should convert the API packet to a format that it can easily work with and then process the packet. In C++ we provide a number of helper classes to do this conversion for you.
FieldpinePacket MyPricingEngine(FieldpinePacket pRequest) { /* *********************************************************** This is the main logic to price a complete sale. Pricing a complete sale is not often done, but does allow you to get around some tight requirements and implement pretty much any pricing structure you wish *********************************************************** */ // Create a sale from the input packet // This converts the calling structure to something C++ can handle easier // Find the SALE packet FieldpinePacket pSale = theApp.Fdl.GetSubPacket(pRequest, "SALE", 0); if (pSale == NULL) return NULL; Sale inSale(pSale); theApp.Fdl.FreePacket(pSale); CTypedPtrArray<CPtrArray, Line*> InterestingLines; // Loop over all lines and see if anything we are interested in int i=0; for (i=0; i < inSale.GetLineCount(); i++) { Line* pLine = inSale.m_Lines.GetAt(i); if (pLine->m_Pid == 44) InterestingLines.Add(pLine); // Replace with your requirements } if (InterestingLines.GetSize() == 0) return NULL; // Nothing of interest, quit // Create a command to send back to the POS FieldpinePacket pReply = theApp.Fdl.NewPacket("CMDE"); .... return pReply; }