Categorieën
Geen categorie

Een succesvolle Git vertakking model

Op mijn werk bij Pronamic maken we al enige tijd gebruik van Git voor het bijhouden van ontwikkelingen in een versiebeheersysteem. We werkten hierbij voornamelijk met één tak, de ‘master’ branch. Sinds ons team echter is versterk met een extra ontwikkelaar bleek dit echter niet altijd meer even handig te werken. Collega Leon stelde daarom voor om te gaan werken volgens het branching model van Vincent Driessen.

Vicent heeft een eenvoudige en logische manier van vertakken binnen Git in kaart gebracht. Hieronder is een mooi overzicht te zien van hoe het vertakken in de praktijk gebruikt kan worden:

Git branche model

 

Categorieën
Geen categorie

Twinfield factuur sjabloon wijzigen in LibreOffice (OpenOffice)

Binnen Twinfield kunnen facturen gemaakt worden op basis van Word sjabloon. Deze sjablonen kunnen eenvoudig met behulp van Word gewijzigd worden. In de volgende YouTube video is te zien hoe dit gerealiseerd kan worden:

http://youtu.be/hk8rol6sgJY

We maken bij Pronamic echter geen gebruik van Word, maar van OpenOffice en/of LibreOffice. Als we de sjablonen met deze programma’s wijzigden dan ontstonden er helaas problemen. Hierdoor konden we bij Pronamic de Twinfield factuur sjablonen helaas niet wijzigen.

In de Twinfield Knowledge Base staan verschillende voorbeelden van hoe een factuur sjabloon er uit moet zien:

  • Hoe maak ik een Word-factuur, een aanmaning of een betaalspecificatie?
  • How do I create a Word-invoice, a dunning or a payment specification?

Nederlandse sjablonen

Bestand Grootte Laatst gewijzigd
uitleg_Word_sjabloon.doc 123KB 06/08/2012 13:18
sjabloon-NL-FactuurExclBTW-4.1.docx 15KB 16/07/2012 13:48
sjabloon-NL-TimePlus-1.2.dot 48KB 30/06/2011 13:12
sjabloon-NL-Time-1.3.dot 45KB 30/06/2011 13:12
sjabloon-NL-FactuurInclBTW-4.1.dot 47KB 30/06/2011 13:12
sjabloon-NL-BetalenIncasseren-1.2.dot 35KB 30/06/2011 13:11
sjabloon-NL-Aanmaning-1.6.dot 37KB 30/06/2011 13:10

Engelse sjablonen

Bestand Grootte Laatst gewijzigd
ChequeTemplate.doc 46KB 27/09/2012 12:21
explanation_Word_template.doc 126KB 06/08/2012 13:20
template-EN-TimePlus-1.3.dot 58KB 30/06/2011 16:42
template-EN-Time-1.4.dot 47KB 30/06/2011 16:41
template-EN-PayCollect-1.2.dot 36KB 30/06/2011 16:41
template-EN-Invoice-VatIncl-4.1.dot 46KB 30/06/2011 16:40
template-EN-Invoice-VatExcl-4.1.dot 46KB 30/06/2011 16:39
template-EN-Dunning-1.6.dot 36KB 30/06/2011 16:39

In het uitleg document van Twinfield wordt aangegeven dat de volgende samenvoeg velden beschikbaar zijn:

