Plugin Directory

Changeset 3727767


Ignore:
Timestamp:
10/04/2026 07:52:22 PM (12 days ago)
Author:
oywi82
Message:

New Futures

Location:
lagersky-for-woocommerce/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • lagersky-for-woocommerce/trunk/includes/class-lagersky-client.php

    r3717226 r3727767  
    4343    }
    4444
    45     public function ping() {
    46         return $this->post( 'ping', array() );
     45    /** Sjekk lisens. $info kan ta med pluginens valg (f.eks. prepaid_autopost), så LagerSky vet om dem. */
     46    public function ping( array $info = array() ) {
     47        return $this->post( 'ping', $info );
    4748    }
    4849
  • lagersky-for-woocommerce/trunk/lagersky-for-woocommerce.php

    r3717226 r3727767  
    44 * Plugin URI: https://www.lagersky.no/woocommerce
    55 * Description: Kobler WooCommerce til lagerstyring i LagerSky. Ved fullført ordre trekkes varer fra lageret, og bilag kan bokføres automatisk. Krever en LagerSky-konto.
    6  * Version: 3.2.0
     6 * Version: 3.3.0
    77 * Requires at least: 6.0
    88 * Requires PHP: 7.4
    … …  
    1818if ( ! defined( 'ABSPATH' ) ) { exit; }
    1919
    20 define( 'LAGERSKY_VERSION', '3.2.0' );
     20define( 'LAGERSKY_VERSION', '3.3.0' );
    2121define( 'LAGERSKY_OPT', 'lagersky_settings' );
    2222define( 'LAGERSKY_URL', 'https://www.lagersky.no' ); // fast adresse
    … …  
    4444        'payment_days'    => '14',
    4545        'stock_sync'      => '0',
     46        'prepaid_autopost'=> '0',
    4647    );
    4748    return wp_parse_args( get_option( LAGERSKY_OPT, array() ), $d );
    … …  
    6465        'payment_days'    => (string) intval( $_POST['payment_days'] ?? 14 ),
    6566        'stock_sync'      => isset( $_POST['stock_sync'] ) ? '1' : '0',
     67        'prepaid_autopost'=> ! empty( $_POST['prepaid_autopost'] ) ? '1' : '0',
    6668    );
    6769    update_option( LAGERSKY_OPT, $s );
    … …  
    144146        if ( is_array( $cached ) ) { return $cached; }
    145147    }
    146     $res = ( new Lagersky_Client( LAGERSKY_URL, $s['license'] ) )->ping();
     148    $res = ( new Lagersky_Client( LAGERSKY_URL, $s['license'] ) )->ping( array( 'prepaid_autopost' => $s['prepaid_autopost'] === '1' ) );
    147149    $status = ! empty( $res['ok'] )
    148         ? array( 'ok' => true, 'company' => $res['company'] ?? '', 'luca' => ! empty( $res['luca_configured'] ) )
     150        ? array( 'ok' => true, 'company' => $res['company'] ?? '', 'luca' => ! empty( $res['luca_configured'] ),
     151            'accounts' => is_array( $res['accounts'] ?? null ) ? $res['accounts'] : array() )
    149152        : array( 'ok' => false, 'msg' => $res['error'] ?? 'Lisensnøkkelen ble ikke godkjent.' );
    150153    set_transient( 'lagersky_status', $status, 300 );
    … …  
    165168    $statuses = wc_get_order_statuses();
    166169    $logo = LAGERSKY_URL . '/assets/lagersky-logo.png';
     170    $luca = ! empty( $st['ok'] ) && ! empty( $st['luca'] );
     171    $acc  = isset( $st['accounts'] ) && is_array( $st['accounts'] ) ? $st['accounts'] : array();
     172    $clr  = isset( $acc['clearing'] ) ? $acc['clearing'] : '1579';
     173    $sal  = isset( $acc['sales'] ) ? $acc['sales'] : '3000';
     174    $vat  = isset( $acc['vat_code'] ) ? $acc['vat_code'] : '3';
    167175    ?>
     176    <style>
     177        .lsk-card{background:#fff;border:1px solid #dcdcde;border-radius:10px;padding:6px 20px 14px;margin:18px 0;max-width:980px}
     178        .lsk-card h2{margin:14px 0 2px;font-size:16px}
     179        .lsk-card .lsk-sub{color:#646970;margin:0 0 4px}
     180        .lsk-card .form-table th{width:230px}
     181        .lsk-off{opacity:.5}
     182        .lsk-lock{background:#fcf9e8;border:1px solid #f0e2a8;border-radius:8px;padding:9px 12px;margin:10px 0 2px;color:#5f4b0c}
     183        .lsk-acc{display:inline-block;background:#f0f6fc;border:1px solid #c5d9ed;border-radius:6px;padding:2px 8px;font-family:monospace}
     184    </style>
    168185    <div class="wrap">
    169186        <h1>LagerSky for WooCommerce</h1>
    170187        <?php settings_errors( 'lagersky' ); ?>
    171188
    172         <div style="margin:14px 0;padding:14px 16px;border-radius:10px;border:1px solid <?php echo $st['ok'] ? '#b6e0c4' : '#e6b3b3'; ?>;background:<?php echo $st['ok'] ? '#eafaf0' : '#fdeded'; ?>">
    173             <?php if ( $st['ok'] ) : ?>
    174                 <strong style="color:#157a49;font-size:15px">✓ Lisens aktiv</strong>
    175                 <span style="color:#3f5170"> – tilkoblet <strong><?php echo esc_html( $st['company'] ); ?></strong><?php echo $st['luca'] ? ' · Luca Regnskap aktiv' : ' · Luca Regnskap ikke aktivert (lager føres uten bilag)'; ?></span>
    176             <?php else : ?>
    177                 <strong style="color:#9c2b2b;font-size:15px">✗ Ikke aktiv</strong>
    178                 <span style="color:#3f5170"> – <?php echo esc_html( $st['msg'] ); ?></span>
    179             <?php endif; ?>
    180         </div>
    181 
    182189        <form method="post">
    183190            <?php wp_nonce_field( 'lagersky_save' ); ?>
    184             <table class="form-table" role="presentation">
    185                 <tr><th><label for="license">Lisensnøkkel</label></th>
    186                     <td><input name="license" id="license" type="text" class="regular-text code" value="<?php echo esc_attr( $s['license'] ); ?>" placeholder="LSK-XXXX-XXXX-XXXX">
    187                         <p class="description">Finnes under Innstillinger → Lisensnøkkel i LagerSky. Adressen til LagerSky er satt automatisk.</p></td></tr>
    188                 <tr><th><label for="trigger_status">Synk ved status</label></th>
    189                     <td><select name="trigger_status" id="trigger_status">
    190                         <?php foreach ( $statuses as $key => $label ) : $k = str_replace( 'wc-', '', $key ); ?>
    191                             <option value="<?php echo esc_attr( $k ); ?>" <?php selected( $s['trigger_status'], $k ); ?>><?php echo esc_html( $label ); ?></option>
    192                         <?php endforeach; ?>
    193                     </select>
    194                     <p class="description">Når ordren får denne statusen, trekkes varer fra lageret. Anbefalt: Fullført.</p></td></tr>
    195                 <tr><th><label for="prepaid_methods">Forhåndsbetalte betalingsmåter</label></th>
    196                     <td><input name="prepaid_methods" id="prepaid_methods" type="text" class="regular-text" value="<?php echo esc_attr( $s['prepaid_methods'] ); ?>">
    197                         <p class="description">Kommaseparerte betalings-ID-er (f.eks. vipps). Disse trekkes fra lageret her – selve oppgjøret bokføres under «Vipps Oppgjør» i LagerSky.</p></td></tr>
    198                 <tr><th>Faktura</th>
    199                     <td><label><input type="checkbox" name="make_invoice" value="1" <?php checked( $s['make_invoice'], '1' ); ?>> Opprett kunde + fakturautkast i Luca Regnskap for ikke-forhåndsbetalte ordrer</label>
    200                         <p class="description">Krever at Luca Regnskap er aktivert i LagerSky. Finnes ikke kunden, opprettes den; fakturaen får riktige varelinjer med samme produktnummer.</p></td></tr>
    201                 <tr><th><label for="invoice_type">Fakturatype</label></th>
    202                     <td><select name="invoice_type" id="invoice_type">
    203                         <?php foreach ( array( 'DRAFT' => 'Kladd (anbefalt ved oppstart)', 'INVOICE' => 'Faktura', 'OFFER' => 'Tilbud' ) as $k => $l ) : ?>
    204                             <option value="<?php echo esc_attr( $k ); ?>" <?php selected( $s['invoice_type'], $k ); ?>><?php echo esc_html( $l ); ?></option>
    205                         <?php endforeach; ?>
    206                     </select></td></tr>
    207                 <tr><th><label for="payment_days">Betalingsfrist (dager)</label></th>
    208                     <td><input name="payment_days" id="payment_days" type="number" min="0" value="<?php echo esc_attr( $s['payment_days'] ); ?>" class="small-text"></td></tr>
    209                 <tr><th>Lager tilbake</th>
    210                     <td><label><input type="checkbox" name="stock_sync" value="1" <?php checked( $s['stock_sync'], '1' ); ?>> Send oppdatert lager fra LagerSky tilbake til WooCommerce (ca. hvert 15. minutt)</label>
    211                         <p class="description">LagerSky er master for lageret. Antallet settes <strong>absolutt</strong> ut fra varenummer (SKU), så det holder seg i takt uansett hva som endrer lageret. Pakker settes til hvor mange som kan bygges.
    212                         <?php $ls = get_option( 'lagersky_last_stock_sync' ); if ( is_array( $ls ) && ! empty( $ls['time'] ) ) { echo ' <br>Sist synkronisert: ' . esc_html( $ls['time'] ) . ' (' . (int) $ls['count'] . ' produkter).'; } ?></p></td></tr>
    213             </table>
     191
     192            <!-- 1. Tilkobling -->
     193            <div class="lsk-card">
     194                <h2>1. Tilkobling</h2>
     195                <div style="margin:10px 0 4px;padding:12px 14px;border-radius:8px;border:1px solid <?php echo $st['ok'] ? '#b6e0c4' : '#e6b3b3'; ?>;background:<?php echo $st['ok'] ? '#eafaf0' : '#fdeded'; ?>">
     196                    <?php if ( $st['ok'] ) : ?>
     197                        <strong style="color:#157a49">✓ Lisens aktiv</strong>
     198                        <span style="color:#3f5170"> – tilkoblet <strong><?php echo esc_html( $st['company'] ); ?></strong> · Luca Regnskap: <?php if ( $luca ) : ?><strong style="color:#157a49">aktiv</strong><?php else : ?><strong>ikke koblet til</strong><?php endif; ?></span>
     199                    <?php else : ?>
     200                        <strong style="color:#9c2b2b">✗ Ikke aktiv</strong>
     201                        <span style="color:#3f5170"> – <?php echo esc_html( $st['msg'] ); ?></span>
     202                    <?php endif; ?>
     203                </div>
     204                <table class="form-table" role="presentation">
     205                    <tr><th><label for="license">Lisensnøkkel</label></th>
     206                        <td><input name="license" id="license" type="text" class="regular-text code" value="<?php echo esc_attr( $s['license'] ); ?>" placeholder="LSK-XXXX-XXXX-XXXX">
     207                            <p class="description">Finnes under Innstillinger → Lisensnøkkel i LagerSky. Adressen til LagerSky er satt automatisk.</p></td></tr>
     208                </table>
     209            </div>
     210
     211            <!-- 2. Ordre og lager -->
     212            <div class="lsk-card">
     213                <h2>2. Ordre og lager</h2>
     214                <p class="lsk-sub">Når varene trekkes fra lageret, og om lageret skal synkes tilbake til nettbutikken.</p>
     215                <table class="form-table" role="presentation">
     216                    <tr><th><label for="trigger_status">Trekk lager ved status</label></th>
     217                        <td><select name="trigger_status" id="trigger_status">
     218                            <?php foreach ( $statuses as $key => $label ) : $k = str_replace( 'wc-', '', $key ); ?>
     219                                <option value="<?php echo esc_attr( $k ); ?>" <?php selected( $s['trigger_status'], $k ); ?>><?php echo esc_html( $label ); ?></option>
     220                            <?php endforeach; ?>
     221                        </select>
     222                        <p class="description">Når ordren får denne statusen, trekkes varene fra lageret i LagerSky. Anbefalt: Fullført.</p></td></tr>
     223                    <tr><th>Lager tilbake til nettbutikken</th>
     224                        <td><label><input type="checkbox" name="stock_sync" value="1" <?php checked( $s['stock_sync'], '1' ); ?>> Send oppdatert lager fra LagerSky tilbake til WooCommerce (ca. hvert 15. minutt)</label>
     225                            <p class="description">LagerSky er master for lageret. Antallet settes <strong>absolutt</strong> ut fra varenummer (SKU). Pakker settes til hvor mange som kan bygges.
     226                            <?php $ls = get_option( 'lagersky_last_stock_sync' ); if ( is_array( $ls ) && ! empty( $ls['time'] ) ) { echo ' <br>Sist synkronisert: ' . esc_html( $ls['time'] ) . ' (' . (int) $ls['count'] . ' produkter).'; } ?></p></td></tr>
     227                </table>
     228            </div>
     229
     230            <!-- 3. Regnskap -->
     231            <div class="lsk-card">
     232                <h2>3. Regnskap (Luca Regnskap)</h2>
     233                <p class="lsk-sub">Automatisk bokføring når en ordre fullføres. Kontoene hentes fra LagerSky (Innstillinger → Kontoer).</p>
     234                <?php if ( ! $luca ) : ?>
     235                    <div class="lsk-lock">🔒 <strong>Luca Regnskap er ikke koblet til i LagerSky.</strong> Disse valgene er slått av til du legger inn API-nøkkelen i LagerSky under Innstillinger → Luca Regnskap. Lageret trekkes som vanlig.</div>
     236                    <?php foreach ( array( 'prepaid_methods', 'invoice_type', 'payment_days' ) as $hk ) : ?>
     237                        <input type="hidden" name="<?php echo esc_attr( $hk ); ?>" value="<?php echo esc_attr( $s[ $hk ] ); ?>">
     238                    <?php endforeach; ?>
     239                    <?php if ( $s['make_invoice'] === '1' ) : ?><input type="hidden" name="make_invoice" value="1"><?php endif; ?>
     240                    <?php if ( $s['prepaid_autopost'] === '1' ) : ?><input type="hidden" name="prepaid_autopost" value="1"><?php endif; ?>
     241                <?php endif; ?>
     242                <table class="form-table<?php echo $luca ? '' : ' lsk-off'; ?>" role="presentation">
     243                    <tr><th><label for="prepaid_methods">Forhåndsbetalte betalingsmåter</label></th>
     244                        <td><input name="prepaid_methods" id="prepaid_methods" type="text" class="regular-text" value="<?php echo esc_attr( $s['prepaid_methods'] ); ?>"<?php disabled( ! $luca ); ?>>
     245                            <p class="description">Kommaseparerte betalings-ID-er, f.eks. <code>vipps,vipps_mobilepay</code>. Kunden har allerede betalt, så det lages ingen faktura for disse.</p></td></tr>
     246                    <tr><th>Vipps/MobilePay-salg</th>
     247                        <td><label><input type="checkbox" name="prepaid_autopost" value="1" <?php checked( $s['prepaid_autopost'], '1' ); ?><?php disabled( ! $luca ); ?>> Bokfør salget automatisk i Luca Regnskap når ordren fullføres</label>
     248                            <p class="description">Føres som debet <span class="lsk-acc"><?php echo esc_html( $clr ); ?></span> (mellomkonto) / kredit <span class="lsk-acc"><?php echo esc_html( $sal ); ?></span><?php if ( $vat !== '' ) : ?> med mva-kode <span class="lsk-acc"><?php echo esc_html( $vat ); ?></span><?php endif; ?>, ordrens totalbeløp på fullføringsdatoen.
     249                            <br>Når dette er på, slår LagerSky automatisk på <strong>«Bokfør kun oppgjøret (steg 2)»</strong> under Vipps Oppgjør, så salget ikke blir bokført to ganger. Av: hele oppgjøret (salg + utbetaling) føres under Vipps Oppgjør.</p></td></tr>
     250                    <tr><th>Faktura for andre betalinger</th>
     251                        <td><label><input type="checkbox" name="make_invoice" value="1" <?php checked( $s['make_invoice'], '1' ); ?><?php disabled( ! $luca ); ?>> Opprett kunde og faktura i Luca Regnskap for ordrer som ikke er forhåndsbetalt</label>
     252                            <p class="description">Finnes ikke kunden, opprettes den. Fakturaen får de samme varelinjene og varenumrene som ordren.</p></td></tr>
     253                    <tr><th><label for="invoice_type">Fakturatype</label></th>
     254                        <td><select name="invoice_type" id="invoice_type"<?php disabled( ! $luca ); ?>>
     255                            <?php foreach ( array( 'DRAFT' => 'Kladd (anbefalt ved oppstart)', 'INVOICE' => 'Faktura', 'OFFER' => 'Tilbud' ) as $k => $l ) : ?>
     256                                <option value="<?php echo esc_attr( $k ); ?>" <?php selected( $s['invoice_type'], $k ); ?>><?php echo esc_html( $l ); ?></option>
     257                            <?php endforeach; ?>
     258                        </select></td></tr>
     259                    <tr><th><label for="payment_days">Betalingsfrist (dager)</label></th>
     260                        <td><input name="payment_days" id="payment_days" type="number" min="0" value="<?php echo esc_attr( $s['payment_days'] ); ?>" class="small-text"<?php disabled( ! $luca ); ?>></td></tr>
     261                </table>
     262                <?php if ( $luca && ! empty( $acc['cogs'] ) ) : ?>
     263                    <p class="description" style="margin-top:6px">Varekost ved salg føres alltid automatisk: debet <span class="lsk-acc"><?php echo esc_html( $acc['cogs'] ); ?></span> / kredit <span class="lsk-acc"><?php echo esc_html( $acc['inventory'] ?? '1460' ); ?></span>.</p>
     264                <?php endif; ?>
     265            </div>
     266
    214267            <p>
    215                 <button type="submit" name="lagersky_save" class="button button-primary">Lagre</button>
     268                <button type="submit" name="lagersky_save" class="button button-primary">Lagre innstillinger</button>
    216269                <button type="submit" name="lagersky_test" class="button">Sjekk lisens på nytt</button>
    217270            </p>
    218271        </form>
    219         <p class="description">Lager, pakker, kontoer og bokføring styres i LagerSky. Denne pluginen sender kun ordredata dit – den har ingen databasetilgang.</p>
    220 
    221         <hr style="margin:28px 0 18px">
    222         <h2 style="margin-top:0">Hent produktene inn i LagerSky</h2>
    223         <p style="max-width:720px">Nytt i LagerSky? Send alle produktene fra nettbutikken dit med ett klikk, så slipper du å legge dem inn på nytt. Det sendes <strong>SKU (blir varenummer), navn, pris eks. mva, lagerantall og GTIN/EAN</strong>. Produkter uten SKU hoppes over.</p>
    224         <p style="max-width:720px"><strong>Ingenting blir overskrevet automatisk.</strong> I LagerSky får du en oversikt: nye produkter legges til, og finnes et produkt fra før med andre verdier, vises endringene i rødt – du velger selv hva som skal oppdateres.</p>
    225         <form method="post" onsubmit="return confirm('Sende alle produkter med SKU til LagerSky for gjennomgang?');">
    226             <?php wp_nonce_field( 'lagersky_import' ); ?>
    227             <button type="submit" name="lagersky_import" class="button button-secondary" <?php disabled( ! $st['ok'] ); ?>>Send produkter til LagerSky</button>
    228             <?php if ( ! $st['ok'] ) : ?><span class="description" style="margin-left:8px">Krever aktiv lisens.</span><?php endif; ?>
    229         </form>
     272
     273        <!-- 4. Produkter -->
     274        <div class="lsk-card">
     275            <h2>4. Hent produktene inn i LagerSky</h2>
     276            <p style="max-width:760px">Nytt i LagerSky? Send alle produktene fra nettbutikken dit med ett klikk, så slipper du å legge dem inn på nytt. Det sendes <strong>SKU (blir varenummer), navn, pris eks. mva, lagerantall og GTIN/EAN</strong>. Produkter uten SKU hoppes over.</p>
     277            <p style="max-width:760px"><strong>Ingenting blir overskrevet automatisk.</strong> I LagerSky får du en oversikt: nye produkter legges til, og finnes et produkt fra før med andre verdier, vises endringene i rødt – du velger selv hva som skal oppdateres.</p>
     278            <form method="post" onsubmit="return confirm('Sende alle produkter med SKU til LagerSky for gjennomgang?');">
     279                <?php wp_nonce_field( 'lagersky_import' ); ?>
     280                <button type="submit" name="lagersky_import" class="button button-secondary" <?php disabled( ! $st['ok'] ); ?>>Send produkter til LagerSky</button>
     281                <?php if ( ! $st['ok'] ) : ?><span class="description" style="margin-left:8px">Krever aktiv lisens.</span><?php endif; ?>
     282            </form>
     283        </div>
     284
     285        <p class="description">Lager, pakker, kontoer og bokføring styres i LagerSky. Pluginen sender bare ordre- og produktdata dit – den har ingen databasetilgang.</p>
    230286
    231287        <div style="text-align:center;margin-top:40px;padding-top:24px;border-top:1px solid #e0e0e0">
    … …  
    323379        'payment_days'   => (int) $s['payment_days'],
    324380        'gross_total'    => round( (float) $order->get_total(), 2 ),
     381        'prepaid_autopost'     => ( $s['prepaid_autopost'] === '1' ),
     382        'payment_method_title' => $order->get_payment_method_title(),
    325383        'billing'        => array(
    326384            'company'     => $order->get_billing_company(),
  • lagersky-for-woocommerce/trunk/readme.txt

    r3717226 r3727767  
    55Tested up to: 7.1
    66Requires PHP: 7.4
    7 Stable tag: 3.2.0
     7Stable tag: 3.3.0
    88License: GPLv2 or later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
    … …  
    2222* Bundles are broken down into their components
    2323* Optional automatic bookkeeping in Luca Regnskap (cost of goods, sales, invoices)
     24* Optional automatic posting of Vipps/MobilePay sales to Luca Regnskap when the order is completed
    2425* Separate settings for prepaid payment methods (for example Vipps)
    2526* License status shown directly on the settings page
    … …  
    3435
    3536* When an order reaches the status you have selected, order data is sent to the LagerSky API (https://www.lagersky.no/api/v1/): order number, order lines (item number/SKU, name, quantity and price) and – if you enable invoicing – billing details (name, company, email, phone and address).
    36 * When you open the settings page or click "Check license", the license key is sent to verify its status.
     37* When you open the settings page or click "Check license", the license key is sent to verify its status, together with whether automatic posting of prepaid (Vipps/MobilePay) sales is switched on.
    3738* When you click "Send products to LagerSky", the product list is sent (SKU, name, price excluding VAT, stock quantity and GTIN/EAN). No customer data is sent.
    3839* If you enable stock sync, the plugin regularly fetches updated stock levels from LagerSky (item number/SKU and quantity) and sets the quantity in WooCommerce.
    … …  
    7576== Changelog ==
    7677
     78= 3.3.0 =
     79* New: settings are grouped into Connection, Orders & stock, Accounting and Products.
     80* New: optional automatic posting of Vipps/MobilePay sales to Luca Regnskap when an order is completed, using the accounts set in LagerSky.
     81* New: accounting options are locked (greyed out) until Luca Regnskap is connected in LagerSky.
     82
    7783= 3.2.0 =
    7884* New: "Send products to LagerSky" button – one-time import of products from the store. Changes to existing products must be approved in LagerSky.
Note: See TracChangeset for help on using the changeset viewer.