Category Archives: IT

IT

ERPNext articles, info, comparison, experience

2024

How ERPNext become Next ERP for MH Notebook Factory (Thailand) when compared with Odoo

https://ecosoft.co.th/menghua-case-study

Interesting story how old Odoo customer (v.7 CE – Community edition with many customizations) finally decided not to upgrade to v.16 of Odoo, but to go for ERPNext.

Quotes:

Upgrade only available on Odoo Enterprise Edition which can cause a hefty cost on licensing

ERPNext pros:

  • Easier upgrade even with custom modules
  • Easier long term maintenance with built-in low code tools
  • Reasonable pricing for Fully managed Frappe Cloud

2023

Comparison of Odoo and ERPNext

https://ecosoft-odoo.blogspot.com/2023/05/how-erpnext-superior-than-odoo-odooer.html?m=1

Quotes:

Many good open source software start out with a 100% openness and attracted a lof of diehard developers. Once successful, it lets their community down. Therefore, being open source is a key crireria for me here.

Odoo itself was also 100% open source when started, until Version 9, the license was changed from AGPL (100% Open) to LGPL (Open Core). Subsequently, serveral key modules have been removed from the community version.

Another comparison Odoo vs ERPNext:
https://frappe.io/erpnext/comparisons/erpnext-vs-odoo

ERPNext vs SAP Business One B1

https://frappe.io/erpnext/comparisons/erpnext-vs-sapb1

Interesting video with comparisons from a SAP B1 partner who also started offering ERPNext:
ERPNext over SAP B1 – Sailesh Khawani | ERPNext Conference 2022

1 Lac (Lach) – A lakh (/læk, lɑːk/; abbreviated L; sometimes written lac[1]) is a unit in the Indian numbering system equal to one hundred thousand (100,000; scientific notation: 105).[1][2] In the Indian 2, 2, 3 convention of digit grouping, it is written as 1,00,000.[3] For example, in India, 150,000 rupees becomes 1.5 lakh rupees, written as ₹1,50,000 or INR 1,50,000. https://en.wikipedia.org/wiki/Lakh

And another video for transportation service company FR8, who migrated from SAP B1 to ERPNext:
Proprietary to Open Source Journey from SAP B1 to ERPNext | Jay

ERPNext – common party accounting (customer vendor invoice offsetting)

GitHub code for common party accounting:
https://github.com/frappe/erpnext/blob/develop/erpnext/accounts/doctype/party_link/party_link.py

Documentation: https://docs.frappe.io/erpnext/user/manual/en/common_party_accounting

More documentation and examples with video: https://fosserp.com/blog/shorts/using-common-party-accounting-in-erpnext

Short docu on setting up common party accounting in ERPNext

In practice happens that a regular vendor might purchase your services or goods (so it is becoming a customer). And vice versa – usual customer can provide goods or services to your company. In order to offset (net, netting) the invoices and track financial balances between companies you can activate and use in ERPNext the “Common Party Accounting” functionality.

  1. In ERPNext navigate to app/erpnext-settings -> “Accounts Settings” and enable “Common Party Accounting” in the ‘Invoicing Features’ section.
  2. Two scenarios to link the customer or supplier. Depending on what is the primary role – If the party is already created as a supplier and is usually a supplier, then create it as a customer too. Go to the “Supplier”, click on “Link with Customer” from the “Actions” option to link.
    Respectively if the party is already created as a customer and this is its usual role, then create a supplier. Go to the “Customer”, and click on “Link with Supplier” from the “Actions” option to link.
  3. Now, create a sales invoice against the customer (who usually is supplier) who was assigned as the secondary party in the previous step.
  4. Upon submission of the sales invoice, an automatic journal entry will be made against the linked supplier, creating an advance balance. Also the invoice is marked as paid.
  5. You can now reconcile this journal entry advance against a Purchase Invoice.

This process allows you to adjust your purchases with the sales transactions.

MariaDB table which stores the links: tabParty Link

+-----------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+-------+
| name | varchar(140) | NO | PRI | NULL | |
| creation | datetime(6) | YES | | NULL | |
| modified | datetime(6) | YES | MUL | NULL | |
| modified_by | varchar(140) | YES | | NULL | |
| owner | varchar(140) | YES | | NULL | |
| docstatus | int(1) | NO | | 0 | |
| idx | int(8) | NO | | 0 | |
| primary_role | varchar(140) | YES | | NULL | |
| secondary_role | varchar(140) | YES | | NULL | |
| primary_party | varchar(140) | YES | | NULL | |
| secondary_party | varchar(140) | YES | | NULL | |
| _user_tags | text | YES | | NULL | |
| _comments | text | YES | | NULL | |
| _assign | text | YES | | NULL | |
| _liked_by | text | YES | | NULL | |
+-----------------+--------------+------+-----+---------+-------+

In order to get easily from within ERPNext a list of current settings, you can create a new Query report (Report List -> Add report) with the following SQL query:

select name, primary_role, secondary_role, primary_party, secondary_party, creation, docstatus, idx
  FROM
    `tabParty Link` AS party
    

Or use "Party Link" in search field and choose "Party Link List" to get list of already existing links between Vendors and Customers.
e.g.: erpnext.yoursite.com/app/party-link

Apple TV 3rd generation A1469 tech specifications and drive storage capacity

I had to check recently what is the storage capacity of an Apple TV 3rd generation device identified as model Apple TV A1469. Strangely NOWHERE in the About and Settings is shown the capacity. It seems that officially for this device there is no storage available and stated!!!

