Կանխավճար API-ով
Ինչպես ընդունել կանխավճար VCR.AM-ի API-ով՝ կանխավճարի կտրոն, մնացորդի ստուգում, կանխավճարի օգտագործում վաճառքում և վերադարձ։ Օրինակներ TypeScript-ով և PHP-ով։
Երկու կտրոն
Կառավարության 1976-Ն որոշումը նախատեսում է էլեկտրոնային ՀԴՄ-ի կտրոնների երկու տեսակ՝ կանխավճարի կտրոն՝ ապրանքի մատակարարումից կամ ծառայության մատուցումից առաջ ստացված գումարի համար, և սովորական վաճառքի կտրոն (Հավելված 5, կետեր 12–14)։ Կանխավճարն օգտագործող վաճառքում այն արտացոլվում է «կանխավճարի օգտագործում» վճարման տեսակով (Հավելված 5, կետ 18)։ Կանխավճարի կտրոնում ապրանքներ, հանրագումար և ԱԱՀ չկան (Հավելված 7, կետ 2)։
Ուստի կանչերը երկուսն են՝ POST /prepayments, երբ հաճախորդը վճարում է կանխավճարը, և ավելի ուշ POST /sales՝ կանխավճարի գումարը amount.prepayment դաշտում։ ՊԵԿ-ը ստանում է միայն այդ գումարը․ հարցման մեջ ոչինչ վաճառքը չի կապում կոնկրետ կանխավճարի կտրոնի հետ։
VCR.AM-ն այդ կապը պահում է Ձեր փոխարեն՝ յուրաքանչյուր ընկերության մատյանում․ յուրաքանչյուր կանխավճար, օգտագործում և վերադարձ առանձին տող է՝ կապված գնորդի ՀՎՀՀ-ի հետ։ Յուրաքանչյուր կանխավճար վերադարձվում է հաշվարկված remaining և state դաշտերով։
1. Գրանցեք կանխավճարը
Գրանցեք կանխավճարը հենց որ հաճախորդը վճարի։ buyer-ը պարտադիր է՝ ընկերություն իր ՀՎՀՀ-ով կամ ֆիզիկական անձ։
import { VCRClient } from "@blob-solutions/vcr-am-sdk";
const apiKey = process.env.VCR_API_KEY;
if (apiKey === undefined) throw new Error("VCR_API_KEY is not set");
const client = new VCRClient(apiKey);
const prepayment = await client.registerPrepayment({
cashier: { id: 1 },
amount: { nonCash: "5000" },
// A company buyer: the ledger tracks its balance by TIN.
// For a private person: buyer: { type: "individual" }
buyer: { type: "business_entity", tin: "01234567" },
});
// Keep prepayment.prepaymentId: a refund needs it.use BlobSolutions\VcrAm\Input\Buyer;
use BlobSolutions\VcrAm\Input\CashierId;
use BlobSolutions\VcrAm\Input\PrepaymentAmount;
use BlobSolutions\VcrAm\Input\RegisterPrepaymentInput;
use BlobSolutions\VcrAm\VcrClient;
$client = new VcrClient(apiKey: $apiKey);
$prepayment = $client->registerPrepayment(new RegisterPrepaymentInput(
cashier: CashierId::byInternalId(1),
amount: new PrepaymentAmount(nonCash: '5000'),
// For a private person: Buyer::individual()
buyer: Buyer::businessEntity(tin: '01234567'),
));
// Keep $prepayment->prepaymentId: a refund needs it.2. Ստուգեք մնացորդը
Երբ հաճախորդը վերադառնա, ստուգեք նրա բաց մնացորդը այն ՀՎՀՀ-ով, որով նա վճարել է։ Մնացորդը հաշվարկվում է ամբողջ ընկերության համար․ եթե մեկ ՀՎՀՀ-ի տակ մի քանի դրամարկղ կա, գանձապահը կարիք չունի իմանալու, թե որն է ընդունել կանխավճարը։
const balance = await client.getCustomerPrepaymentBalance({
customerRef: "01234567", // the buyer's TIN
});
console.log(balance.balance); // 5000
for (const open of balance.openPrepayments) {
console.log(`Prepayment #${open.prepaymentId}: ${open.remaining} left`);
}$balance = $client->getCustomerPrepaymentBalance('01234567');
echo $balance->balance; // 5000.0
foreach ($balance->openPrepayments as $open) {
printf("Prepayment #%d: %s left\n", $open->prepaymentId, $open->remaining);
}3. Ցանկ և համադրում
Համադրման կամ Ձեր սեփական մատյանի համար ստացեք տվյալ դրամարկղում գրանցված կանխավճարների ցանկը։ Զտեք ըստ customerRef-ի (գնորդի ՀՎՀՀ) կամ ըստ state-ի։
const open = await client.listPrepayments({ state: "open" });
const forCustomer = await client.listPrepayments({ customerRef: "01234567" });use BlobSolutions\VcrAm\PrepaymentState;
$open = $client->listPrepayments(state: PrepaymentState::Open);
$forCustomer = $client->listPrepayments(customerRef: '01234567');Endpoint-ը վերադարձնում է առավելագույնը 500 վերջին կանխավճարները, և state-ը կիրառվում է այդ 500-ի ներսում։ Ակտիվ դրամարկղում ավելի հին կանխավճարներին հասնելու համար զտեք ըստ customerRef-ի։
4. Օգտագործեք կանխավճարը վաճառքում
Կանխավճարի օգտագործումը սովորական վաճառք է՝ amount-ում prepayment գումարով, անհրաժեշտության դեպքում cash-ի, nonCash-ի կամ compensation-ի հետ միասին։ Վճարումների գումարը պետք է հավասար լինի վաճառքի գումարին․ կտրոնը չի կարող գնի մի մասը թողնել չվճարված։
const sale = await client.registerSale({
cashier: { id: 1 },
buyer: { type: "business_entity", tin: "01234567" },
// 5,000 from the advance, the remaining 10,000 paid now by card.
amount: { prepayment: "5000", nonCash: "10000" },
items: [
{
offer: { externalId: "legal-service" },
quantity: "1",
price: "15000",
unit: "pc",
},
],
});use BlobSolutions\VcrAm\Input\Offer;
use BlobSolutions\VcrAm\Input\RegisterSaleInput;
use BlobSolutions\VcrAm\Input\SaleAmount;
use BlobSolutions\VcrAm\Input\SaleItem;
use BlobSolutions\VcrAm\Unit;
$sale = $client->registerSale(RegisterSaleInput::withAmount(
cashier: CashierId::byInternalId(1),
items: [
new SaleItem(
offer: Offer::existing('legal-service'),
quantity: '1',
price: '15000',
unit: Unit::Piece,
),
],
// 5,000 from the advance, the remaining 10,000 paid now by card.
amount: new SaleAmount(prepayment: '5000', nonCash: '10000'),
buyer: Buyer::businessEntity(tin: '01234567'),
));Եթե գնորդը ընկերություն է, մատյանը գումարը դուրս է գրում այդ ՀՎՀՀ-ի բաց կանխավճարներից՝ սկսելով ամենահնից։
Եթե կանխավճարը վերաբերում է կոնկրետ պատվերի, նշեք այն prepaymentId-ով։ Այդ դեպքում վաճառքը կծախսի հենց այդ կանխավճարը և չի դիպչի մյուսներին, ուստի դրանք դեռ հնարավոր կլինի վերադարձնել։ Սա աշխատում է նաև ֆիզիկական անձ գնորդների համար։
const sale = await client.registerSale({
cashier: { id: 1 },
buyer: { type: "individual" },
amount: { prepayment: "15000" },
// The prepayment taken for this order.
prepaymentId: prepayment.prepaymentId,
items: [
{
offer: { externalId: "legal-service" },
quantity: "1",
price: "15000",
unit: "pc",
},
],
});$sale = $client->registerSale(RegisterSaleInput::withAmount(
cashier: CashierId::byInternalId(1),
items: [
new SaleItem(
offer: Offer::existing('legal-service'),
quantity: '1',
price: '15000',
unit: Unit::Piece,
),
],
amount: new SaleAmount(prepayment: '15000'),
buyer: Buyer::individual(),
// The prepayment taken for this order.
prepaymentId: $prepayment->prepaymentId,
));Եթե կանխավճարը չի ծածկում amount.prepayment-ը, վաճառքը մերժվում է 400 կոդով՝ նախքան ՊԵԿ ուղարկելը․ կանխավճարը վերադարձված է, հասանելի գումարը քիչ է, կամ այն պատկանում է այլ ՀՎՀՀ-ի։ Ոչինչ չի պահպանվում, ուստի ուղարկեք ուղղված վաճառքը նոր Idempotency-Key-ով։ Անհայտ համարի դեպքում պատասխանը 404 է։ Քանի դեռ վաճառքը սպասում է ՊԵԿ-ի պատասխանին, դրա գումարը ամրագրված է․ մեկ այլ վաճառք այն չի վերցնի, իսկ այդ կանխավճարի վերադարձը կպատասխանի 409, մինչև վաճառքն ավարտվի։
prepaymentId նշված չէ, մատյանը չի կարող որոշել, թե ում կանխավճարն է ծախսվում, և այն դուրս է գրում ընկերության ամենահին բաց կանխավճարից, ով էլ որ այն վճարած լինի։ Կտրոնը ճիշտ է, բայց VCR.AM-ում remaining մնացորդները՝ ոչ, և այդ ավելի հին կանխավճարն այլևս հնարավոր չէ վերադարձնել։ Նշեք կանխավճարը հստակ։prepaymentId-ի ո՛չ ՊԵԿ-ը, ո՛չ VCR.AM-ը չեն մերժում հաճախորդի բաց մնացորդից մեծ prepayment գումարը։ Վաճառքը կանցնի, իսկ մատյանում դրա տողը կնշվի needsReview անձնական էջում։ Վաճառքից առաջ կանչեք getCustomerPrepaymentBalance-ը։5. Վերադարձ
Վերադարձը հետ է տալիս ամբողջ կանխավճարը, իսկ returnRemainder: true-ի դեպքում՝ վաճառքներից հետո մնացած ամբողջ գումարը։ Հարցումում նշվում են կանխավճարի համարը և պատճառը, բայց ոչ գումարը։
await client.registerPrepaymentRefund({
cashier: { id: 1 },
prepaymentId: prepayment.prepaymentId,
reason: "customer_request",
});use BlobSolutions\VcrAm\Input\RegisterPrepaymentRefundInput;
use BlobSolutions\VcrAm\RefundReason;
$client->registerPrepaymentRefund(new RegisterPrepaymentRefundInput(
cashier: CashierId::byInternalId(1),
prepaymentId: $prepayment->prepaymentId,
reason: RefundReason::CustomerRequest,
));409 կոդով, և ոչինչ չի պահպանվում։ Մնացորդը վերադարձնելու համար ուղարկեք returnRemainder: true․ եթե վաճառքներն օգտագործել են ամբողջը, պատասխանը կլինի 400։ Կանխավճարն ունի մեկ վերադարձ, ուստի մնացորդը վերադարձվում է ամբողջությամբ՝ նույն վճարման եղանակներով։ Դրանից հետո կանխավճարի կտրոնը ցույց է տալիս մնացորդը և Հավելված 5-ի 15-րդ կետով պահանջվող գրառումը։ Վաճառքի վերադարձը օգտագործված կանխավճարը չի վերականգնում։await client.registerPrepaymentRefund({
cashier: { id: 1 },
prepaymentId: prepayment.prepaymentId,
returnRemainder: true,
reason: "customer_request",
});$client->registerPrepaymentRefund(new RegisterPrepaymentRefundInput(
cashier: CashierId::byInternalId(1),
prepaymentId: $prepayment->prepaymentId,
returnRemainder: true,
reason: RefundReason::CustomerRequest,
));Կանխավճարի վիճակները
Ցանկի և մանրամասն պատասխանի յուրաքանչյուր կանխավճար ունի հաշվարկված state դաշտ։
| Վիճակ | Նշանակություն | Անցնում է |
|---|---|---|
| open | remaining-ը զրոյից մեծ է | consumed, երբ վաճառքներն օգտագործեն ամբողջ գումարը․ refunded՝ վերադարձից հետո |
| consumed | remaining-ը զրո է, վերադարձ չի եղել | Վերջնական |
| refunded | Վերադարձ է գրանցվել | Վերջնական |
Մինչև VCR.AM-ը ստացված կանխավճարներ
Մինչև VCR.AM-ի հետ աշխատելը ստացված կանխավճարները կարելի է ավելացնել մատյանում անձնական էջի ընկերության բաժնից («Ներմուծել գոյություն ունեցող կանխավճար»)։ Ներմուծումը ՊԵԿ-ին չի դիմում։ Ներմուծված գումարները երևում են միայն անձնական էջում․ API-ով մնացորդի ստուգումը և վաճառքների ավտոմատ դուրսգրումը դրանք չեն տեսնում։ Ներմուծման համար API endpoint չկա։