HeaderStart
HeaderEnd
FooterStart
FooterEnd
addressinv_name
addressinv_addr1
addressinv_addr2
addressinv_addr3
addressinv_postcode
addressinv_city
[email protected]
addressinv_country
addressinv_addr4
addressinv_addr5
addressdel_name
addressdel_addr1
addressdel_addr2
addressdel_addr3
addressdel_postcode
addressdel_city
[email protected]
addressdel_country
addressdel_addr4
addressdel_addr5
header_invdate
header_duedate
header_perfdate
header_invnum
header_vatnumber
header_customer
header_customername
header_period
header_headerdescr
header_footerdescr
header_printstatus
header_paycode
bank_name
bank_account
header_print
header_printcount
[email protected]
[email protected]
TableStart:lines
TableEnd:lines
[email protected]
header_currency
lines_line_artcode
lines_line_subcode
lines_line_name
lines_line_sname
lines_line_extref1
lines_line_extref2
lines_line_extref3
lines_line_dim2
[email protected]
lines_line_dim3
[email protected]
lines_line_dim4
[email protected]
lines_line_fincode
lines_line_finnumber
[email protected]
lines_line_perfdate
lines_line_qty
lines_line_descr
[email protected]
[email protected]
lines_line_currency
lines_line_taxrate
[email protected]
[email protected]
[email protected]
TableStart:taxlines
TableEnd:taxlines
calclines_taxline_currency
calclines_taxline_taxname
calclines_taxline_perftype
calclines_taxline_perfyearmonth
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
lines_line_teq_week
lines_line_teq_month
lines_line_teq_quarter
lines_line_dim1
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
lines_line_transdate
TableStart:timelines
TableEnd:timelines
[email protected]
[email protected]
time_line_user
time_line_transdate
[email protected]
[email protected]
[email protected]
time_line_project
[email protected]
[email protected]
[email protected]
time_line_activity
time_line_descr
time_line_qty
time_line_price
[email protected]
[email protected]
[email protected]
customer_custname
customer_name
customer_addr1
customer_addr2
customer_addr3
customer_postcode
customer_city
customer_country
[email protected]
customer_modified
customer_dimcode
customer_basecurrency
[email protected]
[email protected]
customer_reportingcurrency
[email protected]
[email protected]
customer_invoicecurrency
[email protected]
[email protected]
customer_totalbasevalueopen
customer_totalrepvalueopen
customer_totalvalueopen
TableStart:customer
TableEnd:customer
customer_detail_invnumber
customer_detail_inpdate
customer_detail_basevalueopen
customer_detail_valueopen
customer_detail_repvalueopen
customer_detail_basevalue
customer_detail_value
customer_detail_repvalue
customer_detail_basevaluepaid
customer_detail_valuepaid
customer_detail_repvaluepaid
customer_detail_days
customer_detail_duedate
customer_detail_currency
[email protected]
[email protected]
customer_detail_description
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
customer_account
name
addr1
addr2
addr3
addr4
addr5
postcode
city
country
dimcode
dimname
date
office_code
office_name
office_vatnumber
office_address_line1
office_address_line2
office_address_line3
office_address_line4
office_address_line5
office_address_line6
office_address_zipcode
office_address_city
office_address_country
office_address_telephone
office_address_fax
bank_code
bank_ascription
bank_iban
bank_accountnumber
bank_nationalbic
bank_bic
bank_address_line1
bank_address_line2
bank_address_line3
bank_address_line4
bank_address_line5
bank_address_line6
bank_address_zipcode
bank_address_city
bank_address_country
bank_address_telephone
bank_address_fax
TableStart:details
TableEnd:details
details_detail_invdate
details_detail_duedate
details_detail_invnumber
details_detail_origvalue
details_detail_value
details_detail_origbasevalue
details_detail_basevalue
[email protected]
details_detail_trsnumber
origvalue
value
currency
valuetext
TableStart:cheque_details
TableEnd:cheque_details
cheque_details_detail_invdate
cheque_details_detail_duedate
cheque_details_detail_invnumber
cheque_details_detail_origvalue
cheque_details_detail_value
cheque_details_detail_origbasevalue
cheque_details_detail_basevalue
[email protected]
cheque_details_detail_trsnumber
millions
hundreds_of_thousands
tens_of_thousands
thousands
hundreds
tens
units
cents

Helaas gaan deze Word samenvoeg velden verloren bij het opslaan van .doc bestanden in LibreOffice. Na veel uitzoekwerk bleek dit te komen doordat de samenvoeg velden niet gekoppeld zijn aan een database.

