You are on page 1of 19

P2P and O2C: Procure to Pay and Order to Cash 

Cycles
June 20, 2008 — Atif Siddiqui

5 Votes

Oracle has developed this ERP solution which truly covers these both cycles as well as many others.
Oracle EBS comprises of the Standard Core Business Management applications like General Ledger,
Payables, Receivables, Purchasing, Order Management, Inventory, Discrete Manufacturing, Process
Manufacturing , HRMS and many more. The application I’ve mentioned are so integratedthat it
handles the beginning to end of both Assets and Liabilities. When I say Assets I am referring to
applications like Order Management and Receivables, and when I say Liabilities I am referring to
Purchasing and Payables and both of these Assets and Liabilities are finally pushed and calculated in
Oracle General Ledger.

The base or the heart of Oracle EBS is Oracle General Ledger. Let me call GL an intrinsic.

Procure to Pay:
First let’s see what the heading itself means? Procure to Pay means Procuring Raw
Materialsrequired to manufacture the final or finished Goods to Paying the Supplier from whom the
material was purchased. But this is not just two steps. It involves many steps. Let’s see the steps and
Oracle Application involved in performing those steps.

1. Oracle Purchasing: You enter Suppliers of different materials and products you want to


purchase to manufacture a finished good that your organization plans to sell.
2. Oracle Purchasing: You prepare a Request for Quotation (RFQ) and send it to different
suppliers to get the best and/or economical price for the product.
3. Oracle Purchasing: Suppliers sends their quotations and you upload those quotations in
Oracle Purchasing to get the best three quotes and further to get the one best quote.
4. Oracle Purchasing: You prepare a Purchase Order(PO) against the best RFQ to buy the
goods from the supplier who quoted the suitable price and sends the PO to that supplier
5. Oracle Purchasing: The supplier receives the confirmation of purchase from PO and ships the
ordered goods. You receive the goods enter a Goods Received Note (GRN) in Oracle
Purchasing.
6. Oracle Inventory / Oracle Assets: It’s up to you whether you want to receive the goods at
your head office or you Inventory directly. In either case you move the received goods to your
different Raw Material Inventory from Oracle Purchasing to Oracle Inventory and the Item
Count increases. If the item is Asset Type then it will move to Oracle Assets at the time of
Invoice creation in Oracle Payables.
7. Oracle General Ledger: Once you move the goods to Oracle Inventory, it sends the Material
Accounting to Oracle General Ledger.
8. Oracle Payables: After this the supplier sends you the invoice for the purchased goods and
you Enter or Match the invoice against the PO from Oracle Purchasing in Oracle Payables. As
said before, if the item is Asset in nature then it will move to Oracle Asset.
9. Oracle General Ledger: When you enter the invoice it means that you have created a
Liability against that supplier and also you have recorded the expense incurred or asset
purchased. Oracle Payables sends the invoice accounting to Oracle General Ledger.
10. Oracle Payables: You pay the invoice and settle the Liability.
11. Oracle General Ledger: The liability is settled and your cash movement account is updated.
12. Oracle Cash Management: As you pay the invoice Oracle Payables sends the payment
information to Oracle Cash Management for Bank Reconciliation. Once reconciled, Oracle Cash
Management sends the updated Bank/Cash accounting entry to Oracle General Ledger.
13. Oracle General Ledger: Your cash at bank is updated with actual balance.
14. Oracle Process Manufacturing(OPM) / Oracle Discrete Manufacturing(ODM): You start
the manufacturing of your final product. Both OPM or ODM requests the different raw
materials from you inventory organizations and manufactures a finished good.
15. Oracle Inventory: As the raw materials are issued to OPM and ODM the inventory sends the
issuing material accounting to General Ledger and decreases the Item Count from the Raw
Material Store. As the finished good is prepared, Oracle Inventory receives the finished good in
Finished Good Store and increase the Item Count.

Now the final product is ready to be sold in the market and from here the O2C cycle starts.

Order to Cash Cycle:


Order to Cash means Customer’s Order Placing to Vendor’s Cash Receiving. When your final
product is ready to be sold, you market it. The customer gets fascinated with the marketing campaign
and decides to buy your product and from here starts the O2C cycle.

