Tehno-istericale

Conflicte și finețuri

Totul a-nceput de la o problemă reclamată de un utilizator pe pagina modulului WP Trip Summary (plus capturi de ecran aici). Mi-a luat mult să-mi dau seama care era cauza, anume un conflict între două versiuni de Leaflet JS: una inclusă de WP Trip Summary, alta inclusă de Waymark.

Cea efectiv folosită era, evident, ultima dintre ele două versiuni (în cazul nostru, ținând cont de ordinea de execuție, versiunea din WP Trip Summary). Deci Waymark utiliza o versiune și o instanță diferite de Leaflet JS. Pe lângă diferența de versiune-n sine (care putea sau nu să fie o problemă), se pierdeau, evident, și plug-in-urile înregistrate de Waymark.

Conflicte...

Conflicte…

Miza reală a soluției nu era musai rezolvarea interacțiunii cu Waymark, important aspect așa cum era, cât asigurarea faptului că nu va mai intra în atari conflicte pe viitor, menținând un grad de izolare care să:

asigure mediul de execuție pe care l-am configurat (versiunea de Leaflet JS dorită + plug-in-urile Leaflet JS înregistrate, cu exact versiunile cerute de modul);
nu interfereze cu mediile de execuție ale altor module, chiar dacă acele module nu și-au luat la rândul lor modalități de protejeare a propriilor dependințe.

Citește mai departe

Cum se calculează numărul de comenzi plasate-n WooCommerce pentru un anumit cupon

Presupun aici că se pleacă de la codul de cupon, presupunere pe care n-o fac de dragul presupunerii or constrângerii, ci pleacă dintr-o nevoie particulară. Lucrurile sunt destul de simple aici, există o funcție standard pentru obținerea ID-ului de cupon – wc_get_coupon_id_by_code.

$couponId = wc_get_coupon_id_by_code($couponCode);

Următorul pas (sau primul dacă plecați direct de la ID) este folosirea tabelei wc_order_coupon_lookup (nu am inclus în denumirea tabelei prefixul configurat în WordPress) pentru a determina numărul de comenzi pentru acel ID de cupon. Această tabelă menține, pentru fiecare comandă (reprezentată aici prin ID-ul său – coloana order_id) ce cupon a fost folosit (reprezentat și el prin ID – coloana coupon_id).

Tabela wc_order_coupon_lookup

Citește mai departe

Librărie .NET/C# pentru verificarea contribuabililor pe baza CIF-ului

Din diverse proiecte s-a condensat în timp o mică librărie pentru consumarea serviciului web ANAF prin care se poate verifica existența unui contribuabil, precum și dacă este-nregistrat în scopuri de TVA. De fapt, funcționalitatea oferită este cea din urmă, dar implicit poate fi folosit și pentru verificarea existenței unui cod fiscal.

Detalii

Detalii

Librăria este scrisă pentru .NET 6.0 și a fost gândită pentru serviciul sincron, versiunea 8, a cărui specificație poate fi găsită aici. Cred că poate fi consumată și versiunea 7, dar nu am încercat. În tot cazul, am acoperit toată structura de date oferită de răspuns; n-am avut personal nevoie de toate datele acolo, dar dacă tot am publicat codul, am zis să fie o treabă făcută nu musai cap-coadă, ci măcar cu un cap și cu o coadă.

Citește mai departe

Afișarea denumirii și adresa locker-ului EasyBox folosind modulul oficial SameDay pentru WooCommerce

Pe lângă problema cu netrimiterea datelor locker-ului EasyBox ales, mai este loc de o îmbunătățire a ergonomiei modulului SameDay pentru WooCommerce: afișarea informațiilor locker-ului ales (nume și adresa) atunci când se afișează detaliile comenzii (în e-mail-ul de confirmare, panoul de administrare, contul de client etc.).

Clarificări

Clarificări

Motivele sunt evidente, așa că o să trec direct la descrierea soluției, adăugând doar că premisele de la care plec sunt:

– că oriunde este afișata metoda de transport asociată unei comenzi trebuie să fie afișate și aceste informații;
– că există doar o metodă de transport pentru o comandă.

Citește mai departe

Please choose your EasyBox Locker!

