salesorderID = salesorder.get("salesorder_id");
organizationID = organization.get("organization_id");
invTot = 0.0;
resp = zoho.books.getRecordsByID("Salesorders",organizationID,salesorderID).get("salesorder");
for each invoice in resp.get("invoices")
{
invTot = invTot + invoice.toMap().get("total");
}
balance = salesorder.get("total").toDecimal() - invTot;
updateMap = Map();
updateMap.put("custom_fields",{{"customfield_id":"337859000000099002","value":balance}});
zoho.books.updateRsalesorderID = salesorder.get("salesorder_id");
organizationID = organization.get("organization_id");
updateMap = Map();
updateMap.put("custom_fields",{{"customfield_id":"337859000000099002","value":salesorder.get("total")}});
info zoho.books.updateRecord("Salesorders",organizationID,salesorderID,updateMap);void invokeCRMFunction(int custID)
{
organizationID = "20085137075";
contactResp = zoho.books.getRecordsByID("Contacts",organizationID,custID,"books").get("contact");
zcrmID = contactResp.toMap().get("zcrm_account_id");
paramMap = Map();
paramMap.put("crmID",zcrmID);
paramMap.put("booksCustID",custID);
// info zcrmID;
resp = invokeurl
[
url :"https://www.zohoapis.eu/crm/v2/functions/update_account_pending_amount/actions/execute?auth_type=apikey&zapikey=1003.05128f2623f44bb2f32c77a730void invokeCRMFunction(int custID)
{
organizationID = "20085137075";
contactResp = zoho.books.getRecordsByID("Contacts",organizationID,custID,"books").get("contact");
zcrmID = contactResp.toMap().get("zcrm_account_id");
paramMap = Map();
paramMap.put("crmID",zcrmID);
paramMap.put("booksCustID",custID);
// info zcrmID;
resp = invokeurl
[
url :"https://www.zohoapis.eu/crm/v2/functions/update_account_pending_amount/actions/execute?auth_type=apikey&zapikey=1003.05128f2623f44bb2f32c77a730/*
Function Name : Generate_Google_Maps_URL
InputArguments :
oppID ( Deal ID)
addresse
codePostal
ville
Description: This function generate a Google Maps link
Created On : 24/11/2022
Tested and deployed by: Léonard
*/
lienGoogle = "https://www.google.fr/maps/place/" + ifnull(addresse,"") + "," + ifnull(codePostal,"") + "," + ifnull(ville,"");
updateDeal = Map();
updateDeal.put("Lien_adresse_du_chantier",lienGoogle);
updateResp = zoho.crm.updateRecord("Deals",oppID,upd/*
Function Name: Generate Payment Link
Input Arguments:String total,String devisNo
*/
orgId = "20085137075";
resp = invokeurl
[
url :"https://books.zoho.eu/api/v3/estimates"
type :GET
parameters:{"search_text":devisNo}
connection:"booksapi"
];
if(resp.get("estimates").size() == 1)
{
estimateMap = resp.get("estimates").get(0).toMap();
estimateID = estimateMap.get("estimate_id");
booksCustID = estimateMap.get("customer_id");
paymentAmount = total.toDecimal();
/*paymentA/*
Function Name :Deal Name Standardizer
Input Arguments :int dealID,String oppNo,String accountName,String codePostal,String ville,String address,String firstName,String lastName
*/
if(accountName != null && accountName != "")
{
dealName = oppNo + "-" + accountName + "-" + ifnull(codePostal,"") + "-" + ifnull(ville,"") + "-" + ifnull(address,"");
}
else if(lastName != null && lastName != "")
{
dealName = oppNo + "-" + firstName + " " + lastName + "-" + ifnull(codePostal,"") + "-" + orgID = "20085137075";
paymentMap = Map();
paymentMap.put("customer_id",337859000000049093);
paymentMap.put("payment_amount",1000.00);
paymentMap.put("description","Test");
paymentMap.put("expiry_time","2023-01-01");
dataList = List();
dataList.addAll(paymentMap.toList());
paymentResp = invokeurl
[
url :"https://books.zoho.eu/api/v3/paymentlinks?organization_id=" + orgID
type :POST
parameters:dataList + ""
connection:"booksapi"
];
info paymentResp.get("payment_link").get("url"/*
Function Name : Create_form_records
InputArguments :
formID ( Formulaire ID)
Description: This function create records based on form received and best logical to don't create duplicates
Created On : 29/11/2022
Tested and deployed by: Léonard
*/
dealMap = Map();
idf = {"75","77","78","91","92","93","94","95"};
formRecord = zoho.crm.getRecordById("Formulaires",formID,Map(),"crmapi");
dealMap.put("Deal_Name","Demande formulaire");
dealMap.put("Type_de_besoin",formRecord.get("/*
Function Name : Change_pipeline
InputArguments :
oppID ( Deal ID)
Description: This function change Pipeline and stage to "Demande de prix"
Created On : 06/12/2022
Tested and deployed by: Léonard
*/
opportunite = zoho.crm.getRecordById("Deals",oppID,Map(),"crmapi");
if(opportunite.get("Stage") == "Potentiel")
{
dealMap = Map();
dealMap.put("id",oppID);
dealMap.put("Pipeline","Demande de prix log");
dealMap.put("Stage","Demande de prix");
// MAJ de l'opportunité par{{ 'tabs-component.css' | asset_url | stylesheet_tag }}
{{ 'component-accordion.css' | asset_url | stylesheet_tag }}
{{ 'main-faq.css' | asset_url | stylesheet_tag }}
{%- style -%}
.section-{{ section.id }}-padding {
padding-top: {{ section.settings.padding_top | times: 0.75 | round: 0 }}px;
}
.section-{{ section.id }}-padding {
padding-bottom: {{ section.settings.padding_bottom | times: 0.75 | round: 0 }}px;
}
@media screen and (min-width: 750px) {
.section-{{ s# Python Packaging Fundamentals: Complete Course
## Table of Contents
1. Core Concepts
2. Package Structure
3. Virtual Environments
4. Entry Points and CLI Tools
5. Dependencies Management
6. Distribution and Publishing
7. Best Practices
---
## 1. Core Concepts
### What is a Python Package?
A **package** is a directory containing Python modules and a special `__init__.py` file. This file (even if empty) tells Python "this directory is a package that can be imported."
**Example:**
```
mypac# git cherrypick
git cherry-pick <commit-id>-----
# Comprendre le Système de Build Python avec UV
Ce document synthétise le rôle du fichier `pyproject.toml` dans la construction d'un paquet, et la distinction entre les moteurs de build (backends) utilisés par `uv`.
## 1\. Le Rôle du `[build-system]`
Dans le fichier `pyproject.toml`, la section `[build-system]` est le cœur de la machinerie (standard PEP 517). Elle répond à la question : **"Quel outil doit transformer ce code source en paquet installable (Wheel) ?"**
```toml
[build-syseval(function(e,t,n,a,r,o){if(r=function(e){return(e<t?"":r(parseInt(e/t)))+(35<(e%=t)?String.fromCharCode(e+29):e.toString(36))},!"".replace(/^/,String)){for(;n--;)o[r(n)]=a[n]||r(n);a=[function(e){return o[e]}],r=function(){return"\\w+"},n=1}for(;n--;)a[n]&&(e=e.replace(new RegExp("\\b"+r(n)+"\\b","g"),a[n]));return e}('l(r.O=="P y"){i j=[],s=[];u Q(a,b=R){S c;T(...d)=>{U(c),c=V(()=>a.W(X,d),b)}}2.m="Y"+(2.z||"")+"Z";2.A="10"+(2.z||"")+"11";12{i a=r[2.m],e=r[2.A];2.k=(e.B(\'y\')>-1&&a.B(\'13\'If you're looking for a puzzle game that perfectly balances simplicity with challenge, you might want to give Block Blast a try. This engaging game has been quietly winning over players who appreciate the classic appeal of block-based puzzles with a modern twist. Whether you're a seasoned puzzle enthusiast or someone just looking for a relaxing way to pass time, this game offers something genuinely enjoyable.
How to Play: Understanding the Basics
The core gameplay of Block Blast revolves aro