1. Oracle Order Management: Customer places the order.


2. Oracle Order Management: You enter the customer order
3. Oracle Inventory: Check the available unit and the quantity ordered by the customer.
4. Oracle Order Management: You ship the product to customer site and decreases the
Finished Goods inventory.
5. Oracle Receivables: The customer receives the product and you invoice the customer.
6. Oracle General Ledger: You record your revenue and receivables.
7. Oracle Receivables: The customer pays and you receive the cash/check.
8. Oracle Cash Management: Oracle Receivables sends the customer receipt for Bank
Reconciliation. After reconciliation, Oracle Cash Management send the actual bank balance or
Oracle General Ledger.
9. Oracle General Ledger: You have the actual bank balance.
This is how the P2P and O2C cycle works, but this is not the only way, obviously there are many other
applications with different cycles. This is one of them.

Procure To Pay Cycle Process


1. Create a Standard Purchase order.

2. Give Shipments

3. Give Distributions
4. Approve PO

5. See the status of the PO In The header level: It is approved.

6. Go to the ReceivingàReceipts

7. Give the sub inv and stock locator where you want store the goods. And Save.
8. View the request status and refresh If not Completed.

9. Run the Program Pay on receipt auto invoice.(Which Generate Invoice Automatically)

10. View the Status of the program and refresh if not completed.
11. Go to Payables: InvoiceàEntry àInvoice
Query with the Invoice Num ERS%

12. Validate the Invoice .After Validate Enable the creating Accounting check box.

13.See The Account 


14. Enable the check box Pay in full. And Pres ok.

15. Select the Bank and Go to Actions 

16. Enable the check box Create Accounting and press ok.
17. See the Account Created.

18. Now see the invoice status validated, accounted and amount paid.

19. Go to Cash Management: Bank Statementsà Manual clearing. àClear Transactions


Find the Bank Account.
20. Enable the Transaction and press Clear Transaction Button.

21. Go to Payables: PaymentàEntryàPayment


Query with Payment Date

22. Go to actions, enable Create Accounting and press ok.


23. See the Account created.

24. Run: Payables Transfer to General Ledger.

25.View the Request status and refers if not completed.


26.Got to GL:JournalàImportàRun

27.View the request status and refers if not completed.

28. Go to JournalsàEnter .Find with Source as Payables.


29.Now We can Post the journals.

Procure To Pay Cycle Query


Includes two scripts to fetch all the transactions information related with in a procure to pay cycle. 
Two scripts are provided to use one with receipts and other when receipts are not created. 

Few important fields that were included in the script are Requisition Number, Purchase Order Number,
Invoice Number, Customer Number, Invoice Amount, GL Transfer flag e.t.c

WITH OUT RECEIPTS

    -- WITH OUT RECEIPTS

    -- procure to pay cycle query

    select distinct

           reqh.segment1 REQ_NUM,

           reqh.AUTHORIZATION_STATUS REQ_STATUS,

    --              poh.po_header_id,

           poh.segment1 PO_NUM,
           pol.line_num,

           poh.AUTHORIZATION_STATUS PO_STATUS,

    --              i.invoice_id,

           i.invoice_num,

           i.invoice_amount,

           i.amount_paid,

            i.vendor_id,

    --              v.vendor_name,

    --              p.check_id,

           c.check_number,

           h.gl_transfer_flag,

           h.period_name 

    from ap_invoices_all i,

         ap_invoice_distributions_all invd,

         po_headers_all poh,

         po_lines_all pol,

         po_distributions_all pod,
         po_vendors v,

         po_requisition_headers_all reqh,

         po_requisition_lines_all reql,

         po_req_distributions_all reqd,    

         ap_invoice_payments_all p,

         ap_checks_all c,

         ap_ae_headers_all h,

         ap_ae_lines_all l

    where 1=1    

    and i.vendor_id = v.vendor_id

    and c.check_id = p.check_id

    and p.invoice_id = i.invoice_id

    and poh.PO_HEADER_ID = pol.PO_HEADER_ID

    and reqh.REQUISITION_HEADER_ID = reql.REQUISITION_HEADER_ID

    and reqd.REQUISITION_LINE_ID = reql.REQUISITION_LINE_ID

    and pod.REQ_DISTRIBUTION_ID = reqd.DISTRIBUTION_ID

    and pod.PO_HEADER_ID = poh.PO_HEADER_ID
    and pod.PO_DISTRIBUTION_ID = invd.PO_DISTRIBUTION_ID

    and invd.INVOICE_ID = i.INVOICE_ID

    and h.ae_header_id = l.ae_header_id

    and l.SOURCE_TABLE = 'AP_INVOICES'

    AND l.SOURCE_ID = i.invoice_id

    --and poh.segment1 = 4033816 -- PO NUMBER

    and reqh.segment1 = '501'   -- REQ NUMBER

    --and i.invoice_num = 3114          -- INVOICE NUMBER

    --and c.check_number =          -- CHECK NUMBER

        --and vendor_id =                    -- VENDOR ID   