Eroarea din titlu am primit-o lucrând la un magazin virtual peste WooCommerce, având instalat modulul de livrare prin SameDay (problemă pe care au mai întâlnit-o și alții). Ei, cu toate că este selectat locker-ul la care să fie livrată comanda, modulul emite acest mesaj. Pentru început, am aruncat un ochi în codul sursă al modulului:

Sursa erorii

Sursa erorii

Cu alte cuvinte, se purta ca și cum datele nu ar fi fost trimise deloc. Să consultam și globul de cristal, adică Developer Tools – Network. Șoc sau nu, o să-ți vină sau n-o să-ți vină să crezi așa ceva, dar datele nu erau acolo deloc. Voilà, precum zăpezile anului trecut, precum bunul simț la ecologiști, imposibil de găsit:

Citește mai departe

Știu ce este, dar ce reprezintă?

Mai întâi, desigur, trebuie să stabilim coordonatele discuției. Este vorba despre situația în care lucrăm (fie pentru că am ales ca atare, fie că nu avem de-ales) la un proiect unde accesul la date este abstractizat:

– printr-un model de date implementat printr-un set de clase (entități);
– folosind un ORM oarecare pentru gestionarea corespondenței dintre entități și diversele artefacte din baza de date (tabele, dar nu numai);
– folosind repository-uri pentru a accesa entitățile respective;
– în sfârșit, ca să adăugăm o dimensiune concretă, folosind C# ca limbaj de bază și Entity Framework drept ORM.

Care-cum?

Care-cum?

Folosind Entity Framework, se pune problema gestionării DbContext-ului, adică a modului în care trebuie distribuit între diversele repository-uri implicate într-o singură tranzacție. Dintre toate variantele, m-am oprit în cele din urmă pe cele descrise aici (și vă recomand să citiți înainte de a continua).

Citește mai departe

Personalizarea listei de clase de livrare în WooCommerce

Cel mai simplu lucru pe care ți l-ai dori să-l obții ar fi să adaugi o coloană nouă, dar până și simplitatea asta suportă câteva adnotări, adică prezintă o serie de chichițe și umflături. Mai dificil este să adaugi o acțiune conextuală nouă pentru fiecare rând din lista de clase de livrare.

TL;DR,

TL;DR,

Adăugarea unei noi coloane

În întreprinderea noastră, procesul tehnologic pentru adăugarea unei noi coloane presupune, după obținerea avizelor necesare de la autoritățile competente, două lucruri:

înregistrarea coloanei în capul de tabel (adică înștiințarea WooCommerce că, hei, am dori și noi o coloană nouă în acea tabelă, dacă se poate și nu deranjăm) și
furnizarea unei valori pentru fiecare celulă corespunzătoare acelei coloane, pentru înregistrarea (zi-i, bre, rând!) corespunzătoare fiecărei clase de livrare.

Citește mai departe

Manțocării cu Mono Cecil

Să presupunem că, total benign și mânat de duhul blândeții, ai nevoie să ajustezi capabilitățile oferite de o aplicație la al cărei cod sursă nu ai acces neam. Să mai presupunem că aplicația este scrisă-n .NET (ce convenabil!) și că ajustarea capabilităților e controlată direct dintr-o clasă anume dintr-un assembly oarecare, prin niște proprietăți ce returnează un simplu true/false (cel puțin legat de aspectele care importă).

Motanul Patraulea, făcându-mi code review

Motanul Patraulea, făcându-mi code review

Poți să livrezi la rândul tău scuze sau poți… să-ți creezi o variantă modificată a assembly-urilor în cauză astfel încât să-ți poți vedea mai departe de lucru, de viață și de facturile care te vor îmbogăți dincolo de cele mai umede visuri ale avarului.

Și, de 10 Euro, poți să iei un ecler și un cico nevesti-tii că te suportă așa programator cum ești (ah, drama fiecărui om ce face umbră pământului, unii cu folos, alții fără: vrea să fie primit de semenii lui așa cum e, dar nimeni nu-i obligat să o facă!). Iar dacă nu ai sau e prea cățea independentă ca să merite, poți lua de 10 Euro bobițe pentru motanul Patraulea.

Citește mai departe

Kobyashi Maru

