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