dellermann / springcrm Goto Github PK
View Code? Open in Web Editor NEWAn open-source CRM.
License: GNU General Public License v3.0
An open-source CRM.
License: GNU General Public License v3.0
We should store the creator along each invoicing transaction such as invoice, quote etc. This user should be used when generating the print version.
The sales journal should include the closing balance of the preceding year. However, since computing the closing balance of a whole year may be time-consuming, we should store it in a cache and offer the user a button to re-compute it.
Also, the closing balance of the preceding month should be included in the sales journal.
Related to Bugzilla bug 250.
For some of our customers we need multiple lines in the subject of invoices, quotes etc. Therefore you should implement a textarea for the subject field and render the text multi-line.
I get an optimistic locking failure when displaying an invoice in the show view
(see error report).
<?xml version="1.0"?>
<error-report xmlns="http://www.amc-world.de/data/xml/springcrm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.amc-world.de/data/xml/springcrm http://www.amc-world.de/data/xml/springcrm/error-report-1.1.xsd">
<report-version>1.1</report-version>
<application>
<version>1.2.3</version>
<build-number>1289</build-number>
<build-date>2012-08-25T00:09:04+0200</build-date>
<build-profile>live</build-profile>
</application>
<customer>
<name>Daniel Ellermann</name>
<email>[email protected]</email>
</customer>
<description>Beim Aufruf einer Rechnung in der Show-View.</description>
<details>
<status-code>500</status-code>
<message>Object of class [org.amcworld.springcrm.User] with identifier [1]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [org.amcworld.springcrm.User#1]</message>
<servlet>grails</servlet>
<uri>/springcrm/grails/invoice/list.dispatch</uri>
</details>
<exception>
<message>Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [org.amcworld.springcrm.User#1]</message>
<caused-by>Object of class [org.amcworld.springcrm.User] with identifier [1]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [org.amcworld.springcrm.User#1]</caused-by>
<class-name>ViewFilters</class-name>
<line-number>71</line-number>
<code-snippet>
</code-snippet>
<stack-trace>
org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: Object of class [org.amcworld.springcrm.User] with identifier [1]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [org.amcworld.springcrm.User#1]
at org.amcworld.springcrm.ViewFilters$_closure1_closure2_closure7.doCall(ViewFilters.groovy:71)
at java.lang.Thread.run(Thread.java:662)
Caused by: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [org.amcworld.springcrm.User#1]
... 2 more
</stack-trace>
</exception>
</error-report>
Related to Bugzilla bug 262.
When I edit a record from the LRU panel on the overview page and save it I'm redirected to a wrong URL. For example, on my SpringCRM server with the base URL http://crm.amc-world.de/springcrm/ the return URL is http://localhost:8080/springcrm/
. This could be a problem caused by reverse proxy configuration on that server.
You should add a new field "title" to the person record and synchronize it with Google and LDAP.
If the session expires and the user is currently working on a form the user looses all his input because he is redirected to the login page.
If the session expires we should temporarily store all submitted data, redirect the user to the login page, and after perform the former operation (e. g. storing the form data) again.
Related to Bugzilla bug 208.
Currently, we have a configuration setting to influence the number of fractional digits in the whole application. However, we need two separate settings: one for internal use and one for external use.
For example, in Germany, many companies calculate with three fractional digits internally. But in quotes, invoices, payment amounts, and all the print versions there must be two fractional digits.
It would be helpful if the user can create an invoice (or similar) from more than one sales orders or quotes, respectively. The procedure is valid for other transactions, too:
I see two ways to implement this, described at the example of invoices:
The user gets a button where she can select a record (quote, sales order). After doing so, the invoicing items are added to the currently edited invoice. This is easy to implement but hides the relations between quotes, sales orders, and invoices. For example, a sales order added via this button doesn't have associated the edited invoice.
We implement an m:n relation between invoicing transactions. This allows an invoice to refer both to quotes and sales orders. There is no need to distinguish between them. In the view we need a control to select more than one invoicing transactions. If the user adds a new quote or sales order to the invoice, its items are added to this invoice. This approach is expensive to implement. Furthermore, we have to clarify how to handle removal of associated quotes or sales orders.
If there are invalid LDAP connection data, base DN etc. or the specified LDAP server is not available you should not display an application error but a graceful warning to the user combined with a link to edit the LDAP settings.
When trying to save sequence numbers in the settings area I get the following error message:
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '15000' with class 'java.lang.String' to class 'int'
at org.amcworld.springcrm.ConfigController.saveSeqNumbers(ConfigController.groovy:247)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
When I submit an error report, the view is destroyed:
I search for the term "Euroregion" and get an exception:
<?xml version="1.0"?>
<error-report xmlns="http://www.amc-world.de/data/xml/springcrm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.amc-world.de/data/xml/springcrm http://www.amc-world.de/data/xml/springcrm/error-report-1.1.xsd">
<report-version>1.1</report-version>
<application>
<version>1.4.5</version>
<build-number>5037</build-number>
<build-date>2013-12-04T18:36:35+0100</build-date>
<build-profile>production</build-profile>
</application>
<customer>
<name>Daniel Ellermann</name>
<email>[email protected]</email>
</customer>
<description>Bei der Suche nach dem Begriff „Euroregion“.</description>
<details>
<status-code>500</status-code>
<message>Executing action [index] of controller [grails.plugin.searchable.SearchableController] in plugin [searchable] caused exception: Runtime error executing action</message>
<servlet>grails</servlet>
<uri>/springcrm/grails/searchable/index.dispatch</uri>
</details>
<exception>
<message>field "number" does not appear to be indexed</message>
<caused-by>field "number" does not appear to be indexed</caused-by>
<class-name>SearchableController</class-name>
<line-number>36</line-number>
<code-snippet>
</code-snippet>
<stack-trace>
java.lang.RuntimeException: field "number" does not appear to be indexed
at org.apache.lucene.search.ExtendedFieldCacheImpl$5.createValue(ExtendedFieldCacheImpl.java:173)
at org.apache.lucene.search.FieldCacheImpl$Cache.get(FieldCacheImpl.java:71)
at org.apache.lucene.search.ExtendedFieldCacheImpl.getAuto(ExtendedFieldCacheImpl.java:127)
at org.apache.lucene.search.FieldSortedHitQueue.comparatorAuto(FieldSortedHitQueue.java:487)
at org.apache.lucene.search.FieldSortedHitQueue$1.createValue(FieldSortedHitQueue.java:184)
at org.apache.lucene.search.FieldCacheImpl$Cache.get(FieldCacheImpl.java:71)
at org.apache.lucene.search.FieldSortedHitQueue.getCachedComparator(FieldSortedHitQueue.java:167)
at org.apache.lucene.search.FieldSortedHitQueue.<init>(FieldSortedHitQueue.java:55)
at org.apache.lucene.search.TopFieldDocCollector.<init>(TopFieldDocCollector.java:43)
at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:121)
at org.apache.lucene.search.MultiSearcher.search(MultiSearcher.java:232)
at org.apache.lucene.search.Hits.getMoreDocs(Hits.java:113)
at org.apache.lucene.search.Hits.<init>(Hits.java:90)
at org.apache.lucene.search.Searcher.search(Searcher.java:61)
at org.compass.core.lucene.engine.transaction.support.AbstractTransactionProcessor.findByQuery(AbstractTransactionProcessor.java:146)
at org.compass.core.lucene.engine.transaction.readcommitted.ReadCommittedTransactionProcessor.doFind(ReadCommittedTransactionProcessor.java:259)
at org.compass.core.lucene.engine.transaction.support.AbstractConcurrentTransactionProcessor.find(AbstractConcurrentTransactionProcessor.java:246)
at org.compass.core.lucene.engine.LuceneSearchEngine.find(LuceneSearchEngine.java:352)
at org.compass.core.lucene.engine.LuceneSearchEngineQuery.hits(LuceneSearchEngineQuery.java:188)
at org.compass.core.impl.DefaultCompassQuery.hits(DefaultCompassQuery.java:199)
at grails.plugin.searchable.internal.compass.search.DefaultSearchMethod$SearchCompassCallback.doInCompass(DefaultSearchMethod.java:109)
at org.compass.core.CompassTemplate.execute(CompassTemplate.java:133)
at grails.plugin.searchable.internal.compass.support.AbstractSearchableMethod.doInCompass(AbstractSearchableMethod.java:56)
at grails.plugin.searchable.internal.compass.search.DefaultSearchMethod.invoke(DefaultSearchMethod.java:71)
at grails.plugin.searchable.SearchableService.search(SearchableService.groovy:39)
at grails.plugin.searchable.SearchableController$_closure1.doCall(SearchableController.groovy:36)
</stack-trace>
</exception>
</error-report>
The application error page contains a wrong link to AMC World's Bugzilla instead of a link to GitHub.
Add a field to specify a relative date for due dates in invoices or valid until in quotes. So the user can specify for example 14 days after today.
Related to Bugzilla bug 182.
I detected two errors concerning LDAP:
The installer should be disabled automatically after a particular time. This is needed for security reasons.
Related to Bugzilla bug 237.
The user may specify a suffix for all sequence numbers. However, that suffix isn't used when generating the numbers.
We should improve inline calendars to allow selection of dates 3 or 4 weeks in future. Either the calendar should show two month simultaneously or allow scrolling of month.
When I try to create a calendar entry I always get an input error. But I cannot see which field is filled in incorrectly or not at all.
If a payment date in an invoice already exists changing the invoice status must not overwrite it.
I get a page not found error when doing the following things:
It seems that the submitted return URL is not correct.
Former Bugzilla bug 271.
When I save a purchase invoice together with a document the document is correctly stored in the file system but the MIME type is not recognized correctly.
When I click on "sales journal" in the demo (http://demo.springcrm.de) I get an empty page.
In one of my production environments on my server the web application starts, though, but when calling the login page (user/login
) the page is not completely loaded and a timeout occurs. In the other production environment everything is fine.
This is a feature request by Gaby Lingath (Link SEO): it should be possible to assign a purchase invoice to one or more customers and to list these purchase invoices as embedded list in the show view of the customer.
Related to Bugzilla bug 260.
You should change the previous data according to the changes in SEPA in Germany, 2014.
When I create or edit a person record no stylesheet is loaded. In the header of the generated HTML is the following line:
<meta name="stylesheet" content="person-form"/>
It seems the content
attribute should be replaced by href
.
After creating an administrator in the installer I get the following exception (see below). The error occurred in the standalone version.
type Exception report
message
description The server encountered an internal error () that prevented it from
fulfilling this request.
exception
org.codehaus.groovy.grails.web.pages.exceptions.GroovyPagesException: Error
applying layout : main
org.codehaus.groovy.grails.web.sitemesh.SpringMVCViewDecorator.render(SpringMVCViewDecorator.java:74)
org.codehaus.groovy.grails.web.sitemesh.SpringMVCViewDecorator.render(SpringMVCViewDecorator.java:52)
org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter.doFilter(GrailsPageFilter.java:160)
org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:69)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
org.codehaus.groovy.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:65)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
root cause
org.codehaus.groovy.grails.web.pages.exceptions.GroovyPagesException: Error
processing GroovyPageView: Error executing tag <r:script>: Cannot get property
'fontSize' on null object
org.codehaus.groovy.grails.web.servlet.view.GroovyPageView.createGroovyPageException(GroovyPageView.java:205)
org.codehaus.groovy.grails.web.servlet.view.GroovyPageView.handleException(GroovyPageView.java:181)
org.codehaus.groovy.grails.web.servlet.view.GroovyPageView.renderWithTemplateEngine(GroovyPageView.java:152)
org.codehaus.groovy.grails.web.servlet.view.GroovyPageView.renderMergedOutputModel(GroovyPageView.java:83)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:262)
org.codehaus.groovy.grails.web.sitemesh.SpringMVCViewDecorator.render(SpringMVCViewDecorator.java:67)
org.codehaus.groovy.grails.web.sitemesh.SpringMVCViewDecorator.render(SpringMVCViewDecorator.java:52)
org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter.doFilter(GrailsPageFilter.java:160)
org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:69)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
org.codehaus.groovy.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:65)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
root cause
org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException: Error
executing tag <r:script>: Cannot get property 'fontSize' on null object
gsp_springcrm_layoutsmain_gsp$_run_closure1.doCall(main.gsp:15)
gsp_springcrm_layoutsmain_gsp.run(main.gsp:17)
root cause
java.lang.NullPointerException: Cannot get property 'fontSize' on null object
org.amcworld.springcrm.UserTagLib$_closure2.doCall(UserTagLib.groovy:50)
gsp_springcrm_layoutsmain_gsp$_run_closure1_closure4.doCall(main.gsp:12)
org.grails.plugin.resource.ResourceTagLib$_closure7.doCall(ResourceTagLib.groovy:420)
gsp_springcrm_layoutsmain_gsp$_run_closure1.doCall(main.gsp:15)
gsp_springcrm_layoutsmain_gsp.run(main.gsp:17)
Related to Bugzilla bug 234. There is also an additional stacktrace stored.
I created a purchase invoice and added a document but the document was not stored along the purchase invoice.
If I click on an invoice in the sales journal and then return to it my previous view (month and year or whole year) is no longer available. The software should remember my last view.
A user reported an exception when updating a quote. The error seems to be caused by added invoicing items and updating the invoicing transaction (here: the quote).
<?xml version="1.0"?>
<error-report xmlns="http://www.amc-world.de/data/xml/springcrm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.amc-world.de/data/xml/springcrm http://www.amc-world.de/data/xml/springcrm/error-report-1.1.xsd">
<report-version>1.1</report-version>
<application>
<version>1.2.5</version>
<build-number>1489</build-number>
<build-date>2012-11-29T16:00:52+0100</build-date>
<build-profile>live</build-profile>
</application>
<customer>
<name>Robert</name>
<email>[email protected]</email>
</customer>
<description></description>
<details>
<status-code>500</status-code>
<message>null id in org.amcworld.springcrm.InvoicingItem entry (don't flush the Session after an exception occurs)</message>
<servlet>grails</servlet>
<uri>/springcrm/grails/quote/update.dispatch</uri>
</details>
<exception>
<message>null id in org.amcworld.springcrm.InvoicingItem entry (don't flush the Session after an exception occurs)</message>
<caused-by>null id in org.amcworld.springcrm.InvoicingItem entry (don't flush the Session after an exception occurs)</caused-by>
<class-name>LruFilters</class-name>
<line-number>68</line-number>
<code-snippet>
</code-snippet>
<stack-trace>
org.hibernate.AssertionFailure: null id in org.amcworld.springcrm.InvoicingItem entry (don't flush the Session after an exception occurs)
at grails.orm.HibernateCriteriaBuilder.invokeMethod(HibernateCriteriaBuilder.java:1591)
at org.amcworld.springcrm.LruService.recordItem(LruService.groovy:57)
at org.amcworld.springcrm.LruFilters$_closure1_closure3_closure6.doCall(LruFilters.groovy:68)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662)
</stack-trace>
</exception>
</error-report>
Relates to Bugzilla bug 268.
When I copy a quote the valid until date is also copied. In most cases this will result in an invalid date because the new quote is often copied much later than the old quote.
If one save a purchase invoice that contains one or more items with a description larger than 255 characters the following occurs:
You should increase the size of the description
field in table purchase_invoice_item
.
You should upgrade to FontAwesome 4.0 and change all the CSS classes for sustainability.
When I change particular fields of the organization, such as phone or fax number, all associated persons should be submitted to LDAP in order to store the changed fields there.
SpringCRM works internally with two special services:
These services are inserted automatically when creating dunnings. However, settings these configuration values is not implemented yet.
When I entered three dots (...) in the header text of an invoice, stored, and clicked on "print" I get the following exception in FopService:153
:
The entity hellip was referenced but not declared.
The cursor on the login page always jumps to the user name field. Although this is OK in most cases, when I have a slow internet connection and I click to the password field, the cursor is set to the user name field much later. This is very annoying (reported by Robert Kirchner).
Related to Bugzilla bug 274.
When I enter italic text in an invoicing item using the Markdown syntax *italic text*
this text is not displayed italic in the print version.
It would be nice to have a V.A.T calculator at hand which computes net and gross prices as well as V.A.T. Maybe, that widget can be opened when filling in particular fields such as unit prices, shipping costs etc.
After long time of extensive use of the application a lot of outdated data accumulates, e. g. organizations and persons as well as quotes, sales orders, and invoices. We should implement a way these data can be archived.
Possible options are:
You should display the number of an invoicing transaction such as A-10000-47484 or R-74744-49494 in the title of the page.
You should prefer logback instead of log4j because of its advantages.
The search result page isn't representative. You should implement the following improvements:
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.