Am încheiat recent un proiect având interacțiunea cu o bază de date SQL Server prin Entity Framework (EF) 6.3, elemente care nu puteau fi supuse modificării. Nu că ar fi ceva rău, nu că as avea ceva de obiectat, dar este important de menționat pentru restul povestirii.

Ilustrație - DALL-E2

Ilustrație – DALL-E2

Pe lângă legătura standard dintre entități și tabele (sau view-uri) din baza de date, am fost nevoit să folosesc și interogări construite, folosind, Database.SqlQuery<TSmuff>(), pe baza unor funcții SQL ce returnează date tabelare, dar cu parametri ceva mai… deosebiți – TVP, adică Table Valued Parameters.

Acest fapt necesită crearea explicită a unor instanțe de DbParameter; nu pot fi transmise pur și simplu valorile, fapt ce-ar lăsa-n sarcina EF crearea instanțelor de DbParameter atunci când este momentul. Și, ca o restricție suplimentară: Database.SqlQuery<>() acceptă drept argumente ori doar valori, ori doar instanțe de DbParameter; nu poți să le combini.

Citește mai departe

Stakhanovise.NET – Sau cum să-ndeplinești cincinalul în patru ani

Motto
Stahanovismul n-a murit, doar un pic s-o răspândit.

Stahanovismul a fost o mare găselniță. A rămas în lume precum râia – nici în ziua de azi nu și-a luat liber, nici măcar o zi. Atât de mare a fost impactul său civilizațional încât prin anii ’60 sau ’70 CIA a desfășurat o operațiune specială pentru extragerea sa pe șestache din Uniunea Sovietică, deîmpreună cu coaiele lui Lenin păstrate-n formol (mai mult despre Dânsele într-un studiu istoric de primă clasă pe care-l voi publica în timp util).

Cele două artefacte au clădit practic întreaga lume nouă de o parte și de alta a oceanului. Marile corporații de azi ar fi fost practic de neimaginat fără sarabanda derivatelor motivaționale sintetice din această mare filozofie de viață.

Politicile publice de sănătate, de gen, transgen și contragen, administrative, întreg Sovietul European, toate se bazează pe stahanovism și aerul doct degajat de acele două Biluțe care-au schimbat lumea așa cum o știm.

Dacă ar trăi astăzi, Vasile Roaită ar mai sta o dată cu mâna pe sonerie, dar acum de fericire. Din păcate, Dânsul nu mai este cu noi și, într-un act de insuficientă compensare, dar cu sincere Sentimente Proletare, anunț cu tremur în voce un nou proiect marca Atelierele Boia: Stakhanovise.NET.

Citește mai departe

Cum filtrezi produse-n WooCommerce după clasa de transport

Filtrarea produselor după clasa de transport este de fapt relativ simplu, având în vedere că WooCommerce este proiectat să adauge automat clasa de livrare în lista de conditii de interogare atunci când este prezentă ca parametru în URL, cu denumirea product_shipping_class.

Sursa: Envato Elements

Sursa: Envato Elements

Așadar, tot ce ne mai rămâne de făcut este să adăugăm, în zona de filtrare a paginii de produse din panoul de administrare, un element de tip drop-down, cu numele (atributul HTML name) amintit mai sus, care să afișeze clasele de livrare. În plus, trebuie să și marcăm corespunzător clasa de livrare aleasă.

Citește mai departe

Cum activezi livrarea automată în WooCommerce pe baza unui produs anume

Dacă te-ai întrebat cum poți implementa acordarea de transport gratuit cu titlu promoțional, atunci când un client adaugă în coș un produs marcat anume în acest scop, are să te cuprindă mirarea aflând (dar află oricum) că ai două modalități. Una mai grea, alta mai ușoară.

Mai greu

Calea mai dificilă și (probabil) mai interesantă pentru utilizatorii care știu un pic de programare și, eventual, pentru programatorii care știu un pic de programare este să-și scrie singur propriul modul, idee pe care o vom urmări mai jos.

Ilustrație de BZ

Ilustrație de BZ

O soluție, probabil nu singura, dar, în orice caz, cea care a funcționat pentru mine și pe care am folosit-o este folosirea noțiunii de clasă de transport disponibilă în WooCommerce pentru a marca produsul sau produsele care acordă favorul de transport gratuit.

Citește mai departe