Apple TV (3rd Generation, Early 2013) Specs
Identifiers: 3rd Gen – MD199LL/A – AppleTV3,2 – A1469 – 2633

Apple TV (3rd Generation) has 512 MB of RAM and is capable of supporting 1080p video.

Processor Speed: 1 GHz* Processor Type: Apple A5

Apple does not specify the amount of RAM onboard. However, by third-parties it was confirmed that it has 512 MB of RAM.

Standard Storage: 8 GB SSD Storage. Officially, the third generation Apple TV models have no internal storage. However, third-parties have determined that they actually have 8 GB of flash memory to cache content, just like the second generation Apple TV.

Delete Mac OS local TimeMachine backup

To delete specific local Time Machine backups from the Terminal:

  1. List the available backups with:
    tmutil listlocalsnapshots /
  2. Delete backup with from the list:
    sudo tmutil deletelocalsnapshots 2024-xxxxxxx

    You should get confirmation of deletion like: “Delete local snapshot ‘2024-xxxxxx’

More info on how to clear space on Mac OS will be published later…

But generally you can first check this official document:
Free up storage space on Mac
https://support.apple.com/en-us/102624

How to set default date in ToolJet.com app

Target: Create a variable which has the default date as value. Then use this value as default for date picker component in ToolJet app.

Steps:

  1. Add new query of type “Run JavaScript code”
  2. In the code section paste the following code:
    const currentDate = new Date();

    const year = currentDate.getFullYear();
    const month = String(currentDate.getMonth() + 1).padStart(2,'0'); // Months are 0-indexed
    const day = String(currentDate.getDate()).padStart(2, '0');  

    today = `${year}-${month}-${day}`;

    actions.setVariable('dt', today);
    return actions.getVariable('dt');
  3. Below the code make sure to switch ON in Settings “Run this query on application load?”
  4. Now you can use the created value in the variable “dt” in any Date picker component by simply putting the following text in “Default value” property: “{{variables.dt}}

Permission denied while getting drive credentials from BigQuery table in Cloud Functions via SQL

If you have a BigQuery external table which uses for example a Google Sheets file as source, AND you try to read / join this table in BigQuery SQL you may get the error in BigQuery job failure log:

google.api_core.exceptions.Forbidden: 403 Access Denied: BigQuery BigQuery: Permission denied while getting Drive credentials.

Seems like no drive scope is the default, so BQ clients that need these scopes should be passing it in via the client_options.

So in this original solution post: https://github.com/googleapis/google-auth-library-python/issues/1204

This is the solution which worked for me too:

EricSeastrand commented on May 27, 2024• 
For anyone else facing this, here's the exact code that worked for me:

from google.cloud import bigquery
client = bigquery.Client(client_options={
    "scopes": ['https://www.googleapis.com/auth/drive', 'https://www.googleapis.com/auth/cloud-platform']
})
results = client.query_and_wait(sql)

During the bigquery.Client connection I had to pass the above scopes and there is no problem with authorizations in Sheets/Drive access anymore.

2025 April update:

Some more settings found recently:

 "oauthScopes": [
          "https://www.googleapis.com/auth/spreadsheets.readonly",
          "https://www.googleapis.com/auth/userinfo.email"

Source: https://stackoverflow.com/questions/76076016/forbidden-403-access-denied-bigquery-bigquery-permission-denied-while-getting

Or better (if applicable), create a view based on the table which accesses the Sheet 😉

Some day I may post more on the topic …..

Google Cloud scheduler call to Cloud functions 401 error

I used to run some functions developed and deployed on Google Cloud Run Functions.

Some of them are scheduled to run via Cloud Scheduler.

Last time I decided to copy the definition of the Cloud Scheduler job from bot 2 to my new bot3 function. And I started to get 401 unauthenticated errors for bot3, but the same definition was working fine for bot2.

The error looks like below:

debugInfo: "URL_ERROR-ERROR_AUTHENTICATION. Original HTTP response code number = 401"
jobName: "projects/....../locations/europe-west6/jobs/......"
status: "UNAUTHENTICATED"
targetType: "HTTP"

and in the Cloud Function log is the misleading:

The request was not authorized to invoke this service. Read more at https://cloud.google.com/run/docs/securing/authenticating Additional troubleshooting documentation can be found at: https://cloud.google.com/run/docs/troubleshooting#401

BUT – actually the problem is that during the copy of the scheduler job definition, the “Audience” value IS NOT updated with the new function URL (in my case bot3), but the old function URL is kept. It seems like it was autofilled in bot2 definition though and I didn’t noticed it. So be sure that URL and Audience are properly set!

If you fix this the 401 error is solved and gone!!!

I hope I saved you some time. Post one thanks in comments if so …

Gmail.com – more info on how ids work and two tricks

1st: You can append a plus “+” sign after your name

So adding any text after “+” sign still get the emails to your inbox, but you can filter based on this additional email id. E.g.:

your.email@gmail.com and your.email+subscription1@gmail.com and your.email+bank1@gmail.com

will both deliver the emails to your.email@gmail.com !

2nd: Gmail DOES NOT recognize the dots “.” in the email ID.

So your.email@gmail.com is the same as youremail@gmail.com or y.o.u.r.e.m.a.i.l@gmail.com

Original article is here: 2 hidden ways to get more from your Gmail address

https://gmail.googleblog.com/2008/03/2-hidden-ways-to-get-more-from-your.html