Hi Scott, So say add a Term Type on the Order Entry Order Terms page of the Purchase Order workflow that would create the invoice immediately if required a bit like selecting Payment (net days) = 0 days, which does not work or we would have used that but I am sure you get my meaning.
Cheers Sam On 05/05/2010 12:21, Scott Gray wrote: > Hi Sam, > > It sounds like a shortcut is being taken in place of properly modeling the > business process. > > I guess at the very least an agreement of some sort should be attached to the > order which results in the payment being created. That would be your > "switch", the payment is only generated if the agreements in place require it. > > Ideally there would be some sort of RFQ process that automates the bulk of > the work from the time that you approve your product requirements but that's > another story. > > Regards > Scott > > On 5/05/2010, at 3:00 PM, Sam Hamilton wrote: > >> Hi Scott, >> >> We will ring a supplier and get a quote for a product, agree the terms >> e.g. pay first then they send the goods or 30 days credit or pay on >> delivery of goods. Then create a Purchase Order and then wire them the >> payment, the goods will then be delivered to our warehouse where we >> receive against the PO. >> >> Sometimes the supplier can send too much or too little goods at which >> point either our purchasing department chases them for more products or >> we then send an additional wire for the extra cash or we get credit from >> the supplier to use against the next order. >> >> From my understanding of the flow of OFBiz you need to create the >> Purchase Order, approve it and then once the goods have been received in >> full the Purchase Invoice is generated which then kicks in the >> Agreements which you set during the creation of the Purchase Invoice and >> finally the Purchase Invoice is shown to the Accounts Payable team for >> payment. >> >> Yes I agree that this seems the wrong way round but this is how the >> business is done here and I can't change that - China can seem very >> inefficient at times. >> >> Perhaps a On/Off switch for this code could be made - then it suits all >> companies? How best to make this work for everyone? >> >> Cheers >> Sam >> >> >> >> On 05/05/2010 10:34, Scott Gray wrote: >>> Surely they invoice you beforehand though? >>> >>> The payment should be created based on that. >>> >>> Regards >>> Scott >>> >>> On 5/05/2010, at 2:28 PM, Sam Hamilton wrote: >>> >>>> Hi Guys, >>>> >>>> Its for suppliers who need the payment of the invoice before the goods >>>> will be shipped e.g. they don't give credit. >>>> >>>> Sam >>>> >>>> >>>> On 05/05/2010 10:24, BJ Freeman wrote: >>>>> more for my understanding, I believe an invoice for a PO is internal not >>>>> sent to the supplier, if I remember a previous thread on the ml. >>>>> and that it is used to reconcile against the invoice received from the >>>>> supplier. >>>>> I did something similar. >>>>> >>>>> ======================== >>>>> >>>>> BJ Freeman >>>>> http://bjfreeman.elance.com >>>>> Strategic Power Office with Supplier Automation >>>>> <http://www.businessesnetwork.com/automation/viewforum.php?f=93> >>>>> Specialtymarket.com <http://www.specialtymarket.com/> >>>>> >>>>> Systems Integrator-- Glad to Assist >>>>> >>>>> Chat Y! messenger: bjfr33man >>>>> Linkedin >>>>> <http://www.linkedin.com/profile?viewProfile=&key=1237480&locale=en_US&trk=tab_pro> >>>>> >>>>> >>>>> Scott Gray sent the following on 5/4/2010 6:56 PM: >>>>>> Hi Hans, >>>>>> >>>>>> Wouldn't you do this when an order is received (i.e. an invoice created) >>>>>> rather than when the order is placed? >>>>>> >>>>>> Typically payment due dates are based on the invoice date not the order >>>>>> date. >>>>>> >>>>>> Regards >>>>>> Scott >>>>>> >>>>>> HotWax Media >>>>>> http://www.hotwaxmedia.com >>>>>> >>>>>> On 5/05/2010, at 1:43 PM, [email protected] wrote: >>>>>> >>>>>>> Author: hansbak >>>>>>> Date: Wed May 5 01:43:45 2010 >>>>>>> New Revision: 941132 >>>>>>> >>>>>>> URL: http://svn.apache.org/viewvc?rev=941132&view=rev >>>>>>> Log: >>>>>>> Create a payment with the status 'not-paid' when a purchase order is >>>>>>> approved setting the payment date according agreements >>>>>>> >>>>>>> Modified: >>>>>>> >>>>>>> ofbiz/trunk/applications/accounting/script/org/ofbiz/accounting/payment/PaymentServices.xml >>>>>>> ofbiz/trunk/applications/accounting/servicedef/services_payment.xml >>>>>>> ofbiz/trunk/applications/order/servicedef/secas.xml >>>>>>> >>>>>>> Modified: >>>>>>> ofbiz/trunk/applications/accounting/script/org/ofbiz/accounting/payment/PaymentServices.xml >>>>>>> URL: >>>>>>> http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/script/org/ofbiz/accounting/payment/PaymentServices.xml?rev=941132&r1=941131&r2=941132&view=diff >>>>>>> ============================================================================== >>>>>>> --- >>>>>>> ofbiz/trunk/applications/accounting/script/org/ofbiz/accounting/payment/PaymentServices.xml >>>>>>> (original) >>>>>>> +++ >>>>>>> ofbiz/trunk/applications/accounting/script/org/ofbiz/accounting/payment/PaymentServices.xml >>>>>>> Wed May 5 01:43:45 2010 >>>>>>> @@ -746,4 +746,72 @@ under the License. >>>>>>> <clear-field field="setPaymentStatusMap"/> >>>>>>> </iterate> >>>>>>> </simple-method> >>>>>>> -</simple-methods> >>>>>>> + >>>>>>> + <simple-method method-name="createPaymentFromOrder" >>>>>>> short-description="Service auto create Payment from Order"> >>>>>>> + <entity-one value-field="orderHeader" >>>>>>> entity-name="OrderHeader"/> >>>>>>> + <entity-and list="orderRoleToList" entity-name="OrderRole"> >>>>>>> + <field-map field-name="orderId" >>>>>>> from-field="orderHeader.orderId"/> >>>>>>> + <field-map field-name="roleTypeId" >>>>>>> value="BILL_FROM_VENDOR"/> >>>>>>> + </entity-and> >>>>>>> + <first-from-list entry="orderRoleTo" list="orderRoleToList"/> >>>>>>> + <entity-and list="orderRoleFromList" entity-name="OrderRole"> >>>>>>> + <field-map field-name="orderId" >>>>>>> from-field="orderHeader.orderId"/> >>>>>>> + <field-map field-name="roleTypeId" >>>>>>> value="BILL_TO_CUSTOMER"/> >>>>>>> + </entity-and> >>>>>>> + <first-from-list entry="orderRoleFrom" >>>>>>> list="orderRoleFromList"/> >>>>>>> + <if-compare operator="equals" value="PURCHASE_ORDER" >>>>>>> field="orderHeader.orderTypeId"> >>>>>>> + <entity-and list="agreementList" entity-name="Agreement" >>>>>>> filter-by-date="true"> >>>>>>> + <field-map field-name="partyIdFrom" >>>>>>> from-field="orderRoleFrom.partyId"/> >>>>>>> + <field-map field-name="partyIdTo" >>>>>>> from-field="orderRoleTo.partyId"/> >>>>>>> + <field-map field-name="agreementTypeId" >>>>>>> value="PURCHASE_AGREEMENT"/> >>>>>>> + </entity-and> >>>>>>> + <set field="parameters.paymentTypeId" >>>>>>> value="VENDOR_PAYMENT"/> >>>>>>> + <else> >>>>>>> + <entity-and list="agreementList" >>>>>>> entity-name="Agreement" filter-by-date="true"> >>>>>>> + <field-map field-name="partyIdFrom" >>>>>>> from-field="orderRoleFrom.partyId"/> >>>>>>> + <field-map field-name="partyIdTo" >>>>>>> from-field="orderRoleTo.partyId"/> >>>>>>> + <field-map field-name="agreementTypeId" >>>>>>> value="SALES_AGREEMENT"/> >>>>>>> + </entity-and> >>>>>>> + <set field="parameters.paymentTypeId" >>>>>>> value="CUSTOMER_PAYMENT"/> >>>>>>> + </else> >>>>>>> + </if-compare> >>>>>>> + <first-from-list entry="agreement" list="agreementList"/> >>>>>>> + <if-not-empty field="agreement"> >>>>>>> + <entity-and list="orderTermList" entity-name="OrderTerm"> >>>>>>> + <field-map field-name="orderId" >>>>>>> from-field="orderHeader.orderId"/> >>>>>>> + <field-map field-name="termTypeId" >>>>>>> value="FIN_PAYMENT_TERM"/> >>>>>>> + </entity-and> >>>>>>> + <first-from-list entry="orderTerm" list="orderTermList"/> >>>>>>> + <if-not-empty field="orderTerm.termDays"> >>>>>>> + <set field="days" from-field="orderTerm.termDays" >>>>>>> type="Integer"/> >>>>>>> + <now-timestamp field="start"/> >>>>>>> + <call-class-method >>>>>>> class-name="org.ofbiz.base.util.UtilDateTime" >>>>>>> method-name="addDaysToTimestamp" ret-field="parameters.effectiveDate"> >>>>>>> + <field field="start" type="java.sql.Timestamp"/> >>>>>>> + <field field="days" type="int"/> >>>>>>> + </call-class-method> >>>>>>> + </if-not-empty> >>>>>>> + </if-not-empty> >>>>>>> + <if-empty field="parameters.effectiveDate"> >>>>>>> + <now-timestamp field="parameters.effectiveDate"/> >>>>>>> + </if-empty> >>>>>>> + <set field="parameters.partyIdFrom" >>>>>>> from-field="orderRoleFrom.partyId"/> >>>>>>> + <set field="parameters.partyIdTo" >>>>>>> from-field="orderRoleTo.partyId"/> >>>>>>> + <set field="parameters.amount" >>>>>>> from-field="orderHeader.grandTotal"/> >>>>>>> + <set field="parameters.currencyUomId" >>>>>>> from-field="orderHeader.currencyUom"/> >>>>>>> + <set field="parameters.paymentMethodTypeId" >>>>>>> value="COMPANY_ACCOUNT"/> >>>>>>> + <set field="parameters.statusId" value="PMNT_NOT_PAID"/> >>>>>>> + <set-service-fields service-name="createPayment" >>>>>>> to-map="createPayment" map="parameters"/> >>>>>>> + <call-service service-name="createPayment" >>>>>>> in-map-name="createPayment"> >>>>>>> + <result-to-field result-name="paymentId" >>>>>>> field="parameters.paymentId"/> >>>>>>> + </call-service> >>>>>>> + <set field="parameters.orderId" >>>>>>> from-field="orderHeader.orderId"/> >>>>>>> + <set field="parameters.maxAmount" >>>>>>> from-field="orderHeader.grandTotal"/> >>>>>>> + <set-service-fields >>>>>>> service-name="createOrderPaymentPreference" >>>>>>> to-map="newOrderPaymentPreference" map="parameters"/> >>>>>>> + <call-service service-name="createOrderPaymentPreference" >>>>>>> in-map-name="newOrderPaymentPreference"> >>>>>>> + <result-to-field result-name="orderPaymentPreferenceId" >>>>>>> field="parameters.paymentPreferenceId"/> >>>>>>> + </call-service> >>>>>>> + <set-service-fields service-name="updatePayment" >>>>>>> to-map="updatePayment" map="parameters"/> >>>>>>> + <call-service service-name="updatePayment" >>>>>>> in-map-name="updatePayment"/> >>>>>>> + <field-to-result field="parameters.paymentId" >>>>>>> result-name="paymentId"/> >>>>>>> + </simple-method> >>>>>>> +</simple-methods> >>>>>>> \ No newline at end of file >>>>>>> >>>>>>> Modified: >>>>>>> ofbiz/trunk/applications/accounting/servicedef/services_payment.xml >>>>>>> URL: >>>>>>> http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/servicedef/services_payment.xml?rev=941132&r1=941131&r2=941132&view=diff >>>>>>> ============================================================================== >>>>>>> --- ofbiz/trunk/applications/accounting/servicedef/services_payment.xml >>>>>>> (original) >>>>>>> +++ ofbiz/trunk/applications/accounting/servicedef/services_payment.xml >>>>>>> Wed May 5 01:43:45 2010 >>>>>>> @@ -233,4 +233,11 @@ under the License. >>>>>>> <attribute name="statusId" type="String" mode="IN" >>>>>>> optional="false"/> >>>>>>> <attribute name="errorMessage" type="String" optional="true" >>>>>>> mode="OUT"/> >>>>>>> </service> >>>>>>> + >>>>>>> + <service name="createPaymentFromOrder" engine="simple" >>>>>>> + >>>>>>> location="component://accounting/script/org/ofbiz/accounting/payment/PaymentServices.xml" >>>>>>> invoke="createPaymentFromOrder" auth="true"> >>>>>>> + <description>create Payment from Order</description> >>>>>>> + <attribute name="orderId" type="String" mode="IN" >>>>>>> optional="false"/> >>>>>>> + <attribute name="paymentId" type="String" mode="OUT" >>>>>>> optional="false"/> >>>>>>> + </service> >>>>>>> </services> >>>>>>> >>>>>>> Modified: ofbiz/trunk/applications/order/servicedef/secas.xml >>>>>>> URL: >>>>>>> http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/servicedef/secas.xml?rev=941132&r1=941131&r2=941132&view=diff >>>>>>> ============================================================================== >>>>>>> --- ofbiz/trunk/applications/order/servicedef/secas.xml (original) >>>>>>> +++ ofbiz/trunk/applications/order/servicedef/secas.xml Wed May 5 >>>>>>> 01:43:45 2010 >>>>>>> @@ -93,6 +93,12 @@ under the License. >>>>>>> <action service="resetGrandTotal" mode="sync"/> >>>>>>> <action service="sendOrderCompleteNotification" mode="async" >>>>>>> persist="true"/> >>>>>>> </eca> >>>>>>> + <eca service="changeOrderStatus" event="commit" >>>>>>> run-on-error="false"> >>>>>>> + <condition field-name="orderTypeId" operator="equals" >>>>>>> value="PURCHASE_ORDER"/> >>>>>>> + <condition field-name="statusId" operator="equals" >>>>>>> value="ORDER_APPROVED"/> >>>>>>> + <condition-field field-name="statusId" operator="not-equals" >>>>>>> to-field-name="oldStatusId"/> >>>>>>> + <action service="createPaymentFromOrder" mode="sync" >>>>>>> persist="true"/> >>>>>>> + </eca> >>>>>>> >>>>>>> <!-- DISABLED FOR NOW >>>>>>> <eca service="changeOrderStatus" event="commit" run-on-error="false"> >>>>>>> >>>>>>> >>>>>> >>>>> >>>>> >>>> >>> >> >