Binnen LibreOffice kan er net als in Microsoft Word gewerkt worden met samenvoeg velden. In het LibreOffice worden deze samenvoeg velden ook wel “Mail merge fields” genoemd.

LibreOffice - Mail merge fields

Deze “Mail merge fields” kunnen echter niet vrij ingevoerd worden. In plaats daarvan moeten er kolommen uit een database tabel geselecteerd worden. Door een CSV bestand aan te maken met alle beschikbare Twinfield samenvoeg velden is dit echter eenvoudig te realiseren.

HeaderStart,HeaderEnd,FooterStart,FooterEnd,addressinv_name,addressinv_addr1,addressinv_addr2,addressinv_addr3,addressinv_postcode,addressinv_city,[email protected],addressinv_country,addressinv_addr4,addressinv_addr5,addressdel_name,addressdel_addr1,addressdel_addr2,addressdel_addr3,addressdel_postcode,addressdel_city,[email protected],addressdel_country,addressdel_addr4,addressdel_addr5,header_invdate,header_duedate,header_perfdate,header_invnum,header_vatnumber,header_customer,header_customername,header_period,header_headerdescr,header_footerdescr,header_printstatus,header_paycode,bank_name,bank_account,header_print,header_printcount,[email protected],[email protected],TableStart:lines,TableEnd:lines,[email protected],header_currency,lines_line_artcode,lines_line_subcode,lines_line_name,lines_line_sname,lines_line_extref1,lines_line_extref2,lines_line_extref3,lines_line_dim2,[email protected],lines_line_dim3,[email protected],lines_line_dim4,[email protected],lines_line_fincode,lines_line_finnumber,[email protected],lines_line_perfdate,lines_line_qty,lines_line_descr,[email protected],[email protected],lines_line_currency,lines_line_taxrate,[email protected],[email protected],[email protected],TableStart:taxlines,TableEnd:taxlines,calclines_taxline_currency,calclines_taxline_taxname,calclines_taxline_perftype,calclines_taxline_perfyearmonth,[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],lines_line_teq_week,lines_line_teq_month,lines_line_teq_quarter,lines_line_dim1,[email protected],[email protected],[email protected],[email protected],[email protected],lines_line_transdate,TableStart:timelines,TableEnd:timelines,[email protected],[email protected],time_line_user,time_line_transdate,[email protected],[email protected],[email protected],time_line_project,[email protected],[email protected],[email protected],time_line_activity,time_line_descr,time_line_qty,time_line_price,[email protected],[email protected],[email protected],customer_custname,customer_name,customer_addr1,customer_addr2,customer_addr3,customer_postcode,customer_city,customer_country,[email protected],customer_modified,customer_dimcode,customer_basecurrency,[email protected],[email protected],customer_reportingcurrency,[email protected],[email protected],customer_invoicecurrency,[email protected],[email protected],customer_totalbasevalueopen,customer_totalrepvalueopen,customer_totalvalueopen,TableStart:customer,TableEnd:customer,customer_detail_invnumber,customer_detail_inpdate,customer_detail_basevalueopen,customer_detail_valueopen,customer_detail_repvalueopen,customer_detail_basevalue,customer_detail_value,customer_detail_repvalue,customer_detail_basevaluepaid,customer_detail_valuepaid,customer_detail_repvaluepaid,customer_detail_days,customer_detail_duedate,customer_detail_currency,[email protected],[email protected],customer_detail_description,[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],customer_account,name,addr1,addr2,addr3,addr4,addr5,postcode,city,country,dimcode,dimname,date,office_code,office_name,office_vatnumber,office_address_line1,office_address_line2,office_address_line3,office_address_line4,office_address_line5,office_address_line6,office_address_zipcode,office_address_city,office_address_country,office_address_telephone,office_address_fax,bank_code,bank_ascription,bank_iban,bank_accountnumber,bank_nationalbic,bank_bic,bank_address_line1,bank_address_line2,bank_address_line3,bank_address_line4,bank_address_line5,bank_address_line6,bank_address_zipcode,bank_address_city,bank_address_country,bank_address_telephone,bank_address_fax,TableStart:details,TableEnd:details,details_detail_invdate,details_detail_duedate,details_detail_invnumber,details_detail_origvalue,details_detail_value,details_detail_origbasevalue,details_detail_basevalue,[email protected],details_detail_trsnumber,origvalue,value,currency,valuetext,TableStart:cheque_details,TableEnd:cheque_details,cheque_details_detail_invdate,cheque_details_detail_duedate,cheque_details_detail_invnumber,cheque_details_detail_origvalue,cheque_details_detail_value,cheque_details_detail_origbasevalue,cheque_details_detail_basevalue,[email protected],cheque_details_detail_trsnumber,millions,hundreds_of_thousands,tens_of_thousands,thousands,hundreds,tens,units,cents