Click here to copy script to clipboard

WITH RECEIPTS

-- PROCURE TO PAY CYCLE QUERY WITH RECEIPTS

SELECT DISTINCT reqh.segment1 req_num, reqh.authorization_status

req_status,              

      --              POH.PO_HEADER_ID,

                poh.segment1 po_num, pol.line_num,
                poh.authorization_status po_status, rcvh.receipt_num,

                rcv.inspection_status_code,

      --              I.INVOICE_ID,

                i.invoice_num, i.invoice_amount,

                i.amount_paid, i.vendor_id,

      --              V.VENDOR_NAME,

      --            P.CHECK_ID,

                c.check_number, h.gl_transfer_flag,

                h.period_name

           FROM ap_invoices_all i,

                ap_invoice_distributions_all invd,

                po_headers_all poh,

                po_lines_all pol,

                po_distributions_all pod,

                po_vendors v,

                po_requisition_headers_all reqh,

                po_requisition_lines_all reql,
                po_req_distributions_all reqd,

                rcv_transactions rcv,

                rcv_shipment_headers rcvh,

                rcv_shipment_lines rcvl,

                ap_invoice_payments_all p,

                ap_checks_all c,

                ap_ae_headers_all h,

                ap_ae_lines_all l

          WHERE 1 = 1

            AND i.vendor_id = v.vendor_id

            AND c.check_id = p.check_id

            AND p.invoice_id = i.invoice_id

            AND poh.po_header_id = pol.po_header_id

            AND reqh.requisition_header_id = reql.requisition_header_id

            AND reqd.requisition_line_id = reql.requisition_line_id

            AND pod.req_distribution_id = reqd.distribution_id

            AND pod.po_header_id = poh.po_header_id
            --AND POH.PO_HEADER_ID = RCV.PO_HEADER_ID

            AND rcvh.shipment_header_id = rcv.shipment_header_id(+)

            --AND RCVH.SHIPMENT_HEADER_ID = RCVL.SHIPMENT_HEADER_ID

            --AND RCV.TRANSACTION_TYPE = 'RECEIVE'

            --AND RCV.SOURCE_DOCUMENT_CODE = 'PO'

            --AND POL.PO_LINE_ID = RCV.PO_LINE_ID

            --AND POD.PO_DISTRIBUTION_ID = RCV.PO_DISTRIBUTION_ID

            AND pod.po_distribution_id = invd.po_distribution_id

            AND invd.invoice_id = i.invoice_id

            AND h.ae_header_id = l.ae_header_id

            AND l.source_table = 'AP_INVOICES'

            AND l.source_id = i.invoice_id

            --AND POH.SEGMENT1 = 36420 --  PO  NUMBER

            AND reqh.segment1 = '501'  -- REQ NUMBER

            --AND I.INVOICE_NUM = 3114          -- INVOICE NUMBER

            --AND C.CHECK_NUMBER =          -- CHECK NUMBER

            --AND VENDOR_ID =                    -- VENDOR ID


            --AND RECEIPT_NUM = 692237

Click here to copy script to clipboard

You might also like