Hi David,
thanks a lot for your great analysis help on this, I have now understood what
you mean after trying those new entities.
Also I prefer now to implement those specific entities instead of generic ones.
If I understood correctly it could be something similar to the following
examples:
<entity entity-name="PaymentGatewayConfig"
package-name="org.ofbiz.accounting.payment"
title="Payment Gateway Configuration">
<field name="paymentGatewayConfigId" type="id-ne"></field>
<field name="paymentGatewayTypeId" type="id-ne"></field>
<field name="description" type="very-long"></field>
<prim-key field="paymentGatewayConfigId"/>
<relation type="one" fk-name="PGC_ENUM" rel-entity-name="Enumeration">
<key-map field-name="paymentGatewayTypeId" rel-field-name="enumId"/>
</relation>
</entity>
<entity entity-name="PayflowPro"
package-name="org.ofbiz.accounting.payment"
title="Payflow Pro Payment Gateway Configuration">
<field name="payflowProId" type="id-ne"></field>
<field name="paymentGatewayConfigId" type="id-ne"></field>
<field name="certsPath" type="value"><description>Path the the VeriSign
Certificate</description></field>
<field name="hostAddress" type="value"><description>Address of the payment
processor</description></field>
<field name="hostPort" type="numeric"><description>Port of the payment
processor</description></field>
<field name="vendor" type="short-varchar"><description>Vendor of account
information</description></field>
<field name="userId" type="short-varchar"><description>PayFlow UserID of
account information</description></field>
<field name="pwd" type="short-varchar"><description>PayFlow Password of
account information</description></field>
<field name="partner" type="short-varchar"><description>PayFlow Partner of
account information</description></field>
<field name="checkAvs" type="indicator"><description>Use Address
Verification</description></field>
<field name="checkCvv2" type="indicator"><description>Require CVV2
Verification</description></field>
<field name="preAuth" type="indicator"><description>Pre-Authorize Payments
(if set to N will auto-capture)</description></field>
<field name="enableTransmit" type="indicator"><description>Set to N to not
transmit anything</description></field>
<prim-key field="payflowProId"/>
<relation type="one" fk-name="PFP_PGC"
rel-entity-name="PaymentGatewayConfig">
<key-map field-name="paymentGatewayConfigId"/>
</relation>
</entity>
<entity entity-name="ProductStorePaymentSetting"
package-name="org.ofbiz.product.store"
title="Product Store Payment Settings Entity">
<field name="productStoreId" type="id-ne"></field>
<field name="paymentMethodTypeId" type="id-ne"></field>
<field name="paymentServiceTypeEnumId" type="id-ne"></field>
<field name="paymentService" type="value"></field>
<field name="paymentGatewayConfigId" type="id-ne"></field>
<field name="paymentPropertiesPath" type="value"></field>
<field name="applyToAllProducts" type="indicator"></field>
<prim-key field="productStoreId"/>
<prim-key field="paymentMethodTypeId"/>
<prim-key field="paymentServiceTypeEnumId"/>
<relation type="one" fk-name="PRDS_PS_PRDS" rel-entity-name="ProductStore">
<key-map field-name="productStoreId"/>
</relation>
<relation type="one" fk-name="PRDS_PS_PMNTTP"
rel-entity-name="PaymentMethodType">
<key-map field-name="paymentMethodTypeId"/>
</relation>
<relation type="one" fk-name="PRDS_PS_ENUM" rel-entity-name="Enumeration">
<key-map field-name="paymentServiceTypeEnumId" rel-field-name="enumId"/>
</relation>
<relation type="one" fk-name="PRDS_PS_PGC"
rel-entity-name="PaymentGatewayConfig">
<key-map field-name="paymentGatewayConfigId"/>
</relation>
</entity>
This is an example of Payflow Pro Payment Gateway configuration:
<entity-engine-xml>
<PaymentMethodType description="Payflow Pro"
paymentMethodTypeId="EXT_PAYFLOW"/>
<EnumerationType enumTypeId="PGW_CODE" hasTable="N" description="Payment
Gateway"/>
<Enumeration enumId="PGW_PAYFLOWPRO" enumTypeId="PGW_CODE"
enumCode="PAYFLOWPRO" sequenceId="1" description="Payflow Pro"/>
<PaymentGatewayConfig paymentGatewayConfigId="PAYFLOW_TEST"
paymentGatewayTypeId="PGW_PAYFLOWPRO" description="PayFlow for test"/>
<PaymentGatewayConfig paymentGatewayConfigId="PAYFLOW_PROD"
paymentGatewayTypeId="PGW_PAYFLOWPRO" description="PayFlow for production"/>
<PayflowPro payflowProId="PAYFLOW_TEST"
paymentGatewayConfigId="PAYFLOW_TEST"
certsPath="${sys:getProperty('ofbiz.home')}/applications/accounting/pfcerts"
hostAddress="test-payflow.verisign.com" hostPort="443" vendor="TestVendor"
userId="TestUserID" pwd="TestPassword" partner="TestPartner" checkAvs="Y"
checkCvv2="Y" preAuth="Y" enableTransmit="Y"/>
<PayflowPro payflowProId="PAYFLOW_PROD"
paymentGatewayConfigId="PAYFLOW_PROD"
certsPath="${sys:getProperty('ofbiz.home')}/applications/accounting/pfcerts"
hostAddress="payflow.verisign.com" hostPort="443" vendor="ProdVendor"
userId="ProdUserID" pwd="ProdPassword" partner="ProdPartner" checkAvs="Y"
checkCvv2="Y" preAuth="Y" enableTransmit="Y"/>
<ProductStorePaymentSetting productStoreId="9000"
paymentMethodTypeId="EXT_PAYFLOW" paymentServiceTypeEnumId="PRDS_PAY_EXTERNAL"
paymentService="" paymentGatewayConfigId="PAYFLOW_TEST"
paymentPropertiesPath="" applyToAllProducts=""/>
</entity-engine-xml>
In this way we could handle also different configuration per database
(test/production/...) and product stores.
Idea and suggestions are welcome.
Thanks a lot
Marco
>
> This has been discussed a few times and I think is on a few of the
> lists around were people have brainstormed on things they'd like to
> add/change/etc. I'm personally very in favor of it and I do believe it
> has been needed for a long time.
>
> As for the design, I'm very against the concept of super-generic
> entities like this. They cause all sorts of problems, and I wish now
> that I had never even introduced the extensibility stuff (attribute
> tables and such) as they tend to make things messy and difficult to
> follow and maintain... if/when they are used.
>
> It won't be too difficult to add fields and entities for each property
> in the files. With actual entities and fields generic maintenance can
> be done through the Entity Data Maintenance pages, and for more user
> friendly stuff we'd want a less generic UI anyway, and it's a lot
> easier to implement that specific entities instead of generic ones.
>
> For example, we would create a PaymentGatewayConfig entity and
> entities that extend it where needed for Cybersource, PayflowPro,
> PayPal, etc, etc. The main change is that on the
> ProductStorePaymentSetting entity instead of using the
> "paymentPropertiesPath" field we would add a paymentGatewayConfigId
> that points to the corresponding PaymentGatewayConfig entity. That
> entity would have a type field, with different values for different
> payment gateways (ie CyberSource, PayflowPro, etc).
>
> Each property in the payment.properties file would be mapped to a
> field on one of these entities.
>
> Does that make sense?
>
> -David
>
>
>
> On Mar 30, 2009, at 4:14 AM, [email protected] wrote:
>
> > Hi to all,
> >
> > what did you think if we move the payment.properties to an entity ?
> > I tried to having a more general entity but I have seen that every
> > single payment gateway having different parameters and so I tried
> > with the following example:
> >
> > <EnumerationType description="Payment Gateway Code"
> > enumTypeId="PGW_CODE" hasTable="N" parentTypeId=""/>
> > <Enumeration description="Gift Certificate"
> > enumCode="GIFTCERTIFICATE" enumId="PGW_GIFTCERTIFICATE"
> > sequenceId="01" enumTypeId="PGW_CODE"/>
> > <Enumeration description="CyberSource" enumCode="CYBERSOURCE"
> > enumId="PGW_CYBERSOURCE" sequenceId="02" enumTypeId="PGW_CODE"/>
> > <Enumeration description="ClearCommerce" enumCode="CLEARCOMMERCE"
> > enumId="PGW_CLEARCOMMERCE" sequenceId="03" enumTypeId="PGW_CODE"/>
> > <Enumeration description="ValueLink" enumCode="VALUELINK"
> > enumId="PGW_VALUELINK" sequenceId="04" enumTypeId="PGW_CODE"/>
> > <Enumeration description="PayFlow Pro" enumCode="PAYFLOW"
> > enumId="PGW_PAYFLOW" sequenceId="05" enumTypeId="PGW_CODE"/>
> > <Enumeration description="WorldPay" enumCode="WORLDPAY"
> > enumId="PGW_WORLDPAY" sequenceId="06" enumTypeId="PGW_CODE"/>
> > <Enumeration description="PayPal" enumCode="PAYPAL"
> > enumId="PGW_PAYPAL" sequenceId="07" enumTypeId="PGW_CODE"/>
> > <Enumeration description="PCCharge" enumCode="PCCHARGE"
> > enumId="PGW_PCCHARGE" sequenceId="08" enumTypeId="PGW_CODE"/>
> > <Enumeration description="RiTA" enumCode="RITA" enumId="PGW_RITA"
> > sequenceId="09" enumTypeId="PGW_CODE"/>
> > <Enumeration description="Authorize.Net" enumCode="AUTHORIZEDOTNET"
> > enumId="PGW_AUTHORIZEDOTNET" sequenceId="10" enumTypeId="PGW_CODE"/>
> >
> > <!-- Product store gateway setting -->
> > <ProductStoreGatewaySetting productStoreId="9000"
> > gatewayEnumId="PGW_PAYFLOW" attributeKey="certsPath"
> > attributeValue="${sys:getProperty('ofbiz.home')}/applications/
> > accounting/pfcerts" activeAttribute="Y" comment="Path the the
> > VeriSign Certificate"/>
> > <ProductStoreGatewaySetting productStoreId="9000"
> > gatewayEnumId="PGW_PAYFLOW" attributeKey="hostAddress"
> > attributeValue="test-payflow.verisign.com" activeAttribute="Y"
> > comment="Address of the payment processor"/>
> > <ProductStoreGatewaySetting productStoreId="9000"
> > gatewayEnumId="PGW_PAYFLOW" attributeKey="hostPort"
> > attributeValue="443" activeAttribute="Y" comment="Port of the
> > payment processor"/>
> > <ProductStoreGatewaySetting productStoreId="9000"
> > gatewayEnumId="PGW_PAYFLOW" attributeKey="vendor"
> > attributeValue="[Vendor]" activeAttribute="Y" comment="Payflow
> > account information (Vendor)"/>
> > <ProductStoreGatewaySetting productStoreId="9000"
> > gatewayEnumId="PGW_PAYFLOW" attributeKey="user"
> > attributeValue="[PayFlow UserID]" activeAttribute="Y"
> > comment="Payflow account information (PayFlow UserID)"/>
> > <ProductStoreGatewaySetting productStoreId="9000"
> > gatewayEnumId="PGW_PAYFLOW" attributeKey="pwd"
> > attributeValue="[PayFlow Password]" activeAttribute="Y"
> > comment="Payflow account information (PayFlow Password)"/>
> > <ProductStoreGatewaySetting productStoreId="9000"
> > gatewayEnumId="PGW_PAYFLOW" attributeKey="partner"
> > attributeValue="[PayFlow Partner]" activeAttribute="Y"
> > comment="Payflow account information (PayFlow Partner)"/>
> > <ProductStoreGatewaySetting productStoreId="9000"
> > gatewayEnumId="PGW_PAYFLOW" attributeKey="checkAvs"
> > attributeValue="Y" activeAttribute="Y" comment="Use Address
> > Verification"/>
> > <ProductStoreGatewaySetting productStoreId="9000"
> > gatewayEnumId="PGW_PAYFLOW" attributeKey="checkCvv2"
> > attributeValue="Y" activeAttribute="Y" comment="Require CVV2
> > Verification"/>
> > <ProductStoreGatewaySetting productStoreId="9000"
> > gatewayEnumId="PGW_PAYFLOW" attributeKey="preAuth"
> > attributeValue="Y" activeAttribute="Y" comment="Pre-Authorize
> > Payments (if set to N will auto-capture)"/>
> > <ProductStoreGatewaySetting productStoreId="9000"
> > gatewayEnumId="PGW_PAYFLOW" attributeKey="enableTransmit"
> > attributeValue="true" activeAttribute="Y" comment="Set to false to
> > not transmit anything "/>
> >
> >
> > Once we have it into the DB it could be extended in a custom
> > components (hot-deploy) and it could be cashed and it could be no
> > more necessary to restart OFBiz once you have to change a value into
> > this property file.
> > I have also moved those parameters at product store level so you
> > could have different configuration by product store.
> >
> > It's only an idea and it could be introduced also after that new
> > OFBiz release has been created.
> >
> > Any ideas and suggestions are welcomed because if it's working
> > correctly for everyone it could be extended also to others property
> > files (shipment.properties, catalog.properties, ...).
> >
> > Thanks in advance
> > Marco
> >
>
>