Dit bestand kan opslagen worden in Twinfield.csv en vervolgens gebruikt worden bij het invoegen van een “Mail merge field”. Vervolgens kun je je sjabloon helemaal naar wens inrichten en opslaan in het ODF Text Document (.odt) formaat.

Zodra het sjabloon geüpload moet worden naar Twinfield is een bestandsnaam met de extensie .doc, .dot, .docx of .dotx nodig. Bij het uploaden van andere bestanden zal Twinfield de volgende foutmelding weergeven:

Selecteer een DOC-, DOT-, DOCX- of DOTX-bestand.

Als we ons ODF Text Document echter opslaan volgens het “” of “” formaat geeft Twinfield de volgende foutmelding:

De Word-sjabloon bevat geen samenvoegvelden.

Daarom slaan we ons bestand niet op volgens dit formaat maar wijzigen we ons “bestandsnaam.odt” simpelweg naar “bestandsnaam.odt.dot”. Vreemd genoeg kan Twinfield het ODF Text Document met een geldige extensie gewoon correct verwerken.

Helaas werken niet alle aspecten van een ODF Text Document even goed in Word en dus Twinfield. Zo wordt de opmaak van afbeeldingen en frames niet altijd goed over genomen. Dit probleem is echter vrij eenvoudig te omzeilen door puur met een tabellen opmaak te werken.

Categorieën
Geen categorie

Video over onlogische output in programmeertalen

http://www.youtube.com/watch?v=_yZHbh396rc

Categorieën
Geen categorie

Handige documentatie website DocHub

Sinds collega Leon Rowland bij Pronamic aan het werk is worden we dagelijks getrakteerd op handige tools. Zo werden we recent gewezen op de DocHub website (http://dochub.io/). DocHub is een handige website gemaakt door Rafael Garcia om direct documentatie te vinden over CSS, HTML, JavaScript, DOM, jQuery, PHP en Python. Helaas staat WordPress hier nog niet tussen, maar wellicht wordt deze nog toegevoegd.

Categorieën
Geen categorie

Tolsma’s darttoernooi

Een overzicht van de winnaars van voorgaande jaren:

Jaar 1e 2e 3e 4e
2005 Remco Tolsma Jelke Boonstra ?
2006 Yteke Veenstra Jelke Boonstra Karel-Jan Tolsma
2007 Peter Vonk Karel-Jan Tolsma ?
2008 Leo Oosterloo Wietze Tolsma Peter Vonk
2009 Hilda Broersma Jelke Boonstra Martijn Cordes
2010 Wietze Tolsma Christa Tolsma Martijn Cordes
2011 Peter Vonk Leo Oosterloo Martijn Cordes Karel-Jan Tolsma
2012 Peter Vonk Karel-Jan Tolsma Remco Tolsma Christa Tolsma
Categorieën
Geen categorie

Google Apps niet meer gratis, alternatieve oplossingen

Helaas is Google Apps niet meer gratis te gebruiken, er moet nu € 4,- per gebruiker per maand betaald worden. Bestaande Google Apps accounts blijven voorlopig gratis, maar het zal me niks verbazen als hier straks ook voor betaald moet gaan worden.

Van 200 gratis gebruikers naar 0

Toen Google Apps gelanceerd werd konden er 200 gratis gebruikers aangemaakt worden, dit werd echter al snel gewijzigd naar 100 gebruikers. In januari 2009 werd dit beperkt naar 50 gebruiker en 2011 werd het zelfs beperkt tot slechts 10 gebruikers. Op 6 december 2012 trekt Google de stekker uit de gratis Google Apps variant.

Alternatieve oplossingen

Google Apps zal nog steeds voor veel bedrijven een goedkopere oplossing zijn dan een eigen e-mail server. Voor kleinere bedrijven kan Google Apps echter toch vrij duur zijn, voornamelijk omdat er genoeg gratis alternatieven zijn.

Meer informatie

Categorieën
Geen categorie PHP SQL WordPress

WordPress gebruikers niet in auteur dropdown

Bij veel geavanceerdere WordPress websites zijn de standaard WordPress gebruikersrollen en bijbehorende mogelijkheden (capabilities) niet meer voldoende. Gelukkig zijn deze gebruikersrollen eenvoudig met allerlei plugins te beheren en uit te breiden. Zo kan men bijvoorbeeld met behulp van de Members plugin dit alles via eenvoudige gebruikersinterface beheren.

Toch blijken er ook nog wel een aantal nadelen te kleven aan het inzetten van maatwerk gebruikersrollen. Zo loop ik regelmatig tegen het probleem aan dat gebruikers met maatwerk gebruikersrollen niet zichtbaar zijn de auteur dropdown. Hierdoor hebben eindbgeruikers niet de mogelijkheid om een gebruiker met maatwerk rol als auteur toe te wijzen aan een WordPress bericht.

Dit probleem wordt veroorzaakt doordat binnen de auteur meta box gebruik gemaakt wordt van de wp_dropdown_users() functie. De wp_dropdown_user() functie maakt op zijn beurt weer gebruik van get_users() en dus WP_User_Query. Met behulp van deze query klasse kunnen gebruikers opgevraagd. Met de ‘who’ parameter kan er geselecteerd worden op alle gebruikers of enkel auteurs.

Binnen de auteur meta box worden alleen de auteurs weergegeven. De implementatie van WP_User_Query vraagt de auteurs echter op aan de hand van het gebruikersniveau (level). WordPress gebruikersniveaus is een techniek die werd gebruik in WordPress versies voor 2.0. Tegenwoordig wordt bij het aanmaken van maatwerk gebruikersrollen deze gebruikersniveaus niet meer meegenomen.

In veel gevallen is het echterwel  verstandig om ook de gebruikersniveaus te koppelen aan maatwerk gebruikersrollen. Dit kan eenvoudig gerealiseerd worden door met behulp van de Members plugin respectievelijk de volgende mogelijkheden (capabilities) toe te voegen:

  • level_0
  • level_1
  • level_2
  • level_3
  • level_4
  • level_5
  • level_6
  • level_7
  • level_8
  • level_9
  • level_10

Dit zorgt ervoor dat zodra er gebruikers met een maatwerk gebruikersrol worden aangemaakt het gebruikersniveau niet op 0 blijft staan. Doordat deze niet op 0 blijft staan zullen deze gebruikers automatisch ook in de auteur dropdown weergegeven worden. Indien je al veel gebruikers met gebruikersniveau 0 in je systeem hebt staan dan kun je deze eenvoudig bijwerken met behulp van de volgende query:

UPDATE 
	wp_usermeta
SET 
	meta_value = 4
WHERE
	meta_key = 'wp_user_level'
		AND
	meta_value = 0
		AND
	user_id IN (
		SELECT 
			user_id 
		FROM (
			SELECT
				DISTINCT user_id 
			FROM 
				wp_usermeta
			WHERE 
				meta_key = 'wp_capabilities'
					AND
				meta_value LIKE '%company_author%'
		) AS temporary_table
	);

Met behulp van bovenstaande query upgrade ik gebruikers met de gebruikersrol ‘company_author’ en gebruikersniveau 0 naar gebruikersniveau 4.

Categorieën
Geen categorie WooCommerce WordPress

WordPress Shopp (nl) plugin

Onlangs kwam ik een WordPress website met de Shopp webwinkel plugin tegen met daarop ook de “Tussendoor Shopp 1.2.* NL / Dutch plugin“. Aangezien ik zelf ook een aantal vertaal plugins in beheer heb was ik wel benieuwd naar de opzet van deze plugin. Na het doorbladeren van de code kwam ik er snel echter dat het ging om een aangepaste versie van de WooCommerce (nl) en/of Gravity Forms (nl) plugin.

Tussendoor heeft helaas niet even de moeite genomen om Pronamic hiervan op de hoogte te brengen. Ik ben niet helemaal bekend met de regels die beschreven in de GPL licentie, maar even vermelden dat de plugin op onze plugins is gebaseerd zou ik wel gewaardeerd hebben.

The work must carry prominent notices stating that you modified it, and giving a relevant date.

Ik heb Tussendoor nog even via Twitter gewezen op de ontbrekende credits, maar daar is helaas niet op gereageerd.

Ik weet dat onze Duitse buren ook een variant op de WooCommerce (nl) plugin hebben gemaakt, namelijk de WooCommerce (de) plugin. Deze ontwikkelaar geeft ons echter alle credits voor ons werk:

Danksagung und Copyright: Dieses Plugin ist ein Fork des hervorragenden “WooCommerce (nl)” Plugins von Pronamic, NL bzw. Remco Tolsma @pronamic. Es ist quasi die Deutsche Version davon. Es steht genauso wie die ursprüngliche Code-Basis unter GPLv2-Lizenz (oder höher). — Ein grosses Dankeschön an Pronamic, die den Weg geebnet haben! 😉

Het is jammer om te zien dat onze concullega’s uit Friesland onze code zonder vermelding gebruiken. Het gaat hier natuurlijk niet om de meeste spannende plugin, maar ik dacht wel wat Tussendoor kan kunnen wij beter. Daarom hebben we recent de Shopp (nl) plugin gelanceerd. Deze plugin is inmiddels uitgerust met de vertaling voor de volgende Shopp versies:

  • 1.2
  • 1.2.2
  • 1.2.3

We hebben al veel vertalingen verbeterd, maar waarschijnlijk zijn er nog steeds veel verbeteringen mogelijk. Heb je zelf suggesties voor betere vertalingen dan horen we het graag. Mocht je geïnteresseerd zijn in een WordPress webwinkel met Shopp, WooCommerce, WP e-Commerce, WooCommerce, eShop of een andere WordPress webwinkel plugin dan kun je uiteraard ook altijd vrijblijvend een offerte aanvragen.

Categorieën
Geen categorie

Gratis ~70 m² beton klinkers

Ik heb ongeveer 70 m² beton klinkers liggen, verschillende formaten en kleuren, die gratis afgehaald kunnen worden.

Bekijk de advertentie op Marktplaats.

Update: Inmiddels hebben meerdere mensen op de advertentie gereageerd en ben ik de klinkers kwijt.

Categorieën
Geen categorie

Gratis ~400 tegels 30 × 30 cm

Ik heb ongeveer 400 tegels van 30 × 30 cm liggen die gratis afgehaald kunnen worden.

Bekijk de advertentie op Marktplaats.

Update: Inmiddels hebben meerdere mensen op de advertentie gereageerd en ben ik de tegels kwijt.